mirror of
				https://github.com/kovidgoyal/calibre.git
				synced 2025-11-03 19:17:02 -05:00 
			
		
		
		
	Move User Manual and staging to the download server
This commit is contained in:
		
							parent
							
								
									5b07091d59
								
							
						
					
					
						commit
						2096dce1cd
					
				
							
								
								
									
										113
									
								
								setup/hosting.py
									
									
									
									
									
								
							
							
						
						
									
										113
									
								
								setup/hosting.py
									
									
									
									
									
								
							@ -7,16 +7,14 @@ __license__   = 'GPL v3'
 | 
			
		||||
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
 | 
			
		||||
__docformat__ = 'restructuredtext en'
 | 
			
		||||
 | 
			
		||||
import os, time, sys, traceback, subprocess, urllib2, re, base64, httplib
 | 
			
		||||
import os, time, sys, traceback, subprocess, urllib2, re, base64, httplib, shutil
 | 
			
		||||
from argparse import ArgumentParser, FileType
 | 
			
		||||
from subprocess import check_call
 | 
			
		||||
from tempfile import NamedTemporaryFile
 | 
			
		||||
from collections import OrderedDict
 | 
			
		||||
 | 
			
		||||
import mechanize
 | 
			
		||||
from lxml import html
 | 
			
		||||
 | 
			
		||||
def login_to_google(username, password):  # {{{
 | 
			
		||||
    import mechanize
 | 
			
		||||
    br = mechanize.Browser()
 | 
			
		||||
    br.addheaders = [('User-agent',
 | 
			
		||||
        'Mozilla/5.0 (X11; Linux x86_64; rv:9.0) Gecko/20100101 Firefox/9.0')]
 | 
			
		||||
@ -246,6 +244,7 @@ class GoogleCode(Base):  # {{{
 | 
			
		||||
        return login_to_google(self.username, self.gmail_password)
 | 
			
		||||
 | 
			
		||||
    def get_files_hosted_by_google_code(self):
 | 
			
		||||
        from lxml import html
 | 
			
		||||
        self.info('Getting existing files in google code:', self.gc_project)
 | 
			
		||||
        raw = urllib2.urlopen(self.files_list).read()
 | 
			
		||||
        root = html.fromstring(raw)
 | 
			
		||||
@ -380,11 +379,111 @@ class SourceForge(Base):  # {{{
 | 
			
		||||
 | 
			
		||||
# }}}
 | 
			
		||||
 | 
			
		||||
def generate_index():  # {{{
 | 
			
		||||
    os.chdir('/srv/download')
 | 
			
		||||
    releases = set()
 | 
			
		||||
    for x in os.listdir('.'):
 | 
			
		||||
        if os.path.isdir(x) and '.' in x:
 | 
			
		||||
            releases.add(tuple((int(y) for y in x.split('.'))))
 | 
			
		||||
    rmap = OrderedDict()
 | 
			
		||||
    for rnum in sorted(releases, reverse=True):
 | 
			
		||||
        series = rnum[:2] if rnum[0] == 0 else rnum[:1]
 | 
			
		||||
        if series not in rmap:
 | 
			
		||||
            rmap[series] = []
 | 
			
		||||
        rmap[series].append(rnum)
 | 
			
		||||
 | 
			
		||||
    template = '''<!DOCTYPE html>\n<html lang="en"> <head> <meta charset="utf-8"> <title>{title}</title> <style type="text/css"> {style} </style> </head> <body> <h1>{title}</h1> <p>{msg}</p> {body} </body> </html> '''  # noqa
 | 
			
		||||
    style = '''
 | 
			
		||||
    body { font-family: sans-serif; background-color: #eee; }
 | 
			
		||||
    a { text-decoration: none; }
 | 
			
		||||
    a:visited { color: blue }
 | 
			
		||||
    a:hover { color: red }
 | 
			
		||||
    ul { list-style-type: none }
 | 
			
		||||
    li { padding-bottom: 1ex }
 | 
			
		||||
    dd li { text-indent: 0; margin: 0 }
 | 
			
		||||
    dd ul { padding: 0; margin: 0 }
 | 
			
		||||
    dt { font-weight: bold }
 | 
			
		||||
    dd { margin-bottom: 2ex }
 | 
			
		||||
    '''
 | 
			
		||||
    body = []
 | 
			
		||||
    for series in rmap:
 | 
			
		||||
        body.append('<li><a href="{0}.html" title="Releases in the {0}.x series">{0}.x</a>\xa0\xa0\xa0<span style="font-size:smaller">[{1} releases]</span></li>'.format(  # noqa
 | 
			
		||||
                '.'.join(map(type(''), series)), len(rmap[series])))
 | 
			
		||||
    body = '<ul>{0}</ul>'.format(' '.join(body))
 | 
			
		||||
    index = template.format(title='Previous calibre releases', style=style, msg='Choose a series of calibre releases', body=body)
 | 
			
		||||
    with open('index.html', 'wb') as f:
 | 
			
		||||
        f.write(index.encode('utf-8'))
 | 
			
		||||
 | 
			
		||||
    for series, releases in rmap.iteritems():
 | 
			
		||||
        sname = '.'.join(map(type(''), series))
 | 
			
		||||
        body = [
 | 
			
		||||
            '<li><a href="{0}/" title="Release {0}">{0}</a></li>'.format('.'.join(map(type(''), r)))
 | 
			
		||||
            for r in releases]
 | 
			
		||||
        body = '<ul class="release-list">{0}</ul>'.format(' '.join(body))
 | 
			
		||||
        index = template.format(title='Previous calibre releases (%s.x)' % sname, style=style,
 | 
			
		||||
                                msg='Choose a calibre release', body=body)
 | 
			
		||||
        with open('%s.html' % sname, 'wb') as f:
 | 
			
		||||
            f.write(index.encode('utf-8'))
 | 
			
		||||
 | 
			
		||||
        for r in releases:
 | 
			
		||||
            rname = '.'.join(map(type(''), r))
 | 
			
		||||
            os.chdir(rname)
 | 
			
		||||
            try:
 | 
			
		||||
                body = []
 | 
			
		||||
                files = os.listdir('.')
 | 
			
		||||
                windows = [x for x in files if x.endswith('.msi')]
 | 
			
		||||
                if windows:
 | 
			
		||||
                    windows = ['<li><a href="{0}" title="{1}">{1}</a></li>'.format(
 | 
			
		||||
                        x, 'Windows 64-bit Installer' if '64bit' in x else 'Windows 32-bit Installer')
 | 
			
		||||
                        for x in windows]
 | 
			
		||||
                    body.append('<dt>Windows</dt><dd><ul>{0}</ul></dd>'.format(' '.join(windows)))
 | 
			
		||||
                portable = [x for x in files if '-portable-' in x]
 | 
			
		||||
                if portable:
 | 
			
		||||
                    body.append('<dt>Calibre Portable</dt><dd><a href="{0}" title="{1}">{1}</a></dd>'.format(
 | 
			
		||||
                        portable[0], 'Calibre Portable Installer'))
 | 
			
		||||
                osx = [x for x in files if x.endswith('.dmg')]
 | 
			
		||||
                if osx:
 | 
			
		||||
                    body.append('<dt>Apple Mac</dt><dd><a href="{0}" title="{1}">{1}</a></dd>'.format(
 | 
			
		||||
                        osx[0], 'OS X Disk Image (.dmg)'))
 | 
			
		||||
                linux = [x for x in files if x.endswith('.bz2')]
 | 
			
		||||
                if linux:
 | 
			
		||||
                    linux = ['<li><a href="{0}" title="{1}">{1}</a></li>'.format(
 | 
			
		||||
                        x, 'Linux 64-bit binary' if 'x86_64' in x else 'Linux 32-bit binary')
 | 
			
		||||
                        for x in linux]
 | 
			
		||||
                    body.append('<dt>Linux</dt><dd><ul>{0}</ul></dd>'.format(' '.join(linux)))
 | 
			
		||||
                source = [x for x in files if x.endswith('.xz') or x.endswith('.gz')]
 | 
			
		||||
                if source:
 | 
			
		||||
                    body.append('<dt>Source Code</dt><dd><a href="{0}" title="{1}">{1}</a></dd>'.format(
 | 
			
		||||
                        source[0], 'Source code (all platforms)'))
 | 
			
		||||
 | 
			
		||||
                body = '<dl>{0}</dl>'.format(''.join(body))
 | 
			
		||||
                index = template.format(title='calibre release (%s)' % rname, style=style,
 | 
			
		||||
                                msg='', body=body)
 | 
			
		||||
                with open('index.html', 'wb') as f:
 | 
			
		||||
                    f.write(index.encode('utf-8'))
 | 
			
		||||
            finally:
 | 
			
		||||
                os.chdir('..')
 | 
			
		||||
 | 
			
		||||
# }}}
 | 
			
		||||
 | 
			
		||||
def upload_to_servers(files, version):  # {{{
 | 
			
		||||
    for server, rdir in {'files':'/usr/share/nginx/html'}.iteritems():
 | 
			
		||||
    base = '/srv/download/'
 | 
			
		||||
    dest = os.path.join(base, version)
 | 
			
		||||
    if not os.path.exists(dest):
 | 
			
		||||
        os.mkdir(dest)
 | 
			
		||||
    for src in files:
 | 
			
		||||
        shutil.copyfile(src, os.path.join(dest, os.path.basename(src)))
 | 
			
		||||
    generate_index()
 | 
			
		||||
 | 
			
		||||
    for server, rdir in {'files':'/srv/download/'}.iteritems():
 | 
			
		||||
        print('Uploading to server:', server)
 | 
			
		||||
        server = '%s.calibre-ebook.com' % server
 | 
			
		||||
        rdir = '%s/%s/' % (rdir, version)
 | 
			
		||||
        # Copy the generated index files
 | 
			
		||||
        print ('Copying generated index')
 | 
			
		||||
        check_call(['rsync', '-hzr', '-e', 'ssh -x', '--include', '*.html',
 | 
			
		||||
                    '--filter', '-! */', base, 'root@%s:%s' % (server, rdir)])
 | 
			
		||||
        # Copy the release files
 | 
			
		||||
        rdir = '%s%s/' % (rdir, version)
 | 
			
		||||
        for x in files:
 | 
			
		||||
            start = time.time()
 | 
			
		||||
            print ('Uploading', x)
 | 
			
		||||
@ -400,6 +499,7 @@ def upload_to_servers(files, version):  # {{{
 | 
			
		||||
                else:
 | 
			
		||||
                    break
 | 
			
		||||
            print ('Uploaded in', int(time.time() - start), 'seconds\n\n')
 | 
			
		||||
 | 
			
		||||
# }}}
 | 
			
		||||
 | 
			
		||||
def upload_to_dbs(files, version):  # {{{
 | 
			
		||||
@ -530,3 +630,4 @@ if __name__ == '__main__':
 | 
			
		||||
# }}}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -19,10 +19,9 @@ from setup import Command, __version__, installer_name, __appname__
 | 
			
		||||
PREFIX = "/var/www/calibre-ebook.com"
 | 
			
		||||
DOWNLOADS = PREFIX+"/htdocs/downloads"
 | 
			
		||||
BETAS = DOWNLOADS +'/betas'
 | 
			
		||||
USER_MANUAL = '/var/www/localhost/htdocs/'
 | 
			
		||||
HTML2LRF = "calibre/ebooks/lrf/html/demo"
 | 
			
		||||
TXT2LRF  = "src/calibre/ebooks/lrf/txt/demo"
 | 
			
		||||
STAGING_HOST = '67.207.135.179'
 | 
			
		||||
STAGING_HOST = 'download.calibre-ebook.com'
 | 
			
		||||
STAGING_USER = 'root'
 | 
			
		||||
STAGING_DIR = '/root/staging'
 | 
			
		||||
 | 
			
		||||
@ -141,8 +140,8 @@ class UploadInstallers(Command):  # {{{
 | 
			
		||||
            os.mkdir(backup)
 | 
			
		||||
        try:
 | 
			
		||||
            self.upload_to_staging(tdir, backup, files)
 | 
			
		||||
            self.upload_to_sourceforge()
 | 
			
		||||
            self.upload_to_calibre()
 | 
			
		||||
            self.upload_to_sourceforge()
 | 
			
		||||
            self.upload_to_dbs()
 | 
			
		||||
            # self.upload_to_google(opts.replace)
 | 
			
		||||
        finally:
 | 
			
		||||
@ -219,9 +218,9 @@ class UploadUserManual(Command):  # {{{
 | 
			
		||||
        for x in glob.glob(self.j(path, '*')):
 | 
			
		||||
            self.build_plugin_example(x)
 | 
			
		||||
 | 
			
		||||
        for host in ('download', 'files'):
 | 
			
		||||
            check_call(' '.join(['rsync', '-z', '-r', '--progress',
 | 
			
		||||
            'manual/.build/html/',
 | 
			
		||||
                    'bugs:%s'%USER_MANUAL]), shell=True)
 | 
			
		||||
                'manual/.build/html/', '%s:/srv/manual/' % host]), shell=True)
 | 
			
		||||
# }}}
 | 
			
		||||
 | 
			
		||||
class UploadDemo(Command):  # {{{
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user