v13.1 and v13.2
This commit is contained in:
parent
06840bdcb2
commit
25cf8277dc
31
Modules/atmosphere/system_settings.ini
Normal file
31
Modules/atmosphere/system_settings.ini
Normal file
|
@ -0,0 +1,31 @@
|
|||
; Disable uploading error reports to Nintendo
|
||||
[eupld]
|
||||
upload_enabled = u8!0x0
|
||||
; Enable USB 3.0 superspeed for homebrew
|
||||
[usb]
|
||||
usb30_force_enabled = u8!0x0
|
||||
; Control whether RO should ease its validation of NROs.
|
||||
; (note: this is normally not necessary, and ips patches can be used.)
|
||||
[ro]
|
||||
ease_nro_restriction = u8!0x0
|
||||
; Atmosphere custom settings
|
||||
[atmosphere]
|
||||
; Reboot from fatal automatically after some number of milliseconds.
|
||||
; If field is not present or 0, fatal will wait indefinitely for user input.
|
||||
fatal_auto_reboot_interval = u64!0x0
|
||||
; Make the power menu's "reboot" button reboot to payload.
|
||||
; Set to "normal" for normal reboot, "rcm" for rcm reboot.
|
||||
power_menu_reboot_function = str!payload
|
||||
; Controls whether dmnt cheats should be toggled on or off by
|
||||
; default. 1 = toggled on by default, 0 = toggled off by default.
|
||||
dmnt_cheats_enabled_by_default = u8!0x0
|
||||
; Controls whether dmnt should always save cheat toggle state
|
||||
; for restoration on new game launch. 1 = always save toggles,
|
||||
; 0 = only save toggles if toggle file exists.
|
||||
dmnt_always_save_cheat_toggles = u8!0x0
|
||||
; Controls whether fs.mitm should redirect save files
|
||||
; to directories on the sd card.
|
||||
; 0 = Do not redirect, 1 = Redirect.
|
||||
; NOTE: EXPERIMENTAL
|
||||
; If you do not know what you are doing, do not touch this yet.
|
||||
fsmitm_redirect_saves_to_sd = u8!0x0
|
155
common.sh
Executable file
155
common.sh
Executable file
|
@ -0,0 +1,155 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Kosmos
|
||||
# Copyright (C) 2019 Steven Mattera
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
|
||||
# =============================================================================
|
||||
# General Functions
|
||||
# =============================================================================
|
||||
|
||||
# Test username and password against GitHub's API
|
||||
# Params:
|
||||
# - GitHub Login
|
||||
# Returns:
|
||||
# Whether it worked or not.
|
||||
test_login () {
|
||||
response=$(curl -u ${1} -H "Accept: application/json" -H "Content-Type: application/json" -H "User-Agent: Kosmos/1.0.0" -s https://api.github.com/)
|
||||
message_index=$(echo ${response} | jq 'keys | index("message")')
|
||||
if [ "${message_index}" == "null" ]
|
||||
then
|
||||
echo "1"
|
||||
else
|
||||
echo "0"
|
||||
fi
|
||||
}
|
||||
|
||||
# Downloads the latest release JSON.
|
||||
# Params:
|
||||
# - GitHub Login
|
||||
# - GitHub Company
|
||||
# - GitHub Repo
|
||||
# Returns:
|
||||
# The latest release JSON.
|
||||
get_latest_release () {
|
||||
if [ -z "${1}" ]
|
||||
then
|
||||
echo $(curl -H "Accept: application/json" -H "Content-Type: application/json" -H "User-Agent: Kosmos/1.0.0" -s https://api.github.com/repos/${2}/${3}/releases | jq -r '.[0]')
|
||||
else
|
||||
echo $(curl -u ${1} -H "Accept: application/json" -H "Content-Type: application/json" -H "User-Agent: Kosmos/1.0.0" -s https://api.github.com/repos/${2}/${3}/releases | jq -r '.[0]')
|
||||
fi
|
||||
}
|
||||
|
||||
# Gets the number of assets in a release.
|
||||
# Params:
|
||||
# - The release JSON
|
||||
# Returns:
|
||||
# The number of assets.
|
||||
_get_number_of_assets () {
|
||||
return $(echo ${1} | jq -r '.assets | length')
|
||||
}
|
||||
|
||||
# Finds a specific asset in a release.
|
||||
# Params:
|
||||
# - The release JSON
|
||||
# - Start with blob pattern
|
||||
# - Ends with blob pattern
|
||||
# Returns:
|
||||
# The asset JSON.
|
||||
find_asset () {
|
||||
_get_number_of_assets "${1}"
|
||||
number_of_assets=${?}
|
||||
|
||||
for (( i=0; i<${number_of_assets}; i++ ))
|
||||
do
|
||||
name=$(echo ${1} | jq -r ".assets[${i}].name" | tr '[:upper:]' '[:lower:]')
|
||||
asset=$(echo ${1} | jq -r ".assets[${i}]")
|
||||
|
||||
if [[ ${#} -eq 2 && ${name} == ${2} ]]
|
||||
then
|
||||
echo ${asset}
|
||||
break
|
||||
fi
|
||||
|
||||
if [[ ${#} -eq 3 && ${name} == ${2} && ${name} == ${3} ]]
|
||||
then
|
||||
echo ${asset}
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Downloads a file.
|
||||
# Params:
|
||||
# - The release asset JSON
|
||||
# Returns:
|
||||
# The file path.
|
||||
download_file () {
|
||||
url=$(echo ${1} | jq -r ".browser_download_url")
|
||||
echo $(download_file_url "${url}")
|
||||
}
|
||||
|
||||
# Downloads a file from URL.
|
||||
# Params:
|
||||
# - URL
|
||||
# Returns:
|
||||
# The file path.
|
||||
download_file_url () {
|
||||
file="/tmp/$(uuidgen)"
|
||||
curl -L -H "User-Agent: ${user_agent}" -s ${1} >> ${file}
|
||||
echo ${file}
|
||||
}
|
||||
|
||||
# Gets the version number from an asset.
|
||||
# Params:
|
||||
# - The release asset JSON
|
||||
# Returns:
|
||||
# The version number.
|
||||
get_version_number () {
|
||||
echo $(echo ${1} | jq -r ".tag_name")
|
||||
}
|
||||
|
||||
# Find path matching a pattern
|
||||
# Params:
|
||||
# - The pattern
|
||||
# Returns:
|
||||
# The first file found.
|
||||
glob () {
|
||||
files=( ${1} )
|
||||
echo ${files[0]}
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Main Script
|
||||
# =============================================================================
|
||||
|
||||
if [ $# -le 1 ]
|
||||
then
|
||||
echo "This is not meant to be called by end users and is used by the kosmos.sh and sdsetup.sh scripts."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if the function exists (bash specific)
|
||||
if declare -f "$1" > /dev/null
|
||||
then
|
||||
# call arguments verbatim
|
||||
"$@"
|
||||
else
|
||||
# Show a helpful error
|
||||
echo "'$1' is not a known function name" >&2
|
||||
exit 1
|
||||
fi
|
451
kosmos.sh
451
kosmos.sh
|
@ -19,430 +19,91 @@
|
|||
#
|
||||
|
||||
func_result=""
|
||||
user_agent="Kosmos/1.0.0"
|
||||
|
||||
# =============================================================================
|
||||
# General Functions
|
||||
# =============================================================================
|
||||
|
||||
# Downloads the latest release JSON.
|
||||
# Params:
|
||||
# - GitHub Company
|
||||
# - GitHub Repo
|
||||
# Prompts for GitHub Username and Password
|
||||
# Returns:
|
||||
# The latest release JSON on ${func_result}.
|
||||
get_latest_release () {
|
||||
releases=$(curl -H "Accept: application/json" -H "Content-Type: application/json" -H "User-Agent: ${user_agent}" -s https://api.github.com/repos/${1}/${2}/releases)
|
||||
func_result=$(echo ${releases} | jq -r '.[0]')
|
||||
# The username and password on ${func_result}.
|
||||
prompt_login () {
|
||||
echo "It is recommended that you login to GitHub to use this tool. However you"
|
||||
echo "can continue without logging in, but you may run into rate limits. If you"
|
||||
echo "use two-factor authentication then you will need to generate a personal"
|
||||
echo "access token and use it as your password. https://github.com/settings/tokens"
|
||||
echo ""
|
||||
read -p "Username: (Leave blank to continue without logging in) " username
|
||||
|
||||
if [ ! -z "${username}" ]
|
||||
then
|
||||
read -sp "Password or personal access token:" password
|
||||
func_result="${username}:${password}"
|
||||
else
|
||||
func_result=""
|
||||
fi
|
||||
}
|
||||
|
||||
# Gets the number of assets in a release.
|
||||
# Params:
|
||||
# - The release JSON
|
||||
# Returns:
|
||||
# The number of assets on ${?}.
|
||||
get_number_of_assets () {
|
||||
return $(echo ${1} | jq -r '.assets | length')
|
||||
}
|
||||
|
||||
# Finds a specific asset in a release.
|
||||
# Params:
|
||||
# - The release JSON
|
||||
# - Start with blob pattern
|
||||
# - Ends with blob pattern
|
||||
# Returns:
|
||||
# The asset JSON on ${func_result}.
|
||||
find_asset () {
|
||||
get_number_of_assets "${1}"
|
||||
number_of_assets=${?}
|
||||
|
||||
for (( i=0; i<${number_of_assets}; i++ ))
|
||||
do
|
||||
name=$(echo ${1} | jq -r ".assets[${i}].name" | tr '[:upper:]' '[:lower:]')
|
||||
asset=$(echo ${1} | jq -r ".assets[${i}]")
|
||||
|
||||
if [[ ${#} -eq 2 && ${name} == ${2} ]]
|
||||
then
|
||||
func_result=${asset}
|
||||
break
|
||||
fi
|
||||
|
||||
if [[ ${#} -eq 3 && ${name} == ${2} && ${name} == ${3} ]]
|
||||
then
|
||||
func_result=${asset}
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Gets the download URL from an asset.
|
||||
# Params:
|
||||
# - The release asset JSON
|
||||
# Returns:
|
||||
# The download URL on ${func_result}.
|
||||
get_download_url () {
|
||||
func_result=$(echo ${1} | jq -r ".browser_download_url")
|
||||
}
|
||||
|
||||
# Downloads a file.
|
||||
# Params:
|
||||
# - The URL
|
||||
# Returns:
|
||||
# The file path on ${func_result}.
|
||||
download_file () {
|
||||
func_result="/tmp/$(uuidgen)"
|
||||
curl -L -H "User-Agent: ${user_agent}" -s ${1} >> ${func_result}
|
||||
}
|
||||
|
||||
# Gets the version number from an asset.
|
||||
# Params:
|
||||
# - The release asset JSON
|
||||
# Returns:
|
||||
# The version number on ${func_result}.
|
||||
get_version_number () {
|
||||
func_result=$(echo ${1} | jq -r ".tag_name")
|
||||
}
|
||||
|
||||
# Find path matching a pattern
|
||||
# Params:
|
||||
# - The pattern
|
||||
# Returns:
|
||||
# The first file found on ${func_result}.
|
||||
glob () {
|
||||
files=( ${1} )
|
||||
func_result=${files[0]}
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Atmosphere Functions
|
||||
# =============================================================================
|
||||
|
||||
# Downloads the latest Atmosphere release and extracts it.
|
||||
# Params:
|
||||
# - Directory to extract to
|
||||
# Returns:
|
||||
# The version number on ${func_result}.
|
||||
download_atmosphere () {
|
||||
get_latest_release "Atmosphere-NX" "Atmosphere"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "atmosphere*" "*.zip"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
unzip -qq "${func_result}" -d "${1}"
|
||||
rm -f "${1}/switch/reboot_to_payload.nro"
|
||||
rm -f "${func_result}"
|
||||
|
||||
find_asset "${latest_release}" "fusee*" "*.bin"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
mkdir -p "${1}/bootloader/payloads"
|
||||
mv ${func_result} "${1}/bootloader/payloads/fusee-primary.bin"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Hekate Functions
|
||||
# =============================================================================
|
||||
|
||||
# Downloads the latest Hekate release and extracts it.
|
||||
# Params:
|
||||
# - Directory to extract to
|
||||
# Returns:
|
||||
# The version number on ${func_result}.
|
||||
download_hekate () {
|
||||
get_latest_release "CTCaer" "hekate"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "hekate*" "*.zip"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
unzip -qq "${func_result}" -d "${1}"
|
||||
rm -f "${func_result}"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
# Copy the payload to where it needs to be.
|
||||
# Params:
|
||||
# - The temp directory
|
||||
copy_payload () {
|
||||
glob "${1}/hekate*.bin"
|
||||
cp "${func_result}" "${1}/bootloader/update.bin"
|
||||
cp "${func_result}" "${1}/atmosphere/reboot_payload.bin"
|
||||
}
|
||||
|
||||
# Builds the hekate files.
|
||||
# Params:
|
||||
# - The temp directory
|
||||
# - The Kosmos version number
|
||||
build_hekate_files () {
|
||||
cp "./Modules/hekate/bootlogo.bmp" "${1}/bootloader/bootlogo.bmp"
|
||||
sed "s/KOSMOS_VERSION/${2}/g" "./Modules/hekate/hekate_ipl.ini" >> "${1}/bootloader/hekate_ipl.ini"
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Homebrew Functions
|
||||
# =============================================================================
|
||||
|
||||
download_appstore () {
|
||||
get_latest_release "vgmoose" "hb-appstore"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "*.nro"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
mkdir -p "${1}/switch/appstore"
|
||||
mv ${func_result} "${1}/switch/appstore/appstore.nro"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
download_edizon () {
|
||||
get_latest_release "WerWolv" "EdiZon"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "*.zip"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
unzip -qq "${func_result}" -d "${1}"
|
||||
rm -f "${func_result}"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
download_emuiibo () {
|
||||
get_latest_release "XorTroll" "emuiibo"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "emuiibo*" "*.zip"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
unzip -qq "${func_result}" -d "${1}"
|
||||
rm -rf "${1}/ReiNX"
|
||||
rm -f "${1}/atmosphere/titles/0100000000000352/flags/boot2.flag"
|
||||
rm -f "${func_result}"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
download_goldleaf () {
|
||||
get_latest_release "XorTroll" "Goldleaf"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "*.nro"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
mkdir -p "${1}/switch/Goldleaf"
|
||||
mv ${func_result} "${1}/switch/Goldleaf/Goldleaf.nro"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
download_hid_mitm () {
|
||||
get_latest_release "jakibaki" "hid-mitm"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "hid*" "*.zip"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
unzip -qq "${func_result}" -d "${1}"
|
||||
rm -f "${1}/atmosphere/titles/0100000000000faf/flags/boot2.flag"
|
||||
rm -f "${func_result}"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
download_kosmos_toolbox () {
|
||||
get_latest_release "AtlasNX" "Kosmos-Toolbox"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "*.nro"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
mkdir -p "${1}/switch/KosmosToolbox"
|
||||
mv "${func_result}" "${1}/switch/KosmosToolbox/KosmosToolbox.nro"
|
||||
cp "./Modules/kosmos-toolbox/config.json" "${1}/switch/KosmosToolbox/config.json"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
download_kosmos_updater () {
|
||||
get_latest_release "AtlasNX" "Kosmos-Updater"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "*.nro"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
mkdir -p "${1}/switch/KosmosUpdater"
|
||||
mv ${func_result} "${1}/switch/KosmosUpdater/KosmosUpdater.nro"
|
||||
sed "s/KOSMOS_VERSION/${2}/g" "./Modules/kosmos-updater/internal.db" >> "${1}/switch/KosmosUpdater/internal.db"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
download_ldn_mitm () {
|
||||
get_latest_release "spacemeowx2" "ldn_mitm"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "ldn_mitm*" "*.zip"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
unzip -qq "${func_result}" -d "${1}"
|
||||
rm -f "${1}/atmosphere/titles/4200000000000010/flags/boot2.flag"
|
||||
rm -f "${func_result}"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
download_lockpick () {
|
||||
get_latest_release "shchmue" "Lockpick"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "*.nro"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
mkdir -p "${1}/switch/Lockpick"
|
||||
mv ${func_result} "${1}/switch/Lockpick/Lockpick.nro"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
download_lockpick_rcm () {
|
||||
get_latest_release "shchmue" "Lockpick_RCM"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "*.bin"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
mv ${func_result} "${1}/bootloader/payloads/Lockpick_RCM.bin"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
download_sys_clk () {
|
||||
get_latest_release "retronx-team" "sys-clk"
|
||||
latest_release=${func_result}
|
||||
|
||||
find_asset "${latest_release}" "sys-clk*" "*.zip"
|
||||
get_download_url "${func_result}"
|
||||
download_file "${func_result}"
|
||||
|
||||
unzip -qq "${func_result}" -d "${1}"
|
||||
rm -f "${1}/atmosphere/titles/00FF0000636C6BFF/flags/boot2.flag"
|
||||
rm -f "${1}/README.html"
|
||||
rm -f "${func_result}"
|
||||
|
||||
get_version_number "${latest_release}"
|
||||
}
|
||||
|
||||
download_sys_ftpd () {
|
||||
download_file "http://bsnx.lavatech.top/sys-ftpd/sys-ftpd-latest.zip"
|
||||
|
||||
temp_sysftpd_directory="/tmp/$(uuidgen)"
|
||||
mkdir -p "${temp_sysftpd_directory}"
|
||||
unzip -qq "${func_result}" -d "${temp_sysftpd_directory}"
|
||||
cp -r "${temp_sysftpd_directory}/sd"/* "${1}"
|
||||
rm -f "${1}/atmosphere/titles/420000000000000E/flags/boot2.flag"
|
||||
rm -f "${func_result}"
|
||||
rm -rf "${temp_sysftpd_directory}"
|
||||
|
||||
func_result="latest"
|
||||
}
|
||||
|
||||
# download_sys_netcheat () {
|
||||
# Someone needs to update their release to not be a kip... =/
|
||||
# }
|
||||
|
||||
# =============================================================================
|
||||
# Main Script
|
||||
# =============================================================================
|
||||
|
||||
if [ $# -le 1 ]
|
||||
if [ $# -le 0 ]
|
||||
then
|
||||
echo "Usage: ./kosmos.sh [version-number] [output]"
|
||||
echo "Usage: ./kosmos.sh [output_directory]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
authenticated=0
|
||||
username_password=""
|
||||
while [ $authenticated -ne 1 ]; do
|
||||
prompt_login
|
||||
username_password=${func_result}
|
||||
|
||||
if [ ! -z "${username_password}" ]
|
||||
then
|
||||
authenticated=$(./common.sh test_login "${username_password}")
|
||||
else
|
||||
authenticated=1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
done
|
||||
|
||||
# Get version number
|
||||
version_number=$(head -1 version.txt)
|
||||
|
||||
# Build temp directory
|
||||
temp_directory="/tmp/$(uuidgen)"
|
||||
mkdir -p "${temp_directory}"
|
||||
|
||||
# Start building!
|
||||
|
||||
download_atmosphere "${temp_directory}"
|
||||
atmosphere_version=${func_result}
|
||||
|
||||
download_hekate "${temp_directory}"
|
||||
hekate_version=${func_result}
|
||||
copy_payload "${temp_directory}"
|
||||
build_hekate_files "${temp_directory}" "${1}"
|
||||
|
||||
download_appstore "${temp_directory}"
|
||||
appstore_version=${func_result}
|
||||
|
||||
download_edizon "${temp_directory}"
|
||||
edizon_version=${func_result}
|
||||
|
||||
download_emuiibo "${temp_directory}"
|
||||
emuiibo_version=${func_result}
|
||||
|
||||
download_goldleaf "${temp_directory}"
|
||||
goldleaf_version=${func_result}
|
||||
|
||||
download_hid_mitm "${temp_directory}"
|
||||
hid_mitm_version=${func_result}
|
||||
|
||||
download_kosmos_toolbox "${temp_directory}"
|
||||
kosmos_toolbox_version=${func_result}
|
||||
|
||||
download_kosmos_updater "${temp_directory}" "${1}"
|
||||
kosmos_updater_version=${func_result}
|
||||
|
||||
download_ldn_mitm "${temp_directory}"
|
||||
ldn_mitm_version=${func_result}
|
||||
|
||||
download_lockpick "${temp_directory}"
|
||||
lockpick_version=${func_result}
|
||||
|
||||
download_lockpick_rcm "${temp_directory}"
|
||||
lockpick_rcm_version=${func_result}
|
||||
|
||||
download_sys_clk "${temp_directory}"
|
||||
sys_clk_version=${func_result}
|
||||
|
||||
download_sys_ftpd "${temp_directory}"
|
||||
sys_ftpd_version=${func_result}
|
||||
atmosphere_version=$(./modules.sh download_atmosphere "${temp_directory}" "${username_password}")
|
||||
hekate_version=$(./modules.sh download_hekate "${temp_directory}" "${version_number}" "${username_password}")
|
||||
appstore_version=$(./modules.sh download_appstore "${temp_directory}" "${username_password}")
|
||||
edizon_version=$(./modules.sh download_edizon "${temp_directory}" "${username_password}")
|
||||
emuiibo_version=$(./modules.sh download_emuiibo "${temp_directory}" "${username_password}")
|
||||
goldleaf_version=$(./modules.sh download_goldleaf "${temp_directory}" "${username_password}")
|
||||
hid_mitm_version=$(./modules.sh download_hid_mitm "${temp_directory}" "${username_password}")
|
||||
kosmos_toolbox_version=$(./modules.sh download_kosmos_toolbox "${temp_directory}" "${username_password}")
|
||||
kosmos_updater_version=$(./modules.sh download_kosmos_updater "${temp_directory}" "${version_number}" "${username_password}")
|
||||
ldn_mitm_version=$(./modules.sh download_ldn_mitm "${temp_directory}" "${username_password}")
|
||||
lockpick_version=$(./modules.sh download_lockpick "${temp_directory}" "${username_password}")
|
||||
lockpick_rcm_version=$(./modules.sh download_lockpick_rcm "${temp_directory}" "${username_password}")
|
||||
sys_clk_version=$(./modules.sh download_sys_clk "${temp_directory}" "${username_password}")
|
||||
sys_ftpd_version=$(./modules.sh download_sys_ftpd "${temp_directory}" "${username_password}")
|
||||
|
||||
# Delete the bundle if it already exists.
|
||||
dest=$(realpath -s ${2})
|
||||
rm -f "${dest}/Kosmos-${1}.zip"
|
||||
dest=$(realpath -s ${1})
|
||||
rm -f "${dest}/Kosmos-${version_number}.zip"
|
||||
|
||||
# Bundle everything together.
|
||||
current_directory=${PWD}
|
||||
cd "${temp_directory}"
|
||||
zip -q -r "${dest}/Kosmos-${1}.zip" .
|
||||
zip -q -r "${dest}/Kosmos-${version_number}.zip" .
|
||||
cd "${current_directory}"
|
||||
|
||||
# Clean up.
|
||||
rm -rf "${temp_directory}"
|
||||
|
||||
# Output some useful information.
|
||||
echo "Kosmos ${1} built with:"
|
||||
echo "Kosmos ${version_number} built with:"
|
||||
echo " Atmosphere - ${atmosphere_version}"
|
||||
echo " Hekate - ${hekate_version}"
|
||||
echo " EdiZon - ${edizon_version}"
|
||||
|
|
264
modules.sh
Executable file
264
modules.sh
Executable file
|
@ -0,0 +1,264 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Kosmos
|
||||
# Copyright (C) 2019 Steven Mattera
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
|
||||
# Downloads the latest Atmosphere release and extracts it.
|
||||
# Params:
|
||||
# - Directory to extract to
|
||||
# - GitHub Login
|
||||
# Returns:
|
||||
# The version number.
|
||||
download_atmosphere () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${2}" "Atmosphere-NX" "Atmosphere")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "atmosphere*" "*.zip")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
unzip -qq "${file}" -d "${1}"
|
||||
rm -f "${1}/switch/reboot_to_payload.nro"
|
||||
rm -f "${file}"
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "fusee*" "*.bin")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
mkdir -p "${1}/bootloader/payloads"
|
||||
mv ${file} "${1}/bootloader/payloads/fusee-primary.bin"
|
||||
rm -f "${1}/atmosphere/system_settings.ini"
|
||||
cp "./Modules/atmosphere/system_settings.ini" "${1}/atmosphere/system_settings.ini"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
# Downloads the latest Hekate release and extracts it.
|
||||
# Params:
|
||||
# - Directory to extract to
|
||||
# - The Kosmos version number
|
||||
# - GitHub Login
|
||||
# Returns:
|
||||
# The version number.
|
||||
download_hekate () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${3}" "CTCaer" "hekate")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "hekate*" "*.zip")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
unzip -qq "${file}" -d "${1}"
|
||||
rm -f "${file}"
|
||||
|
||||
payload=$(./common.sh glob "${1}/hekate*.bin")
|
||||
cp "${payload}" "${1}/bootloader/update.bin"
|
||||
mkdir -p "${1}/atmosphere"
|
||||
cp "${payload}" "${1}/atmosphere/reboot_payload.bin"
|
||||
|
||||
cp "./Modules/hekate/bootlogo.bmp" "${1}/bootloader/bootlogo.bmp"
|
||||
sed "s/KOSMOS_VERSION/${2}/g" "./Modules/hekate/hekate_ipl.ini" >> "${1}/bootloader/hekate_ipl.ini"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_appstore () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${2}" "vgmoose" "hb-appstore")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "*.nro")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
mkdir -p "${1}/switch/appstore"
|
||||
mv ${file} "${1}/switch/appstore/appstore.nro"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_edizon () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${2}" "WerWolv" "EdiZon")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "*.zip")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
unzip -qq "${file}" -d "${1}"
|
||||
rm -f "${file}"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_emuiibo () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${2}" "XorTroll" "emuiibo")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "emuiibo*" "*.zip")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
unzip -qq "${file}" -d "${1}"
|
||||
rm -f "${1}/titles/0100000000000352/flags/boot2.flag"
|
||||
rm -f "${file}"
|
||||
mkdir -p "${1}/atmosphere/titles"
|
||||
mv "${1}/titles/0100000000000352" "${1}/atmosphere/titles/"
|
||||
rm -rf "${1}/titles"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_goldleaf () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${2}" "XorTroll" "Goldleaf")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "*.nro")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
mkdir -p "${1}/switch/Goldleaf"
|
||||
mv ${file} "${1}/switch/Goldleaf/Goldleaf.nro"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_hid_mitm () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${2}" "jakibaki" "hid-mitm")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "hid*" "*.zip")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
unzip -qq "${file}" -d "${1}"
|
||||
rm -f "${1}/atmosphere/titles/0100000000000faf/flags/boot2.flag"
|
||||
rm -f "${file}"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_kosmos_toolbox () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${2}" "AtlasNX" "Kosmos-Toolbox")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "*.nro")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
mkdir -p "${1}/switch/KosmosToolbox"
|
||||
mv "${file}" "${1}/switch/KosmosToolbox/KosmosToolbox.nro"
|
||||
cp "./Modules/kosmos-toolbox/config.json" "${1}/switch/KosmosToolbox/config.json"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_kosmos_updater () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${3}" "AtlasNX" "Kosmos-Updater")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "*.nro")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
mkdir -p "${1}/switch/KosmosUpdater"
|
||||
mv ${file} "${1}/switch/KosmosUpdater/KosmosUpdater.nro"
|
||||
sed "s/KOSMOS_VERSION/${2}/g" "./Modules/kosmos-updater/internal.db" >> "${1}/switch/KosmosUpdater/internal.db"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_ldn_mitm () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${2}" "spacemeowx2" "ldn_mitm")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "ldn_mitm*" "*.zip")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
unzip -qq "${file}" -d "${1}"
|
||||
rm -f "${1}/atmosphere/titles/4200000000000010/flags/boot2.flag"
|
||||
rm -f "${file}"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_lockpick () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${2}" "shchmue" "Lockpick")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "*.nro")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
mkdir -p "${1}/switch/Lockpick"
|
||||
mv ${file} "${1}/switch/Lockpick/Lockpick.nro"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_lockpick_rcm () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${2}" "shchmue" "Lockpick_RCM")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "*.bin")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
mkdir -p "${1}/bootloader/payloads"
|
||||
mv ${file} "${1}/bootloader/payloads/Lockpick_RCM.bin"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_sys_clk () {
|
||||
mkdir -p ${1}
|
||||
latest_release=$(./common.sh get_latest_release "${2}" "retronx-team" "sys-clk")
|
||||
|
||||
asset=$(./common.sh find_asset "${latest_release}" "sys-clk*" "*.zip")
|
||||
file=$(./common.sh download_file "${asset}")
|
||||
|
||||
unzip -qq "${file}" -d "${1}"
|
||||
rm -f "${1}/atmosphere/titles/00FF0000636C6BFF/flags/boot2.flag"
|
||||
rm -f "${1}/README.html"
|
||||
rm -f "${file}"
|
||||
|
||||
echo $(./common.sh get_version_number "${latest_release}")
|
||||
}
|
||||
|
||||
download_sys_ftpd () {
|
||||
mkdir -p ${1}
|
||||
file=$(./common.sh download_file_url "http://bsnx.lavatech.top/sys-ftpd/sys-ftpd-latest.zip")
|
||||
|
||||
temp_sysftpd_directory="/tmp/$(uuidgen)"
|
||||
mkdir -p "${temp_sysftpd_directory}"
|
||||
unzip -qq "${file}" -d "${temp_sysftpd_directory}"
|
||||
cp -r "${temp_sysftpd_directory}/sd"/* "${1}"
|
||||
rm -f "${1}/atmosphere/titles/420000000000000E/flags/boot2.flag"
|
||||
rm -f "${file}"
|
||||
rm -rf "${temp_sysftpd_directory}"
|
||||
|
||||
echo "latest"
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Main Script
|
||||
# =============================================================================
|
||||
|
||||
if [ $# -le 1 ]
|
||||
then
|
||||
echo "This is not meant to be called by end users and is used by the kosmos.sh and sdsetup.sh scripts."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if the function exists (bash specific)
|
||||
if declare -f "$1" > /dev/null
|
||||
then
|
||||
# call arguments verbatim
|
||||
"$@"
|
||||
else
|
||||
# Show a helpful error
|
||||
echo "'$1' is not a known function name" >&2
|
||||
exit 1
|
||||
fi
|
120
sdsetup.sh
Executable file
120
sdsetup.sh
Executable file
|
@ -0,0 +1,120 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Kosmos
|
||||
# Copyright (C) 2019 Steven Mattera
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
|
||||
func_result=""
|
||||
|
||||
# Prompts for GitHub Username and Password
|
||||
# Returns:
|
||||
# The username and password on ${func_result}.
|
||||
prompt_login () {
|
||||
echo "It is recommended that you login to GitHub to use this tool. However you"
|
||||
echo "can continue without logging in, but you may run into rate limits. If you"
|
||||
echo "use two-factor authentication then you will need to generate a personal"
|
||||
echo "access token and use it as your password. https://github.com/settings/tokens"
|
||||
echo ""
|
||||
read -p "Username: (Leave blank to continue without logging in) " username
|
||||
|
||||
if [ ! -z "${username}" ]
|
||||
then
|
||||
read -sp "Password or personal access token:" password
|
||||
func_result="${username}:${password}"
|
||||
else
|
||||
func_result=""
|
||||
fi
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Main Script
|
||||
# =============================================================================
|
||||
|
||||
if [ $# -le 0 ]
|
||||
then
|
||||
echo "Usage: ./kosmos.sh [output_directory]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
authenticated=0
|
||||
username_password=""
|
||||
while [ $authenticated -ne 1 ]; do
|
||||
prompt_login
|
||||
username_password=${func_result}
|
||||
|
||||
if [ ! -z "${username_password}" ]
|
||||
then
|
||||
authenticated=$(./common.sh test_login "${username_password}")
|
||||
else
|
||||
authenticated=1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
done
|
||||
|
||||
# Get version number
|
||||
version_number=$(head -1 version.txt)
|
||||
|
||||
# Build temp directory
|
||||
temp_directory="/tmp/$(uuidgen)"
|
||||
mkdir -p "${temp_directory}"
|
||||
|
||||
# Start building!
|
||||
atmosphere_version=$(./modules.sh download_atmosphere "${temp_directory}/atmosphere" "${username_password}")
|
||||
hekate_version=$(./modules.sh download_hekate "${temp_directory}/hekate" "${version_number}" "${username_password}")
|
||||
appstore_version=$(./modules.sh download_appstore "${temp_directory}/appstore" "${username_password}")
|
||||
edizon_version=$(./modules.sh download_edizon "${temp_directory}/edizon" "${username_password}")
|
||||
emuiibo_version=$(./modules.sh download_emuiibo "${temp_directory}/emuiibo" "${username_password}")
|
||||
goldleaf_version=$(./modules.sh download_goldleaf "${temp_directory}/goldleaf" "${username_password}")
|
||||
hid_mitm_version=$(./modules.sh download_hid_mitm "${temp_directory}/hid_mitm" "${username_password}")
|
||||
kosmos_toolbox_version=$(./modules.sh download_kosmos_toolbox "${temp_directory}/kosmos_toolbox" "${username_password}")
|
||||
kosmos_updater_version=$(./modules.sh download_kosmos_updater "${temp_directory}/kosmos_updater" "${version_number}" "${username_password}")
|
||||
ldn_mitm_version=$(./modules.sh download_ldn_mitm "${temp_directory}/ldn_mitm" "${username_password}")
|
||||
lockpick_version=$(./modules.sh download_lockpick "${temp_directory}/lockpick" "${username_password}")
|
||||
lockpick_rcm_version=$(./modules.sh download_lockpick_rcm "${temp_directory}/lockpick_rcm" "${username_password}")
|
||||
sys_clk_version=$(./modules.sh download_sys_clk "${temp_directory}/sys_clk" "${username_password}")
|
||||
sys_ftpd_version=$(./modules.sh download_sys_ftpd "${temp_directory}/sys_ftpd" "${username_password}")
|
||||
|
||||
# Delete the bundle if it already exists.
|
||||
dest=$(realpath -s ${1})
|
||||
rm -f "${dest}/SDSetupModules-${version_number}.zip"
|
||||
|
||||
# Bundle everything together.
|
||||
current_directory=${PWD}
|
||||
cd "${temp_directory}"
|
||||
zip -q -r "${dest}/SDSetupModules-${version_number}.zip" .
|
||||
cd "${current_directory}"
|
||||
|
||||
# Clean up.
|
||||
rm -rf "${temp_directory}"
|
||||
|
||||
# Output some useful information.
|
||||
echo "SDSetup Modules built with:"
|
||||
echo " Atmosphere - ${atmosphere_version}"
|
||||
echo " Hekate - ${hekate_version}"
|
||||
echo " EdiZon - ${edizon_version}"
|
||||
echo " Emuiibo - ${emuiibo_version}"
|
||||
echo " Goldleaf - ${goldleaf_version}"
|
||||
echo " hid-mitm - ${hid_mitm_version}"
|
||||
echo " Homebrew App Store - ${appstore_version}"
|
||||
echo " Kosmos Toolbox - ${kosmos_toolbox_version}"
|
||||
echo " Kosmos Updater - ${kosmos_updater_version}"
|
||||
echo " ldn_mitm - ${ldn_mitm_version}"
|
||||
echo " Lockpick - ${lockpick_version}"
|
||||
echo " Lockpick RCM - ${lockpick_rcm_version}"
|
||||
echo " sys-clk - ${sys_clk_version}"
|
||||
echo " sys-ftpd - ${sys_ftpd_version}"
|
Reference in a new issue