SuperMarioOdysseyOnline/scripts/sendPatch.py

110 lines
3.1 KiB
Python

from ftplib import FTP
import os
import sys
titleIdLookup = {
"US": '0100000000010000'
}
def listdirs(connection,_path):
file_list, dirs, nondirs = [], [], []
try:
connection.cwd(_path)
except:
return []
connection.retrlines('LIST', lambda x: file_list.append(x.split()))
for info in file_list:
ls_type, name = info[0], info[-1]
if ls_type.startswith('d'):
dirs.append(name)
else:
nondirs.append(name)
return dirs
def ensuredirectory(connection,root,path):
print(f"Ensuring {os.path.join(root, path)} exists...")
if path not in listdirs(connection, root):
connection.mkd(f'{root}/{path}')
consoleIP = sys.argv[1]
if '.' not in consoleIP:
print(sys.argv[0], "ERROR: Please specify with `IP=[Your console's IP]`")
sys.exit(-1)
isNeedOtherSwitch = False
consolePort = 5000
if len(sys.argv) < 3:
projName = 'StarlightBase'
else:
projName = sys.argv[2]
if len(sys.argv) < 5:
user = 'crafty'
passwd = 'boss'
else:
user = sys.argv[3]
passwd = sys.argv[4]
curDir = os.curdir
ftp = FTP()
print(f'Connecting to {consoleIP}... ', end='')
ftp.connect(consoleIP, consolePort)
print('logging into server...', end='')
ftp.login(user,passwd)
print('Connected!')
if isNeedOtherSwitch:
print(f'Connecting to {altSwitchIP}... ', end='')
otherftp.connect(altSwitchIP, consolePort)
print('logging into server...', end='')
otherftp.login(user,passwd)
print('Connected!')
patchDirectories = []
root, dirs, _ = next(os.walk(curDir))
for dir in dirs:
if dir.startswith("starlight_patch_"):
patchDirectories.append((os.path.join(root, f'{dir}/atmosphere/exefs_patches/{projName}'), projName))
# ensuredirectory(ftp, '', 'atmosphere')
# ensuredirectory(ftp, '/atmosphere', 'exefs_patches')
for patchDir in patchDirectories:
dirPath = patchDir[0]
dirName = patchDir[1]
ensuredirectory(ftp, '/atmosphere/exefs_patches', patchDir[1])
_, _, files = next(os.walk(dirPath))
for file in files:
fullPath = os.path.join(dirPath, file)
if os.path.exists(fullPath):
sdPath = f'/atmosphere/exefs_patches/{projName}/{file}'
print(f'Sending "{sdPath}" to {consoleIP}.')
ftp.storbinary(f'STOR {sdPath}', open(fullPath, 'rb'))
if isNeedOtherSwitch:
print(f'Sending "{sdPath}" to {altSwitchIP}.')
otherftp.storbinary(f'STOR {sdPath}', open(fullPath, 'rb'))
# ensuredirectory(ftp, '/atmosphere', 'contents')
# ensuredirectory(ftp, '/atmosphere/contents', '0100000000010000')
# ensuredirectory(ftp, f'/atmosphere/contents/0100000000010000', 'exefs')
binaryPath = f'starlight_patch_100/atmosphere/contents/0100000000010000/exefs/subsdk1'
if os.path.isfile(binaryPath):
sdPath = f'/atmosphere/contents/0100000000010000/exefs/subsdk1'
print(f'Sending "{sdPath}" to {consoleIP}.')
ftp.storbinary(f'STOR {sdPath}', open(binaryPath, 'rb'))
if isNeedOtherSwitch:
print(f'Sending "{sdPath}" to {altSwitchIP}.')
otherftp.storbinary(f'STOR {sdPath}', open(binaryPath, 'rb'))