Ejemplo n.º 1
0
def install(data):
    global user_created, database_created, language_created

    print "Creating database ..."

    # Several subsequent commands will run as Critic system user or "postgres" user,
    # and these users typically don't have read access to the installation 'root_dir'
    root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")
    original_dir = os.getcwd()
    try:
        # Set cwd to something that Critic system / "postgres" users has access to.
        os.chdir(tempfile.gettempdir())

        process.check_output([
            "su", "-c",
            "psql -c 'CREATE USER \"%s\";'" % installation.system.username,
            "postgres"
        ])
        user_created = True

        process.check_output(
            ["su", "-c", "psql -c 'CREATE DATABASE \"critic\";'", "postgres"])
        database_created = True

        try:
            process.check_output(
                ["su", "-c", "createlang plpgsql critic", "postgres"],
                stderr=process.STDOUT)
            language_created = True
        except process.CalledProcessError, error:
            if re.search(r"\blanguage\b.*\balready installed\b", error.output):
                pass
            else:
                raise

        process.check_output([
            "su", "-c",
            "psql -c 'GRANT ALL ON DATABASE \"critic\" TO \"%s\";'" %
            installation.system.username, "postgres"
        ])
        psql_import(os.path.join(root_dir, "dbschema.sql"))
        psql_import(os.path.join(root_dir, "dbschema.comments.sql"))
        psql_import(os.path.join(root_dir, "path.pgsql"))
        psql_import(os.path.join(root_dir, "comments.pgsql"))
        psql_import(os.path.join(root_dir, "roles.sql"))

        import psycopg2

        def adapt(value):
            return psycopg2.extensions.adapt(value).getquoted()

        process.check_input(
            [
                "su", "-s", "/bin/sh", "-c", "psql -q -f -",
                installation.system.username
            ],
            stdin=
            ("""INSERT INTO systemidentities (key, name, url_prefix, description)
                                          VALUES ('main', 'main', %s, 'Main');"""
             % adapt("http://%s" % installation.system.hostname)))
Ejemplo n.º 2
0
def install(data):
    global user_created, database_created, language_created

    print "Creating database ..."

    # Several subsequent commands will run as Critic system user or "postgres" user,
    # and these users typically don't have read access to the installation 'root_dir'
    root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")
    original_dir = os.getcwd()
    try:
        # Set cwd to something that Critic system / "postgres" users has access to.
        os.chdir(tempfile.gettempdir())

        process.check_output(["su", "-c", "psql -v ON_ERROR_STOP=1 -c 'CREATE USER \"%s\";'" % installation.system.username, "postgres"])
        user_created = True

        process.check_output(["su", "-c", "psql -v ON_ERROR_STOP=1 -c 'CREATE DATABASE \"critic\";'", "postgres"])
        database_created = True

        try:
            process.check_output(["su", "-c", "createlang plpgsql critic", "postgres"], stderr=process.STDOUT)
            language_created = True
        except process.CalledProcessError:
            # The 'createlang' command fails if the language is already enabled
            # in the database, and we want to ignore such failures.  It might
            # also fail for other reasons, that we really don't mean to ignore,
            # but in that case importing the *.pgsql files below would fail,
            # since they define PL/pgSQL functions.
            pass

        process.check_output(["su", "-c", "psql -v ON_ERROR_STOP=1 -c 'GRANT ALL ON DATABASE \"critic\" TO \"%s\";'" % installation.system.username, "postgres"])
        psql_import(os.path.join(root_dir, "dbschema.sql"))
        psql_import(os.path.join(root_dir, "dbschema.comments.sql"))
        psql_import(os.path.join(root_dir, "comments.pgsql"))
        psql_import(os.path.join(root_dir, "roles.sql"))

        import psycopg2

        def adapt(value): return psycopg2.extensions.adapt(value).getquoted()

        quoted_urlprefix = adapt("http://%s" % installation.system.hostname)
        quoted_installed_sha1 = adapt(data["sha1"])
        add_systemidentity_query = """INSERT INTO systemidentities (key, name, url_prefix, description, installed_sha1)
                                          VALUES ('main', 'main', %s, 'Main', %s);""" \
                                   % (quoted_urlprefix, quoted_installed_sha1)
        process.check_input(["su", "-s", "/bin/sh", "-c", "psql -q -v ON_ERROR_STOP=1 -f -", installation.system.username],
                            stdin=add_systemidentity_query)

    finally:
        os.chdir(original_dir)

    return True
Ejemplo n.º 3
0
def install(data):
    global user_created, database_created, language_created

    print "Creating database ..."

    # Several subsequent commands will run as Critic system user or "postgres" user,
    # and these users typically don't have read access to the installation 'root_dir'
    root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")
    original_dir = os.getcwd()
    try:
        # Set cwd to something that Critic system / "postgres" users has access to.
        os.chdir(tempfile.gettempdir())

        process.check_output(["su", "-c", "psql -c 'CREATE USER \"%s\";'" % installation.system.username, "postgres"])
        user_created = True

        process.check_output(["su", "-c", "psql -c 'CREATE DATABASE \"critic\";'", "postgres"])
        database_created = True

        try:
            process.check_output(["su", "-c", "createlang plpgsql critic", "postgres"], stderr=process.STDOUT)
            language_created = True
        except process.CalledProcessError, error:
            if re.search(r"\blanguage\b.*\balready installed\b", error.output): pass
            else: raise

        process.check_output(["su", "-c", "psql -c 'GRANT ALL ON DATABASE \"critic\" TO \"%s\";'" % installation.system.username, "postgres"])
        psql_import(os.path.join(root_dir, "dbschema.sql"))
        psql_import(os.path.join(root_dir, "dbschema.comments.sql"))
        psql_import(os.path.join(root_dir, "path.pgsql"))
        psql_import(os.path.join(root_dir, "comments.pgsql"))
        psql_import(os.path.join(root_dir, "roles.sql"))

        import psycopg2

        def adapt(value): return psycopg2.extensions.adapt(value).getquoted()

        process.check_input(["su", "-s", "/bin/sh", "-c", "psql -q -f -", installation.system.username],
                            stdin=("""INSERT INTO systemidentities (key, name, url_prefix, description)
                                          VALUES ('main', 'main', %s, 'Main');"""
                                   % adapt("http://%s" % installation.system.hostname)))
Ejemplo n.º 4
0
def prepare(mode, arguments, data):
    global username, email, fullname, password

    if mode == "install":
        print """
Critic Installation: Administrator
==================================

The administrator user receives email notifications about unexpected
errors that occur.  He/she can also do various things using the Web
interface that most users are not allowed to do.

This user does not need to match a system user on this machine.
"""

        if arguments.admin_username: username = arguments.admin_username
        else: username = installation.input.string(prompt="Administrator user name:")

        if arguments.admin_email: email = arguments.admin_email
        else: email = installation.input.string(prompt="Administrator email address:")

        if arguments.admin_fullname: fullname = arguments.admin_fullname
        else: fullname = installation.input.string(prompt="Administrator full name:")

        if installation.config.auth_mode == "critic":
            if arguments.admin_password: plaintext = arguments.admin_password
            else: plaintext = installation.input.password("Password for '%s':" % username)

            try:
                import bcrypt
            except ImportError:
                # It should have been installed by now, but for some reason it
                # doesn't always work to import it into this Python process, so
                # we have to do it in a child process instead.
                password = process.check_input(
                    [sys.executable, "-c", "import sys, bcrypt; sys.stdout.write(bcrypt.hashpw(sys.stdin.read(), bcrypt.gensalt()))"],
                    stdin=plaintext, stdout=process.PIPE)
            else:
                password = bcrypt.hashpw(plaintext, bcrypt.gensalt())
    else:
        import configuration

        admin = configuration.base.ADMINISTRATORS[0]

        username = admin["name"]
        email = admin["email"]
        fullname = admin["fullname"]

    data["installation.admin.username"] = username
    data["installation.admin.email"] = email
    data["installation.admin.fullname"] = fullname

    return True
Ejemplo n.º 5
0
def install(data):
    import psycopg2

    def adapt(value): return psycopg2.extensions.adapt(value).getquoted()

    process.check_input(["su", "-s", "/bin/sh", "-c", "psql -q -v ON_ERROR_STOP=1 -f -", installation.system.username],
                        stdin=("""INSERT INTO users (name, email, password, fullname, status)
                                      VALUES (%s, %s, %s, %s, 'current');"""
                               % (adapt(username),
                                  adapt(email),
                                  adapt(password),
                                  adapt(fullname))))

    process.check_input(["su", "-s", "/bin/sh", "-c", "psql -q -v ON_ERROR_STOP=1 -f -", installation.system.username],
                        stdin=("""INSERT INTO userroles (uid, role)
                                       SELECT id, 'administrator'
                                         FROM users
                                        WHERE name=%s;"""
                               % adapt(username)))

    process.check_input(["su", "-s", "/bin/sh", "-c", "psql -q -v ON_ERROR_STOP=1 -f -", installation.system.username],
                        stdin=("""INSERT INTO userroles (uid, role)
                                       SELECT id, 'repositories'
                                         FROM users
                                        WHERE name=%s;"""
                               % adapt(username)))

    return True
Ejemplo n.º 6
0
def install(data):
    import psycopg2

    def adapt(value):
        return psycopg2.extensions.adapt(value).getquoted()

    process.check_input(
        [
            "su", "-s", "/bin/sh", "-c", "psql -q -f -",
            installation.system.username
        ],
        stdin=(
            """INSERT INTO users (name, email, password, fullname, status)
                                      VALUES (%s, %s, %s, %s, 'current');""" %
            (adapt(username), adapt(email), adapt(password), adapt(fullname))))

    process.check_input([
        "su", "-s", "/bin/sh", "-c", "psql -q -f -",
        installation.system.username
    ],
                        stdin=("""INSERT INTO userroles (uid, role)
                                       SELECT id, 'administrator'
                                         FROM users
                                        WHERE name=%s;""" % adapt(username)))

    process.check_input([
        "su", "-s", "/bin/sh", "-c", "psql -q -f -",
        installation.system.username
    ],
                        stdin=("""INSERT INTO userroles (uid, role)
                                       SELECT id, 'repositories'
                                         FROM users
                                        WHERE name=%s;""" % adapt(username)))

    return True
Ejemplo n.º 7
0
        language_created = True
    except process.CalledProcessError, error:
        if re.search(r"\blanguage\b.*\balready installed\b", error.output): pass
        else: raise

    process.check_output(["su", "-c", "psql -c 'GRANT ALL ON DATABASE \"critic\" TO \"%s\";'" % installation.system.username, "postgres"])
    process.check_output(["su", "-s", "/bin/sh", "-c", "psql -f dbschema.sql", installation.system.username])
    process.check_output(["su", "-s", "/bin/sh", "-c", "psql -f dbschema.comments.sql", installation.system.username])
    process.check_output(["su", "-s", "/bin/sh", "-c", "psql -f path.pgsql", installation.system.username])
    process.check_output(["su", "-s", "/bin/sh", "-c", "psql -f comments.pgsql", installation.system.username])
    process.check_output(["su", "-s", "/bin/sh", "-c", "psql -f roles.sql", installation.system.username])

    import psycopg2

    def adapt(value): return psycopg2.extensions.adapt(value).getquoted()

    process.check_input(["su", "-s", "/bin/sh", "-c", "psql -q -f -", installation.system.username],
                        stdin=("""INSERT INTO systemidentities (key, name, url_prefix, description)
                                      VALUES ('main', 'main', %s, 'Main');"""
                               % adapt("http://%s" % installation.system.hostname)))

    return True

def undo():
    if language_created:
        process.check_output(["su", "-c", "droplang plpgsql critic", "postgres"])
    if database_created:
        process.check_output(["su", "-c", "psql -c 'DROP DATABASE \"critic\";'", "postgres"])
    if user_created:
        process.check_output(["su", "-c", "psql -c 'DROP USER \"%s\";'" % installation.system.username, "postgres"])