import subprocess
import sys
import tempfile
+import yaml
from urllib.parse import urlparse
from argparse import ArgumentParser
privkey = os.path.join(tmp_dir, '.privkey')
key_pem = os.path.join(tmp_dir, '.key.pem')
p12 = os.path.join(tmp_dir, '.keystore.p12')
- subprocess.check_call([common.config['keytool'], '-importkeystore',
+ _config = dict()
+ common.fill_config_defaults(_config)
+ subprocess.check_call([_config['keytool'], '-importkeystore',
'-srckeystore', KEYSTORE_FILE, '-srcalias', KEY_ALIAS,
'-srcstorepass', PASSWORD, '-srckeypass', PASSWORD,
'-destkeystore', p12, '-destalias', KEY_ALIAS,
rsakey = paramiko.RSAKey.from_private_key_file(privkey)
fingerprint = base64.b64encode(hashlib.sha256(rsakey.asbytes()).digest()).decode('ascii').rstrip('=')
ssh_private_key_file = os.path.join(tmp_dir, 'debug_keystore_' + fingerprint + '_id_rsa')
- os.rename(privkey, ssh_private_key_file)
+ shutil.move(privkey, ssh_private_key_file)
pub = rsakey.get_name() + ' ' + rsakey.get_base64() + ' ' + ssh_private_key_file
with open(ssh_private_key_file + '.pub', 'w') as fp:
help=_("Don't use rsync checksums"))
# TODO add --with-btlog
options = parser.parse_args()
- common.read_config(None)
# force a tighter umask since this writes private key material
umask = os.umask(0o077)
repo_url = repo_base + '/repo'
git_mirror_path = os.path.join(repo_basedir, 'git-mirror')
git_mirror_repodir = os.path.join(git_mirror_path, 'fdroid', 'repo')
+ git_mirror_metadatadir = os.path.join(git_mirror_path, 'fdroid', 'metadata')
if not os.path.isdir(git_mirror_repodir):
logging.debug(_('cloning {url}').format(url=clone_url))
try:
icon_path = os.path.join(git_mirror_path, 'icon.png')
try:
import qrcode
- img = qrcode.make(repo_url)
- with open(icon_path, 'wb') as fp:
- fp.write(img)
+ qrcode.make(repo_url).save(icon_path)
except Exception:
exampleicon = os.path.join(common.get_examples_dir(), 'fdroid-icon.png')
shutil.copy(exampleicon, icon_path)
shutil.copy(icon_path, repo_basedir)
os.chdir(repo_basedir)
- common.local_rsync(options, git_mirror_repodir + '/', 'repo/')
+ if os.path.isdir(git_mirror_repodir):
+ common.local_rsync(options, git_mirror_repodir + '/', 'repo/')
+ if os.path.isdir(git_mirror_metadatadir):
+ common.local_rsync(options, git_mirror_metadatadir + '/', 'metadata/')
ssh_private_key_file = _ssh_key_from_debug_keystore()
# this is needed for GitPython to find the SSH key
with open('config.py', 'w') as fp:
fp.write(config)
os.chmod('config.py', 0o600)
+ config = common.read_config(options)
+ common.assert_config_keystore(config)
for root, dirs, files in os.walk(cibase):
for d in ('fdroid', '.git', '.gradle'):
for f in files:
if f.endswith('-debug.apk'):
apkfilename = os.path.join(root, f)
- logging.debug(_('copying {apkfilename} into {path}')
- .format(apkfilename=apkfilename, path=repodir))
+ logging.debug(_('Striping mystery signature from {apkfilename}')
+ .format(apkfilename=apkfilename))
destapk = os.path.join(repodir, os.path.basename(f))
- shutil.copyfile(apkfilename, destapk)
- shutil.copystat(apkfilename, destapk)
- os.chmod(destapk, 0o644)
+ os.chmod(apkfilename, 0o644)
+ logging.debug(_('Resigning {apkfilename} with provided debug.keystore')
+ .format(apkfilename=os.path.basename(apkfilename)))
+ common.apk_strip_signatures(apkfilename, strip_manifest=True)
+ common.sign_apk(apkfilename, destapk, KEY_ALIAS)
if options.verbose:
logging.debug(_('attempting bare ssh connection to test deploy key:'))
except subprocess.CalledProcessError:
pass
- subprocess.check_call(['fdroid', 'update', '--rename-apks', '--verbose'], cwd=repo_basedir)
+ app_url = clone_url[:-len(NIGHTLY)]
+ template = dict()
+ template['AuthorName'] = clone_url.split('/')[4]
+ template['AuthorWebSite'] = '/'.join(clone_url.split('/')[:4])
+ template['Categories'] = ['nightly']
+ template['SourceCode'] = app_url
+ template['IssueTracker'] = app_url + '/issues'
+ template['Summary'] = 'Nightly build of ' + urlparse(app_url).path[1:]
+ template['Description'] = template['Summary']
+ with open('template.yml', 'w') as fp:
+ yaml.dump(template, fp)
+
+ subprocess.check_call(['fdroid', 'update', '--rename-apks', '--create-metadata', '--verbose'],
+ cwd=repo_basedir)
+ common.local_rsync(options, repo_basedir + '/metadata/', git_mirror_metadatadir + '/')
+ mirror_git_repo.git.add(all=True)
+ mirror_git_repo.index.commit("update app metadata")
try:
subprocess.check_call(['fdroid', 'server', 'update', '--verbose'], cwd=repo_basedir)
except subprocess.CalledProcessError:
shutil.rmtree(os.path.dirname(ssh_private_key_file))
else:
+ if not os.path.isfile(KEYSTORE_FILE):
+ androiddir = os.path.dirname(KEYSTORE_FILE)
+ if not os.path.exists(androiddir):
+ os.mkdir(androiddir)
+ logging.info(_('created {path}').format(path=androiddir))
+ logging.error(_('{path} does not exist! Create it by running:').format(path=KEYSTORE_FILE)
+ + '\n keytool -genkey -v -keystore ' + KEYSTORE_FILE + ' -storepass android \\'
+ + '\n -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \\'
+ + '\n -dname "CN=Android Debug,O=Android,C=US"')
+ sys.exit(1)
ssh_dir = os.path.join(os.getenv('HOME'), '.ssh')
os.makedirs(os.path.dirname(ssh_dir), exist_ok=True)
privkey = _ssh_key_from_debug_keystore()
ssh_private_key_file = os.path.join(ssh_dir, os.path.basename(privkey))
- os.rename(privkey, ssh_private_key_file)
- os.rename(privkey + '.pub', ssh_private_key_file + '.pub')
+ shutil.move(privkey, ssh_private_key_file)
+ shutil.move(privkey + '.pub', ssh_private_key_file + '.pub')
if shutil.rmtree.avoids_symlink_attacks:
shutil.rmtree(os.path.dirname(privkey))