コード例 #1
0
ファイル: render.py プロジェクト: vprusa/mwlib
    def get_environment(self):
        from mwlib.status import Status
        from mwlib import nuwiki

        env = self.parser.makewiki()
        if (isinstance(env.wiki, (nuwiki.NuWiki, nuwiki.adapt))
                or isinstance(env, wiki.MultiEnvironment)):
            self.status = Status(self.options.status_file,
                                 progress_range=(0, 100))
            return env

        from mwlib.apps.buildzip import make_zip
        self.zip_filename = make_zip(output=self.options.keep_zip,
                                     options=self.options,
                                     metabook=env.metabook,
                                     status=self.status)

        if env.images:
            try:
                env.images.clear()
            except OSError as err:
                if err.errno != errno.ENOENT:
                    raise

        env = wiki.makewiki(self.zip_filename)
        self.status = Status(self.options.status_file,
                             progress_range=(34, 100))
        return env
コード例 #2
0
ファイル: postman.py プロジェクト: uncletall/mwlib
def uploadfile(ipath, posturl, fh=None):
    if fh is None:
        fh = open(ipath, "rb")
    
    podclient = PODClient(posturl)

    status = Status(podclient=podclient)
    
    try:
        status(status='uploading', progress=0)
        podclient.streaming_post_zipfile(ipath, fh)
        status(status='finished', progress=100)
    except Exception, err:
        status(status='error')
        raise err
コード例 #3
0
ファイル: __init__.py プロジェクト: vprusa/mwlib
def post():
    parser = optparse.OptionParser(usage="%prog OPTIONS")
    parser.add_option("-i", "--input", help="ZIP file to POST")
    parser.add_option('-l', '--logfile', help='log output to LOGFILE')
    parser.add_option("-p", "--posturl", help="HTTP POST ZIP file to POSTURL")
    parser.add_option(
        "-g",
        "--getposturl",
        help='get POST URL from PediaPress.com, open upload page in webbrowser',
        action='store_true')
    options, args = parser.parse_args()

    use_help = 'Use --help for usage information.'
    if not options.input:
        parser.error('Specify --input.\n' + use_help)
    if (options.posturl and options.getposturl)\
            or (not options.posturl and not options.getposturl):
        parser.error('Specify either --posturl or --getposturl.\n' + use_help)
    if options.posturl:
        from mwlib.podclient import PODClient
        podclient = PODClient(options.posturl)
    elif options.getposturl:
        import webbrowser
        from mwlib.podclient import podclient_from_serviceurl
        podclient = podclient_from_serviceurl(
            'http://pediapress.com/api/collections/')
        webbrowser.open(podclient.redirecturl)

    from mwlib import utils
    from mwlib.status import Status

    if options.logfile:
        utils.start_logging(options.logfile)

    status = Status(podclient=podclient)

    try:
        status(status='uploading', progress=0)
        podclient.post_zipfile(options.input)
        status(status='finished', progress=100)
    except Exception as e:
        status(status='error')
        raise
コード例 #4
0
ファイル: postman.py プロジェクト: uncletall/mwlib
def report_mwzip_status(posturl, jobid, host, port):
    podclient = PODClient(posturl)
    status = Status(podclient=podclient)
    
    from mwlib.async import rpcclient
    sp = rpcclient.serverproxy(host, port)

    last = {}
    while 1:
        res = sp.qinfo(jobid=jobid) or {}
        
        done = res.get("done", False)
        if done:
            break
        info = res.get("info", {})
        if info!=last:
            status(status=info.get("status", "fetching"),
                   progress=info.get("progress", 0.0))
            last = info
        else:
            gevent.sleep(0.5)
コード例 #5
0
ファイル: postman.py プロジェクト: uncletall/mwlib
def report_upload_status(posturl, fh):
    podclient = PODClient(posturl)
    
    fh.seek(0, 2)
    size = fh.tell()
    fh.seek(0, 0)

    status = Status(podclient=podclient)
    numdots = 0
    
    last = None
    while 1:
        cur = fh.tell()
        if cur != last:
            if cur==size:
                break
            numdots = (numdots + 1) % 10
            status("uploading"+"."*numdots,  progress=100.0*cur/size)
            last = cur
                
        else:
            gevent.sleep(0.1)
コード例 #6
0
ファイル: buildzip.py プロジェクト: uncletall/mwlib
def main():
    from gevent import monkey
    monkey.patch_all(thread=False)

    from mwlib.options import OptionParser
    from mwlib import conf

    parser = OptionParser()
    parser.add_option("-o", "--output", help="write output to OUTPUT")
    parser.add_option("-p",
                      "--posturl",
                      help="http post to POSTURL (directly)")
    parser.add_option(
        "-g",
        "--getposturl",
        help='get POST URL from PediaPress.com, open upload page in webbrowser',
        action='count',
    )
    parser.add_option(
        '--keep-tmpfiles',
        action='store_true',
        default=False,
        help="don't remove  temporary files like images",
    )

    parser.add_option("-s",
                      "--status-file",
                      help='write status/progress info to this file')

    options, args = parser.parse_args()
    conf.readrc()
    use_help = 'Use --help for usage information.'

    if parser.metabook is None and options.collectionpage is None:
        parser.error(
            'Neither --metabook nor, --collectionpage or arguments specified.\n'
            + use_help)
    if options.posturl and options.getposturl:
        parser.error('Specify either --posturl or --getposturl.\n' + use_help)
    if not options.posturl and not options.getposturl and not options.output:
        parser.error(
            'Neither --output, nor --posturl or --getposturl specified.\n' +
            use_help)
    if options.posturl:
        from mwlib.podclient import PODClient
        podclient = PODClient(options.posturl)
    elif options.getposturl:
        if options.getposturl > 1:
            serviceurl = 'http://test.pediapress.com/api/collections/'
        else:
            serviceurl = 'http://pediapress.com/api/collections/'
        import webbrowser
        from mwlib.podclient import podclient_from_serviceurl
        podclient = podclient_from_serviceurl(serviceurl)
        pid = os.fork()
        if not pid:
            try:
                webbrowser.open(podclient.redirecturl)
            finally:
                os._exit(0)
        import time
        time.sleep(1)
        try:
            os.kill(pid, 9)
        except:
            pass

    else:
        podclient = None

    from mwlib import utils, wiki

    filename = None
    status = None
    try:
        env = parser.makewiki()
        assert env.metabook, "no metabook"

        from mwlib.status import Status
        status = Status(options.status_file,
                        podclient=podclient,
                        progress_range=(1, 90))
        status(progress=0)
        output = options.output

        make_zip(output,
                 options,
                 env.metabook,
                 podclient=podclient,
                 status=status)

    except Exception, e:
        if status:
            status(status='error')
        raise
コード例 #7
0
def buildzip():
    from mwlib.options import OptionParser

    parser = OptionParser()
    parser.add_option("-o", "--output", help="write output to OUTPUT")
    parser.add_option("-p",
                      "--posturl",
                      help="http post to POSTURL (directly)")
    parser.add_option(
        "-g",
        "--getposturl",
        help='get POST URL from PediaPress.com, open upload page in webbrowser',
        action='store_true',
    )
    options, args = parser.parse_args()

    use_help = 'Use --help for usage information.'
    if parser.metabook is None and options.collectionpage is None:
        parser.error(
            'Neither --metabook nor, --collectionpage or arguments specified.\n'
            + use_help)
    if options.posturl and options.getposturl:
        parser.error('Specify either --posturl or --getposturl.\n' + use_help)
    if not options.posturl and not options.getposturl and not options.output:
        parser.error(
            'Neither --output, nor --posturl or --getposturl specified.\n' +
            use_help)
    if options.posturl:
        from mwlib.podclient import PODClient
        podclient = PODClient(options.posturl)
    elif options.getposturl:
        import webbrowser
        from mwlib.podclient import podclient_from_serviceurl
        podclient = podclient_from_serviceurl(
            'http://pediapress.com/api/collections/')
        webbrowser.open(podclient.redirecturl)
    else:
        podclient = None

    from mwlib import utils

    if options.daemonize:
        utils.daemonize()
    if options.pid_file:
        open(options.pid_file, 'wb').write('%d\n' % os.getpid())

    filename = None
    status = None
    try:
        try:
            env = parser.makewiki()

            from mwlib.status import Status
            from mwlib import zipcreator

            status = Status(podclient=podclient, progress_range=(1, 90))
            status(status='parsing', progress=0)

            filename = zipcreator.make_zip_file(
                options.output,
                env,
                status=status,
                num_threads=options.num_threads,
                imagesize=options.imagesize,
            )

            status = Status(podclient=podclient, progress_range=(91, 100))
            if podclient:
                status(status='uploading', progress=0)
                podclient.post_zipfile(filename)

            status(status='finished', progress=100)
        except Exception, e:
            if status:
                status(status='error')
            raise
    finally:
        if options.output is None and filename is not None:
            print 'removing %r' % filename
            utils.safe_unlink(filename)
        if options.pid_file:
            utils.safe_unlink(options.pid_file)
コード例 #8
0
def post():
    parser = optparse.OptionParser(usage="%prog OPTIONS")
    parser.add_option("-i", "--input", help="ZIP file to POST")
    parser.add_option(
        '-l',
        '--logfile',
        help='log output to LOGFILE',
    )
    parser.add_option("-p", "--posturl", help="HTTP POST ZIP file to POSTURL")
    parser.add_option(
        "-g",
        "--getposturl",
        help='get POST URL from PediaPress.com, open upload page in webbrowser',
        action='store_true',
    )
    parser.add_option("-d",
                      "--daemonize",
                      action="store_true",
                      help='become a daemon process as soon as possible')
    parser.add_option(
        '--pid-file',
        help='write PID of daemonized process to this file',
    )
    options, args = parser.parse_args()

    use_help = 'Use --help for usage information.'
    if not options.input:
        parser.error('Specify --input.\n' + use_help)
    if (options.posturl and options.getposturl)\
        or (not options.posturl and not options.getposturl):
        parser.error('Specify either --posturl or --getposturl.\n' + use_help)
    if options.posturl:
        from mwlib.podclient import PODClient
        podclient = PODClient(options.posturl)
    elif options.getposturl:
        import webbrowser
        from mwlib.podclient import podclient_from_serviceurl
        podclient = podclient_from_serviceurl(
            'http://pediapress.com/api/collections/')
        webbrowser.open(podclient.redirecturl)

    from mwlib import utils
    from mwlib.status import Status

    if options.logfile:
        utils.start_logging(options.logfile)

    if options.daemonize:
        utils.daemonize()
    if options.pid_file:
        open(options.pid_file, 'wb').write('%d\n' % os.getpid())

    status = Status(podclient=podclient)

    try:
        try:
            status(status='uploading', progress=0)
            podclient.post_zipfile(options.input)
            status(status='finished', progress=100)
        except Exception, e:
            status(status='error')
            raise
    finally:
        if options.pid_file:
            utils.safe_unlink(options.pid_file)
コード例 #9
0
    writer = load_writer(options.writer)
    writer_options = {}
    if options.writer_options:
        for wopt in options.writer_options.split(';'):
            if '=' in wopt:
                key, value = wopt.split('=', 1)
                writer_options[key] = value
            else:
                writer_options[wopt] = True

    if options.daemonize:
        utils.daemonize()
    if options.pid_file:
        open(options.pid_file, 'wb').write('%d\n' % os.getpid())

    status = Status(options.status_file, progress_range=(1, 70))
    status(status='parsing', progress=0)

    env = None
    try:
        try:
            env = parser.makewiki()

            if not isinstance(env.wiki, zipwiki.Wiki)\
                or not isinstance(env.images, zipwiki.ImageDB):
                zip_filename = zipcreator.make_zip_file(
                    options.keep_zip,
                    env,
                    status=status,
                    num_threads=options.num_threads,
                    imagesize=options.imagesize,
コード例 #10
0
ファイル: render.py プロジェクト: vprusa/mwlib
    def __call__(self):
        options, args, parser = self.parse_options()
        conf.readrc()

        self.parser = parser
        self.options = options

        import tempfile
        from mwlib.writerbase import WriterError
        from mwlib.status import Status

        use_help = 'Use --help for usage information.'

        if options.list_writers:
            self.list_writers()
            return

        if options.writer_info:
            self.show_writer_info(options.writer_info)
            return

        if options.output is None:
            parser.error('Please specify an output file with --output.\n' +
                         use_help)

        options.output = os.path.abspath(options.output)

        if options.writer is None:
            parser.error('Please specify a writer with --writer.\n' + use_help)

        writer = self.load_writer(options.writer)
        writer_options = {}
        if options.writer_options:
            for wopt in options.writer_options.split(';'):
                if '=' in wopt:
                    key, value = wopt.split('=', 1)
                else:
                    key, value = wopt, True
                writer_options[str(key)] = value
        if options.language:
            writer_options['lang'] = options.language
        for option in writer_options.keys():
            if option not in getattr(writer, 'options', {}):
                print 'Warning: unknown writer option %r' % option
                del writer_options[option]

        init_tmp_cleaner()

        self.status = Status(options.status_file, progress_range=(1, 33))
        self.status(progress=0)

        env = None
        try:
            env = self.get_environment()

            try:
                _locale.set_locale_from_lang(
                    env.wiki.siteinfo["general"]["lang"])
            except BaseException as err:
                print "Error: could not set locale", err

            basename = os.path.basename(options.output)
            if '.' in basename:
                ext = '.' + basename.rsplit('.', 1)[-1]
            else:
                ext = ''
            fd, tmpout = tempfile.mkstemp(dir=os.path.dirname(options.output),
                                          suffix=ext)
            os.close(fd)
            writer(env,
                   output=tmpout,
                   status_callback=self.status,
                   **writer_options)
            os.rename(tmpout, options.output)
            kwargs = {}
            if hasattr(writer, 'content_type'):
                kwargs['content_type'] = writer.content_type
            if hasattr(writer, 'file_extension'):
                kwargs['file_extension'] = writer.file_extension
            self.status(status='finished', progress=100, **kwargs)
            if options.keep_zip is None and self.zip_filename is not None:
                utils.safe_unlink(self.zip_filename)
        except Exception as e:
            import traceback
            self.status(status='error')
            if options.error_file:
                fd, tmpfile = tempfile.mkstemp(
                    dir=os.path.dirname(options.error_file))
                f = os.fdopen(fd, 'wb')
                if isinstance(e, WriterError):
                    f.write(str(e))
                else:
                    f.write('traceback\n')
                    traceback.print_exc(file=f)
                f.write("sys.argv=%r\n" % (utils.garble_password(sys.argv), ))
                f.close()
                os.rename(tmpfile, options.error_file)
            raise
        finally:
            if env is not None and env.images is not None:
                try:
                    if not options.keep_tmpfiles:
                        env.images.clear()
                except OSError as e:
                    if e.errno != errno.ENOENT:
                        print 'ERROR: Could not remove temporary images: %s' % e, e.errno