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)))
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
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)))
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
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
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
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"])