moved to subdir
This commit is contained in:
parent
0bfbb5b3fb
commit
97b5fd3683
|
@ -1,149 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import requests
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import tarfile
|
||||
|
||||
MW_API_URL = 'https://www.mediawiki.org/w/api.php'
|
||||
DEBUG = False
|
||||
|
||||
def get_filename_from_cd(cd):
|
||||
"""
|
||||
Get filename from content-disposition
|
||||
"""
|
||||
if not cd:
|
||||
return None
|
||||
fname = re.findall('filename=(.+)', cd)
|
||||
if len(fname) == 0:
|
||||
return None
|
||||
return fname[0]
|
||||
|
||||
def find_nearest_small_value(key, sorted_li):
|
||||
return max(i for i in sorted_li if i <= key)
|
||||
|
||||
def download(name, url, path):
|
||||
if url == None:
|
||||
return
|
||||
if DEBUG:
|
||||
print(f' ↪ Downloading { name } from { url } to "{ path }"')
|
||||
else:
|
||||
print(f' ↪ Downloading { name }')
|
||||
r = requests.get(url, allow_redirects = True)
|
||||
filename = get_filename_from_cd(r.headers.get('content-disposition'))
|
||||
if filename == None and url.find('/'):
|
||||
filename = url.rsplit('/', 1)[1]
|
||||
if DEBUG:
|
||||
print( f' ↪ Writing to {os.path.join( path, filename )}' )
|
||||
open(os.path.join( path, filename ), 'wb').write(r.content)
|
||||
if DEBUG:
|
||||
print( f' ↪ Decompressing to {os.path.join( path, name )}' )
|
||||
tgz = tarfile.open( os.path.join( path, filename ) )
|
||||
tgz.extractall( path )
|
||||
tgz.close
|
||||
|
||||
def get_url(release, item, degrade):
|
||||
if release in item:
|
||||
return item[release]
|
||||
elif degrade:
|
||||
prv = find_nearest_small_value(release, list(item.keys()))
|
||||
return item[prv]
|
||||
else:
|
||||
return None
|
||||
|
||||
def ensure_path(path):
|
||||
if os.path.exists(path):
|
||||
if os.path.isdir(path):
|
||||
if os.access(path, os.W_OK):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
else:
|
||||
return False
|
||||
else:
|
||||
os.mkdir( path, mode=0o770 )
|
||||
if os.getuid == 0:
|
||||
shutil.chown(path, user='www-data', group='www-data')
|
||||
|
||||
def get_path(path):
|
||||
if os.path.exists(path):
|
||||
if os.path.isdir(path):
|
||||
if os.access(path, os.W_OK):
|
||||
return path
|
||||
elif path != './':
|
||||
print(f'"{path}" is not writable. Trying current directory.')
|
||||
return( get_path('./') )
|
||||
else:
|
||||
print(f'Cannot write to {path}. Terminating.')
|
||||
exit(3)
|
||||
else:
|
||||
print(f'"{path}" is not a directory. Trying current directory.')
|
||||
return( get_path('./') )
|
||||
else:
|
||||
print(f'"{path}" does not exist. Trying current directory.')
|
||||
return( get_path('./') )
|
||||
|
||||
def init():
|
||||
global DEBUG
|
||||
parser = argparse.ArgumentParser(
|
||||
prog="SkinAndExtendMediawiki",
|
||||
description="It's all in the name, skinning and extending Mediawiki",
|
||||
epilog="Skins and extensions respectively will be downloaded into 'skins' and 'extensions' subdirectory of the -p/--path given."
|
||||
)
|
||||
parser.add_argument("-p","--path", help="installation path\nExamples:-p /var/www/mediawiki/\n--path /srv/mediawiki", type=str, default='./')
|
||||
parser.add_argument("-r","--release", help="Mediawiki release, use release 'list' to list available release tags.", type=str, default="list")
|
||||
parser.add_argument("-d","--degrade", help="degrade Mediawiki release if no download for the selected release exists (source → master → REL… → REL-1 …), otherwise will be skipped", action='store_true')
|
||||
parser.add_argument("-s","--skins", help="install one or more Mediawiki skins", type=str, dest='skins', nargs='+')
|
||||
parser.add_argument("-e","--extensions", help="install one or more Mediawiki extensions", type=str, dest='extensions', nargs='+')
|
||||
parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true")
|
||||
|
||||
args = parser.parse_args()
|
||||
if args.verbose:
|
||||
DEBUG = True
|
||||
if DEBUG:
|
||||
print(args)
|
||||
payload = { 'action': 'query', 'list': 'extdistbranches', 'format': 'json' }
|
||||
r = requests.get( MW_API_URL, params=( payload | { 'edbskins': 'Vector'} ) )
|
||||
if r.status_code == 200:
|
||||
response = json.loads(r.text)
|
||||
vector_keys = list( response['query']['extdistbranches']['skins']['Vector'].keys() )
|
||||
list_message = f'\nAvailable release tags: { vector_keys }.'
|
||||
else:
|
||||
list_message = f'Cannot retrieve release tags, received HTTP { r.status_code}.'
|
||||
if args.release == 'list':
|
||||
parser.print_help()
|
||||
print(list_message)
|
||||
exit(1)
|
||||
elif args.release in vector_keys:
|
||||
print(f'Using release tag { args.release }.')
|
||||
else:
|
||||
print(f'Invalid release tag { args.release }.')
|
||||
exit(2)
|
||||
|
||||
final_payload = payload.copy()
|
||||
if args.skins != None:
|
||||
final_payload |= { 'edbskins': '|'.join(args.skins) }
|
||||
if args.extensions != None:
|
||||
final_payload |= { 'edbexts': '|'.join(args.extensions) }
|
||||
|
||||
#print( json.dumps(final_payload, indent=4) )
|
||||
r = requests.get( MW_API_URL, params=final_payload )
|
||||
response = json.loads(r.text)
|
||||
edb = response['query']['extdistbranches']
|
||||
path = get_path( os.path.join( args.path, '' ) )
|
||||
for dl_type in list(response['query']['extdistbranches'].keys()):
|
||||
print(f'Processing { dl_type }.')
|
||||
ensure_path( os.path.join( path, dl_type ) )
|
||||
for item in edb[dl_type]:
|
||||
if DEBUG:
|
||||
print( f' ↪ {item}: { get_url( args.release, edb[dl_type][item], args.degrade )}' )
|
||||
download(item, get_url( args.release, edb[dl_type][item], args.degrade ), os.path.join( path, dl_type ) )
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
init()
|
||||
|
||||
|
Loading…
Reference in New Issue