Stop using googlecode for file hosting

This commit is contained in:
Kovid Goyal 2013-06-21 22:25:37 +05:30
parent 4a105ef459
commit a2aad03af9
2 changed files with 46 additions and 10 deletions

View File

@ -10,13 +10,13 @@ __docformat__ = 'restructuredtext en'
import os, time, sys, traceback, subprocess, urllib2, re, base64, httplib import os, time, sys, traceback, subprocess, urllib2, re, base64, httplib
from argparse import ArgumentParser, FileType from argparse import ArgumentParser, FileType
from subprocess import check_call from subprocess import check_call
from tempfile import NamedTemporaryFile#, mkdtemp from tempfile import NamedTemporaryFile
from collections import OrderedDict from collections import OrderedDict
import mechanize import mechanize
from lxml import html from lxml import html
def login_to_google(username, password): def login_to_google(username, password): # {{{
br = mechanize.Browser() br = mechanize.Browser()
br.addheaders = [('User-agent', br.addheaders = [('User-agent',
'Mozilla/5.0 (X11; Linux x86_64; rv:9.0) Gecko/20100101 Firefox/9.0')] 'Mozilla/5.0 (X11; Linux x86_64; rv:9.0) Gecko/20100101 Firefox/9.0')]
@ -30,15 +30,16 @@ def login_to_google(username, password):
x = re.search(br'(?is)<title>.*?</title>', raw) x = re.search(br'(?is)<title>.*?</title>', raw)
if x is not None: if x is not None:
print ('Title of post login page: %s'%x.group()) print ('Title of post login page: %s'%x.group())
#open('/tmp/goog.html', 'wb').write(raw) # open('/tmp/goog.html', 'wb').write(raw)
raise ValueError(('Failed to login to google with credentials: %s %s' raise ValueError(('Failed to login to google with credentials: %s %s'
'\nGoogle sometimes requires verification when logging in from a ' '\nGoogle sometimes requires verification when logging in from a '
'new IP address. Use lynx to login and supply the verification, ' 'new IP address. Use lynx to login and supply the verification, '
'at: lynx -accept_all_cookies https://accounts.google.com/ServiceLogin?service=code') 'at: lynx -accept_all_cookies https://accounts.google.com/ServiceLogin?service=code')
%(username, password)) %(username, password))
return br return br
# }}}
class ReadFileWithProgressReporting(file): # {{{ class ReadFileWithProgressReporting(file): # {{{
def __init__(self, path, mode='rb'): def __init__(self, path, mode='rb'):
file.__init__(self, path, mode) file.__init__(self, path, mode)
@ -101,7 +102,7 @@ class Base(object): # {{{
#}}} #}}}
class GoogleCode(Base):# {{{ class GoogleCode(Base): # {{{
def __init__(self, def __init__(self,
# A mapping of filenames to file descriptions. The descriptions are # A mapping of filenames to file descriptions. The descriptions are
@ -141,7 +142,7 @@ class GoogleCode(Base):# {{{
# The pattern to match filenames for the files being uploaded and # The pattern to match filenames for the files being uploaded and
# extract version information from them. Must have a named group # extract version information from them. Must have a named group
# named version # named version
filename_pattern=r'{appname}-(?:portable-installer-)?(?P<version>.+?)(?:-(?:i686|x86_64|32bit|64bit))?\.(?:zip|exe|msi|dmg|tar\.bz2|tar\.xz|txz|tbz2)' filename_pattern=r'{appname}-(?:portable-installer-)?(?P<version>.+?)(?:-(?:i686|x86_64|32bit|64bit))?\.(?:zip|exe|msi|dmg|tar\.bz2|tar\.xz|txz|tbz2)' # noqa
): ):
self.username, self.password, = username, password self.username, self.password, = username, password
@ -227,7 +228,8 @@ class GoogleCode(Base):# {{{
paths = eval(raw) if raw else {} paths = eval(raw) if raw else {}
paths.update(self.paths) paths.update(self.paths)
rem = [x for x in paths if self.version not in x] rem = [x for x in paths if self.version not in x]
for x in rem: paths.pop(x) for x in rem:
paths.pop(x)
raw = ['%r : %r,'%(k, v) for k, v in paths.items()] raw = ['%r : %r,'%(k, v) for k, v in paths.items()]
raw = '{\n\n%s\n\n}\n'%('\n'.join(raw)) raw = '{\n\n%s\n\n}\n'%('\n'.join(raw))
with NamedTemporaryFile() as t: with NamedTemporaryFile() as t:
@ -347,7 +349,7 @@ class GoogleCode(Base):# {{{
# }}} # }}}
class SourceForge(Base): # {{{ class SourceForge(Base): # {{{
# Note that you should manually ssh once to username,project@frs.sourceforge.net # Note that you should manually ssh once to username,project@frs.sourceforge.net
# on the staging server so that the host key is setup # on the staging server so that the host key is setup
@ -378,6 +380,28 @@ class SourceForge(Base): # {{{
# }}} # }}}
def upload_to_servers(files, version): # {{{
for server, rdir in {'files':'/usr/share/nginx/html'}.iteritems():
print('Uploading to server:', server)
server = '%s.calibre-ebook.com' % server
rdir = '%s/%s/' % (rdir, version)
for x in files:
start = time.time()
print ('Uploading', x)
for i in range(5):
try:
check_call(['rsync', '-h', '-z', '--progress', '-e', 'ssh -x', x,
'root@%s:%s'%(server, rdir)])
except KeyboardInterrupt:
raise SystemExit(1)
except:
print ('\nUpload failed, trying again in 30 seconds')
time.sleep(30)
else:
break
print ('Uploaded in', int(time.time() - start), 'seconds\n\n')
# }}}
# CLI {{{ # CLI {{{
def cli_parser(): def cli_parser():
epilog='Copyright Kovid Goyal 2012' epilog='Copyright Kovid Goyal 2012'
@ -409,6 +433,7 @@ def cli_parser():
sf = subparsers.add_parser('sourceforge', help='Upload to sourceforge', sf = subparsers.add_parser('sourceforge', help='Upload to sourceforge',
epilog=epilog) epilog=epilog)
cron = subparsers.add_parser('cron', help='Call script from cron') cron = subparsers.add_parser('cron', help='Call script from cron')
subparsers.add_parser('calibre', help='Upload to calibre file servers')
a = gc.add_argument a = gc.add_argument
@ -471,8 +496,11 @@ def main(args=None):
sf() sf()
elif args.service == 'cron': elif args.service == 'cron':
login_to_google(args.username, args.password) login_to_google(args.username, args.password)
elif args.service == 'calibre':
upload_to_servers(ofiles, args.version)
if __name__ == '__main__': if __name__ == '__main__':
main() main()
# }}} # }}}

View File

@ -81,7 +81,7 @@ class ReUpload(Command): # {{{
# Data {{{ # Data {{{
def get_google_data(): def get_google_data():
with open(os.path.expanduser('~/work/kde/conf/googlecodecalibre'), 'rb') as f: with open(os.path.expanduser('~/work/env/private/googlecodecalibre'), 'rb') as f:
gc_password, ga_un, pw = f.read().strip().split('|') gc_password, ga_un, pw = f.read().strip().split('|')
return { return {
@ -111,6 +111,9 @@ def sf_cmdline(ver, sdata):
return [__appname__, ver, 'fmap', 'sourceforge', sdata['project'], return [__appname__, ver, 'fmap', 'sourceforge', sdata['project'],
sdata['username']] sdata['username']]
def calibre_cmdline(ver):
return [__appname__, ver, 'fmap', 'calibre']
def run_remote_upload(args): def run_remote_upload(args):
print 'Running remotely:', ' '.join(args) print 'Running remotely:', ' '.join(args)
subprocess.check_call(['ssh', '-x', '%s@%s'%(STAGING_USER, STAGING_HOST), subprocess.check_call(['ssh', '-x', '%s@%s'%(STAGING_USER, STAGING_HOST),
@ -133,7 +136,8 @@ class UploadInstallers(Command): # {{{
try: try:
self.upload_to_staging(tdir, files) self.upload_to_staging(tdir, files)
self.upload_to_sourceforge() self.upload_to_sourceforge()
self.upload_to_google(opts.replace) self.upload_to_calibre()
# self.upload_to_google(opts.replace)
finally: finally:
shutil.rmtree(tdir, ignore_errors=True) shutil.rmtree(tdir, ignore_errors=True)
@ -170,6 +174,10 @@ class UploadInstallers(Command): # {{{
sdata = get_sourceforge_data() sdata = get_sourceforge_data()
args = sf_cmdline(__version__, sdata) args = sf_cmdline(__version__, sdata)
run_remote_upload(args) run_remote_upload(args)
def upload_to_calibre(self):
run_remote_upload(calibre_cmdline(__version__))
# }}} # }}}
class UploadUserManual(Command): # {{{ class UploadUserManual(Command): # {{{