예제 #1
0
class CollabRequest(object):
    def __init__(self, collab=None, user=None, backend=backend):
        farmconf = backend.config.get("collab", "farmconf")
        self.farmconfdir = os.path.dirname(farmconf)
        self.request = None

        if collab:
            self.confdir = os.path.join(backend.wikidir, collab, "config")
        else:
            baseinstancedir = backend.config.get("collab", "baseinstancedir")
            self.confdir = os.path.join(baseinstancedir, "config")

        if not os.path.isdir(self.confdir):
            raise OSError(errno.ENOENT, "No such directory: " + self.confdir)

        if user:
            self.user = user
        else:
            self.user = pwd.getpwuid(posix.getuid())[0]

        sys.path.insert(0, self.confdir)

        multiconfig._url_re_cache = None
        multiconfig._farmconfig_mtime = None
        multiconfig._config_cache = {}

        import farmconfig
        reload(farmconfig)

        self.request = MinimalMoinScript("FrontPage", parse=False)
        self.request.user = self.getUser(self.user)

    def __del__(self):
        self.close()

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        self.close()

    def close(self):
        if self.request:
            self.request.finish()
            self.request = None
        if sys.path:
            if self.confdir in sys.path:
                sys.path.remove(self.confdir)
            if self.farmconfdir in sys.path:
                sys.path.remove(self.farmconfdir)

    def validUser(self, user):
        return getUserId(self.request, user) != None

    def getUser(self, user):
        return User(self.request, auth_username=user)
예제 #2
0
def run():
    usage = "usage: %prog [options] <path to wiki> <pagename>"
    parser = OptionParser(usage=usage)
    parser.add_option("-v",
                      "--verbose",
                      action="store_true",
                      dest="verbose",
                      help="Report success")
    parser.add_option("-a",
                      "--auth",
                      action="store_true",
                      dest="auth",
                      help="Use local user-based wiki authentication")
    parser.add_option("-c",
                      "--comment",
                      dest="comment",
                      help="Optional change comment for the edit")

    (options, args) = parser.parse_args()

    if len(args) != 2:
        print parser.get_usage()
        sys.exit(2)

    # Configdir to path, so wikiconfig can be imported by Request
    cp = args[0]
    cp2 = os.path.join(cp, 'config')
    if os.path.isdir(cp2):
        cp = cp2
    sys.path.insert(0, cp)

    pagename = unicode(args[1], sys.getfilesystemencoding())

    # Make a new request for the page
    req = MinimalMoinScript(pagename, parse=False)
    req.page = Page(req, pagename)

    # Auth
    if options.auth:
        import posix, pwd
        # We need to import contexts before importing users, because otherwise
        # the relative imports in MoinMoin will fail.
        import MoinMoin.web.contexts
        from MoinMoin.user import User
        req.user = User(req, auth_username=pwd.getpwuid(posix.getuid())[0])

    mytext = unicode(sys.stdin.read(), sys.getfilesystemencoding())

    if options.comment:
        savetext(req, pagename, mytext, comment=unicode(options.comment))
    else:
        savetext(req, pagename, mytext)

    # Must finish the request to ensure that metadata is saved
    graphdata_close(req)
예제 #3
0
    def __init__(self, collab=None, user=None, backend=backend):
        farmconf = backend.config.get("collab", "farmconf")
        self.farmconfdir = os.path.dirname(farmconf)
        self.request = None

        if collab:
            self.confdir = os.path.join(backend.wikidir, collab, "config")
        else:
            baseinstancedir = backend.config.get("collab", "baseinstancedir")
            self.confdir = os.path.join(baseinstancedir, "config")

        if not os.path.isdir(self.confdir):
            raise OSError(errno.ENOENT, "No such directory: " + self.confdir)

        if user:
            self.user = user
        else:
            self.user = pwd.getpwuid(posix.getuid())[0]

        sys.path.insert(0, self.confdir)

        multiconfig._url_re_cache = None
        multiconfig._farmconfig_mtime = None
        multiconfig._config_cache = {}

        import farmconfig
        reload(farmconfig)

        self.request = MinimalMoinScript("FrontPage", parse=False)
        self.request.user = self.getUser(self.user)
예제 #4
0
def run():
    usage = "usage: %prog [options] <path to wiki> <pagename>"
    parser = OptionParser(usage=usage)
    parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
                      help="Report success")
    parser.add_option("-a", "--auth", action="store_true", dest="auth",
                      help="Use local user-based wiki authentication")
    parser.add_option("-c", "--comment", dest="comment",
                      help="Optional change comment for the edit")

    (options, args) = parser.parse_args()

    if len(args) != 2:
        print parser.get_usage()
        sys.exit(2)

    # Configdir to path, so wikiconfig can be imported by Request
    cp = args[0]
    cp2 = os.path.join(cp, 'config')
    if os.path.isdir(cp2):
        cp = cp2
    sys.path.insert(0, cp)

    pagename = unicode(args[1], sys.getfilesystemencoding())

    # Make a new request for the page
    req = MinimalMoinScript(pagename, parse=False)
    req.page = Page(req, pagename)

    # Auth
    if options.auth:
        import posix, pwd
        # We need to import contexts before importing users, because otherwise
        # the relative imports in MoinMoin will fail.
        import MoinMoin.web.contexts
        from MoinMoin.user import User
        req.user = User(req, auth_username=pwd.getpwuid(posix.getuid())[0])

    mytext = unicode(sys.stdin.read(), sys.getfilesystemencoding())

    if options.comment:
        savetext(req, pagename, mytext, comment=unicode(options.comment))
    else:
        savetext(req, pagename, mytext)

    # Must finish the request to ensure that metadata is saved
    graphdata_close(req)
예제 #5
0
def run():
    pages = []
    retain_shelve = False

    usage = "usage: %prog [options] <path-to-wiki> [pagename(s)]\n"
    parser = OptionParser(usage=usage)

    parser.add_option("-f", "--file", dest="filename",
                      help="write shelve to FILE")

    parser.add_option("-u", "--update_underlay", dest="underlay_only", 
                      action='store_true', default=False,
                      help="Only update underlay pages")

    (options, args) = parser.parse_args()
    help = parser.format_help()

    # Encoder from unicode to charset selected in config
    encoder = getencoder(config.charset)
    def _e(str):
        return encoder(str, 'replace')[0]

    class UserInputException(Exception):
        pass

    try:
        wikipath = args[0]
        configdir = os.path.abspath(os.path.join(wikipath, 'config'))

        sys.path.insert(0, configdir)

        request = MinimalMoinScript(parse=False)
        datadir = request.cfg.data_dir

        # Get a list of all pages
        root = RootPage(request)
        filter=None
        if options.underlay_only:
            retain_shelve = True

            def filterStandard(name):
                pageobj = Page(request, name)
                return pageobj.getPageStatus()[0]

            filter = filterStandard
        if options.filename:
            retain_shelve = True

        if len(args) > 1:
            pagelist = [unicode(x, sys.getfilesystemencoding()) for x in args[1:]]
            pageobjs = list()

            for page in pagelist:
                pageobj = Page(request, page)
                if not pageobj.exists():
                    raise UserInputException(page)
                pageobjs.append(pageobj)

            pages = pageobjs
            retain_shelve = True
        else:
            pages = root.getPageList(user="", include_underlay=True, filter=filter,
                                     return_objects=True, includeBackend=False)

    except IndexError:
        print >> sys.stderr, help
        sys.exit(3)
    except UserInputException, page:
        print >> sys.stderr, "page %s does not exist" % (page)
        print >> sys.stderr, help
        sys.exit(2)
예제 #6
0
            sys.stderr.write('Removed graphdata directory (%s)\n' % gddir)
    elif not options.filename:
        for file in os.listdir(datadir):
            if file.startswith('read_lock') or file.startswith('write_lock'):
                sys.stderr.write("Found lockfile (%s), \n" % file + \
                                 "database may be corrupted. \n" + \
                                 "Rehash entire db or remove lock " + \
                                 "and rehash the crashed pages.\n")
                sys.exit(1)

    total = len(pages)
    padding = len(str(total))
    count = 1

    # Just init one request
    scriptcontext = MinimalMoinScript(parse=False)
    scriptcontext.graphdata.clear_metas()
    # If you want to rehash into separate shelve, ignore locks, create a
    # new shelve from scratch
    if options.filename:
        from graphingwiki.backend.shelvedb import GraphData
        scriptcontext._graphdata = GraphData(scriptcontext)
        scriptcontext._graphdata.close()
        if os.path.exists(options.filename):
            if not os.path.isfile(options.filename):
                sys.stderr.write("Destination not a file: %s\n" % 
                                 (options.filename))
                sys.exit(1)
            os.unlink(options.filename)
        scriptcontext._graphdata.db = scriptcontext._graphdata.shelveopen(options.filename, "c")
        scriptcontext._graphdata.readlock = lambda: None