Skip to content

Commit

Permalink
bin: Add script to automate uid-gid table updates on wiki
Browse files Browse the repository at this point in the history
Signed-off-by: Michał Górny <[email protected]>
  • Loading branch information
mgorny committed Sep 11, 2019
1 parent fbde309 commit a6353ac
Showing 1 changed file with 101 additions and 0 deletions.
101 changes: 101 additions & 0 deletions bin/update-wiki-table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
#!/usr/bin/env python3

import argparse
import os.path
import requests
import subprocess
import sys


def main(argv):
default_api_url = 'https://wiki.gentoo.org/api.php'
default_script_path = os.path.join(os.path.dirname(__file__),
'uidgid2wiki.awk')
default_title = 'UID_GID_Assignment_Table'

argp = argparse.ArgumentParser(prog=argv[0])
argp.add_argument('--api-url', default=default_api_url,
help='URL to MediaWiki API (default: {})'
.format(default_api_url))
argp.add_argument('-p', '--password', required=True,
help='Bot password to log in with')
argp.add_argument('--script', default=default_script_path,
help='Path to uidgid2wiki script')
argp.add_argument('--title', default=default_title,
help='Title of page to edit (default: {})'
.format(default_title))
argp.add_argument('-u', '--username', required=True,
help='Username to log in with')
argp.add_argument('path', nargs=1, metavar='uid-gid.txt',
type=argparse.FileType('r', encoding='utf-8'),
help='UID/GID listing to process')
args = argp.parse_args(argv[1:])

# Get converted contents first.
with subprocess.Popen([args.script],
stdin=args.path[0],
stdout=subprocess.PIPE) as s:
page_data, _ = s.communicate()
assert s.returncode == 0

# MediaWiki API is just HORRIBLE! Editing a page requires obtaining
# a login token, logging in, obtaining a CSRF (!) token
# and apparently preserving cookies as well!
with requests.Session() as s:
# get login token
params = {
'action': 'query',
'meta': 'tokens',
'type': 'login',
'format': 'json',
}
with s.get(args.api_url, params=params) as r:
token = r.json()['query']['tokens']['logintoken']

# log in
params = {
'action': 'login',
'lgname': args.username,
'lgpassword': args.password,
'lgtoken': token,
'format': 'json',
}
with s.post(args.api_url, data=params) as r:
assert r.json()['login']['result'] == 'Success', r.json()

# get CSRF token (wtf?!)
params = {
'action': 'query',
'meta': 'tokens',
'format': 'json',
}
with s.get(args.api_url, params=params) as r:
token = r.json()['query']['tokens']['csrftoken']

# edit page (finally)
params = {
'action': 'edit',
'title': args.title,
'token': token,
'format': 'json',
'text': page_data,
'summary': 'Automatic update from uid-gid.txt',
'bot': True,
}
with s.post(args.api_url, data=params) as r:
assert 'error' not in r.json(), r.json()
print(r.json())

# logout
params = {
'action': 'logout',
'token': token,
}
with s.get(args.api_url, params=params) as r:
pass

return 0


if __name__ == '__main__':
sys.exit(main(sys.argv))

0 comments on commit a6353ac

Please sign in to comment.