コード例 #1
0
ファイル: site_convert.py プロジェクト: pylanglois/uwsa
    def to_dev(self, args):
        completed = False
        args.remove("todev")

        site_name = self.ask_site_name(self.get_next_arg(args))
        if not self.is_conf_exists(site_name):
            completed = True
            print t("Sorry, the site '%s' does not exists.") % site_name
            return completed
        self.load(site_name)

        site_path, root_path, log_path, upload_tmp_path = self.generate_dir()
        errors = False

        if self.conf.get("mysql", "enabled"):
            schema = self.conf.get("mysql", "schema")
            # user = self.conf.get('mysql', 'user')
            # password = self.conf.get('mysql', 'pass')
            if inputs.get_input_yesno(t("The schema '%s' will be converted. Continue?") % schema):
                filename = "/tmp/site_convert_todev_%s" % uuid.uuid4()
                if not (self.dump_bd(filename) and self.schema_todev(filename) and self.restore_bd(filename)):
                    L.error(t("Fail to convert schema"))
                    errors = True
                files.rm(filename)

        if errors and not inputs.get_input_yesno(t("There was some errors. Continue?")):
            completed = False
            return completed

        if inputs.get_input_yesno(t("The files under %s will be converted. Continue??") % root_path):
            site_name = self.conf.get("main", "site_name")
            site_dev_name = self.conf.get("main", "site_dev_name")
            site_name_escape = site_name.replace(".", "\.")
            file_list = self.get_file_list(root_path)
            for f in file_list:
                print t("Converting file %s") % f
                files.re_replace_in(f, site_name_escape, site_dev_name)
                files.re_replace_in(f, "(dev\.)*%s" % site_name_escape, site_dev_name)

        robot = root_path + "/robots.txt"
        prodrobot = root_path + "/robots.txt.prod"

        if files.exists(robot):
            self.show_file(t("------- ROBOTS.TXT --------"), robot)
        if files.exists(prodrobot):
            self.show_file(t("------- ROBOTS.TXT.PROD --------"), prodrobot)

        if files.exists(robot) and inputs.get_input_yesno(
            t("Do you want to backup current robots.txt to robots.txt.prod?")
        ):
            if not files.exists(prodrobot) or (
                files.exists(prodrobot) and inputs.get_input_noyes(t("The robots.txt.prod exists. Overwrite?"))
            ):
                files.cp(robot, prodrobot)
        if inputs.get_input_yesno(t("Do you want create a dev robots.txt that disallow all?")):
            with open(files.get_rel_path("data/dev.robots.txt")) as devbot_tpl:
                files.create(robot, devbot_tpl.read())

        completed = True
        return completed
コード例 #2
0
ファイル: site_convert.py プロジェクト: pylanglois/uwsa
    def to_prod(self, args):
        completed = False
        args.remove("toprod")

        site_name = self.ask_site_name(self.get_next_arg(args))
        if not self.is_conf_exists(site_name):
            completed = True
            print t("Sorry, the site '%s' does not exists.") % site_name
            return completed
        self.load(site_name)

        site_path, root_path, log_path, upload_tmp_path = self.generate_dir()
        errors = False

        if self.conf.get("mysql", "enabled"):
            schema = self.conf.get("mysql", "schema")
            if inputs.get_input_yesno(t("The schema '%s' will be converted. Continue?") % schema):
                filename = "/tmp/site_convert_toprod_%s" % uuid.uuid4()
                if not (self.dump_bd(filename) and self.schema_toprod(filename) and self.restore_bd(filename)):
                    L.error(t("Fail to convert schema"))
                    errors = True
                files.rm(filename)

        if errors and not inputs.get_input_yesno(t("There was some errors. Continue?")):
            completed = False
            return completed

        if inputs.get_input_yesno(t("The files under %s will be converted. Continue??") % root_path):
            site_name = self.conf.get("main", "site_name")
            site_name_escape = site_name.replace(".", "\.")
            file_list = self.get_file_list(root_path)
            for f in file_list:
                print t("Converting file %s") % f
                files.re_replace_in(f, "(dev\.)*%s" % site_name_escape, site_name)

        robot = root_path + "/robots.txt"
        prodrobot = root_path + "/robots.txt.prod"

        if files.exists(robot):
            self.show_file(t("------- ROBOTS.TXT --------"), robot)
        if files.exists(prodrobot):
            self.show_file(t("------- ROBOTS.TXT.PROD --------"), prodrobot)

        if files.exists(prodrobot) and inputs.get_input_yesno(
            t("The file robots.txt.prod exists. Do you want to replace robots.txt with it?")
        ):
            files.cp(prodrobot, robot)
        if (
            not files.exists(prodrobot)
            and files.exists(robot)
            and inputs.get_input_yesno(
                t("Warning the %s files DOES NOT exists. Answer Yes to DELETE robots.txt") % prodrobot
            )
        ):
            files.rm(robot)

        completed = True
        return completed
コード例 #3
0
ファイル: site_create.py プロジェクト: pylanglois/uwsa
    def ask_create_mysql(self, mandatory=False):
        #mysql user name max length = 16
        #mysql schema name max length = 64
        mysql_user = self.conf.get('mysql','user')
        mysql_pass = self.conf.get('mysql','pass')
        mysql_schema = self.conf.get('mysql','schema')
        mysql_apply = False

        if mandatory or inputs.get_input_yesno(t("Do you want to create a MySQL user?")):
            self.ask_mysql_cred()
            mysql_apply = True
            prefix = 'mysql_'
            #username
            max_length = 16
            default = inputs.gen_id(length=(max_length-len(prefix)),prefix=prefix) if mysql_user is None else mysql_user
            username = ""
            while len(username) == 0 or len(username) > max_length or \
                    (mysql.user_exists(username) and not inputs.get_input_yesno(t("The user '%s' exists. Continue?") % username)):
                username = inputs.get_input_string("What is the username?", default)
                if len(username) == 0 or len(username) > max_length:
                    print t("The username length must be less than %s") % max_length
            mysql_user = username
            #password
            max_length = 64
            default = inputs.gen_password(allowed_chars=inputs.PASS_CHARS_MYSQL) if mysql_pass is None else mysql_pass
            password = ""
            while len(password) == 0 or len(password) > max_length:
                password = inputs.get_input_string("What is the password?", default)
                if len(password) == 0 or len(password) > max_length:
                    print t("The password length must be less than %s") % max_length
            mysql_pass = password

        if inputs.get_input_yesno(t("Do you want to create a MySQL schema?")):
            self.ask_mysql_cred()
            mysql_apply = True
            prefix = 'schema_'
            max_length = 64
            default = inputs.gen_id(prefix=prefix) if mysql_schema is None else mysql_schema
            schema = ""
            while len(schema) == 0 or len(schema) > max_length or \
                    (mysql.schema_exists(schema) and not inputs.get_input_yesno(t("The schema '%s' exists. Continue?") % schema)):
                schema = inputs.get_input_string("What is the schema name?", default)
                if len(schema) == 0 or len(schema) > max_length:
                    print t("The schema name length must be less than %s") % max_length
            mysql_schema = schema

        self.conf.mod('mysql','user', mysql_user)
        self.conf.mod('mysql','pass', mysql_pass)
        self.conf.mod('mysql','schema', mysql_schema)
        self.conf.mod('mysql','mysql_apply', mysql_apply)
コード例 #4
0
    def do(self, args=[]):
        completed = SiteCreateCommand.do(self,args)
        if not completed:

            if not self.ask_create_name(self.get_next_arg(args)):
                #self.ask_alias_name()
                self.ask_dev_name()
                self.update_client_info()
                self.ask_create_access()
                self.ask_create_mysql(mandatory=True)
                self.ask_allow_override(default='All')
                self.conf.mod('php','enabled', True)
                self.conf.mod('php','php_engine','on')
                mysql_enabled = self.conf.get('mysql','schema') is not None
                self.conf.mod('mysql','enabled', mysql_enabled)
                self.conf.mod('wordpress','enabled', True)
                self.conf.mod('wikimedia','enabled', False)
                self.conf.mod('typo3','enabled', False)
                self.save()
                self.fix_config(overwrite=True)
                try:
                    if inputs.get_input_yesno(t("Do you want to send configuration of %(name)s to %(mail)s?") %
                                                {   'name': self.conf.get('main','site_name'), 
                                                    'mail': CONF_MAP('mail','admin_mail'),
                                                }):
                        self.send_status_mail()
                except Exception:
                    L.exception(t("Problem sending mail in %s") % __file__)
                print self.gen_status_msg()
                completed = True

        return completed
コード例 #5
0
ファイル: site.py プロジェクト: pylanglois/uwsa
 def output_config(self):
     try:
         if inputs.get_input_yesno(t("Do you want to send configuration of %(name)s to %(mail)s?") %
                                     {   'name': self.conf.get('main','site_name'), 
                                         'mail': CONF_MAP('mail','admin_mail'),
                                     }):
             self.send_status_mail()
     except Exception:
         L.exception(t("Problem sending mail in %s") % __file__)
     print self.gen_status_msg()
コード例 #6
0
ファイル: site_convert.py プロジェクト: pylanglois/uwsa
    def fix_path(self, args):
        completed = False
        args.remove("fixpath")

        old_path = self.get_next_path(args)
        args.remove(old_path)
        site_name = self.ask_site_name(self.get_next_arg(args))

        if not self.is_conf_exists(site_name):
            completed = True
            print t("Sorry, the site '%s' does not exists.") % site_name
            return completed
        self.load(site_name)

        site_path, root_path, log_path, upload_tmp_path = self.generate_dir()
        errors = False

        if self.conf.get("mysql", "enabled"):
            schema = self.conf.get("mysql", "schema")
            if inputs.get_input_yesno(t("The paths in schema '%s' will be converted. Continue?") % schema):
                filename = "/tmp/site_convert_fixpath_%s" % uuid.uuid4()
                if not (
                    self.dump_bd(filename)
                    and self.schema_fix_webroot_path(filename, old_path_name=old_path)
                    and self.restore_bd(filename)
                ):
                    L.error(t("Fail to convert schema"))
                    errors = True
                files.rm(filename)

        if errors and not inputs.get_input_yesno(t("There was some errors. Continue?")):
            completed = False
            return completed

        if inputs.get_input_yesno(t("The files under %s will be converted. Continue??") % root_path):
            file_list = self.get_file_list(root_path)
            for f in file_list:
                print t("Converting file %s") % f
                files.re_replace_in(f, old_path, root_path)
コード例 #7
0
ファイル: site_create.py プロジェクト: pylanglois/uwsa
    def ask_create_access(self):
        safe_site_name = self.get_safe_name(self.conf.get('main','site_name'))

        unix_user = self.conf.get('access','unix_user')
        unix_group = self.conf.get('access','unix_group')
        #ldap_user = self.conf.get('access','ldap_user')
        ldap_group = self.conf.get('access','ldap_group')
        ldap_to_apply = False

        if unix_group is None:
            unix_group = safe_site_name + "_unix"

        if ldap_group is None:
            ldap_group = safe_site_name

        #TODO not working for now. Needs debug
        #if CONF_MAP('ldap','enabled') and inputs.get_input_noyes(t("Do you want to create a LDAP user?")):
        #    ldap_user = self.ask_create_user(ldap_user)
        #    self.conf.mod('access','ldap_user', ldap_user)
        #    if ldap_user and not ldap.user_exists(ldap_user):
        #        self.conf.mod('access','ldap_pass', inputs.gen_password())
        #    ldap_to_apply = True

        if CONF_MAP('ldap','enabled') and inputs.get_input_yesno(t("Do you want to create a LDAP group?")):
            self.conf.mod('access','ldap_group', self.ask_create_group(ldap_group))
            ldap_to_apply = True

        if CONF_MAP('unix','enabled') and inputs.get_input_yesno(t("Do you want to create a UNIX user?")):
            unix_user = self.ask_create_user(unix_user)
            self.conf.mod('access','unix_user', unix_user)
            if unix_user and not unix.user_exists(unix_user):
                self.conf.mod('access','unix_pass', inputs.gen_password(allowed_chars=inputs.PASS_CHARS_UNIX))

        if CONF_MAP('unix','enabled') and inputs.get_input_yesno(t("Do you want to create a UNIX group?")):
            self.conf.mod('access','unix_group', self.ask_create_group(unix_group))

        self.conf.mod('access','ldap_to_apply',ldap_to_apply)
コード例 #8
0
ファイル: install_centrify.py プロジェクト: pylanglois/uwsa
    def do(self, args=[]):
        completed = InstallCommand.do(self,args)

        if inputs.get_input_yesno(t("Do you want to configure centrify/ldap now?")):
            if inputs.get_input_yesno(t("Will this machine use Active Directory?")):
                domain_name = inputs.get_input_string(t("What is the domain name?"), CONF_MAP('ldap','domain'))
                domain_controller = inputs.get_input_string(t("What is the address of the domain controller?"), CONF_MAP('ldap','dc'))
                domain_read_user = inputs.get_input_string(t("What is the ldap reader username?"), CONF_MAP('ldap','ldap_reader'))
                domain_read_pass = inputs.get_password(t("What is the ldap reader password?"),validate=False)
                domain_default_ou = inputs.get_input_string(t("What is the ldap default OU for uwsa?"), CONF_MAP('ldap','uwsa_ou'))

                CONFIG.mod('ldap','enabled', True)
                CONFIG.mod('ldap','domain', domain_name)
                CONFIG.mod('ldap','dc', domain_controller)
                CONFIG.mod('ldap','ldap_reader', domain_read_user)
                CONFIG.mod('ldap','ldap_reader_pass', domain_read_pass)
                CONFIG.mod('ldap','uwsa_ou', domain_default_ou)

                if not CONF_MAP('centrify', 'joined') and inputs.get_input_yesno(t("Do you want to join the Active Directory now?")):
                    domain_admin_user = inputs.get_input_string(t("What is the domain admin username?"))
                    domain_admin_pass = inputs.get_password(t("What is the domain admin password?"),confirm=False, validate=False)
                    cmd_list = [
                        {'command' : 'adjoin -w --force --user %s --password %s %s' % (domain_admin_user, domain_admin_pass, domain_name),
                         'anonymous' : 'adjoin -w --force --user %s --password XXXXXXXXXXXXX %s' % (domain_admin_user, domain_name),
                         'success_code' : [0,8],
                        },
                        'service centrifydc start',
                    ]
                    completed, pinfo = core.exec_cmd_list(cmd_list)
                    L.info(pinfo['stdout'])
                    if not completed:
                        raise Exception(t("Error in installation!"), self.NAME)
                    CONFIG.mod('centrify','joined', "True" )
                CONFIG.save()

        return completed
コード例 #9
0
ファイル: setup.py プロジェクト: pylanglois/uwsa
    def run(self):
        print "pre install"
        _install.run(self)

        #script link
        source = "%s/uwsas/uwsa.py" % self.install_lib
        link = "/usr/local/bin/uwsa"
        if not files.exists(link):
            files.symlink(source,link)
        files.chmod(link, u="rx",g="rx",o="rx")

        #validate v0.3.1 old path
        if files.exists("/usr/local/lib/uwsa") and \
            inputs.get_input_yesno(t("The old uwsa path exists. Do you want to move its content to new destination?")):
            cmd_list = [
                "bash -c 'mkdir -p /var/lib/uwsa'",
                "bash -c 'cp -fr /usr/local/lib/uwsa/* /var/lib/uwsa/'",
            ]
            completed, pinfo = core.exec_cmd_list(cmd_list)
            if completed:
                cmd_list = [
                    "bash -c 'mv /usr/local/lib/uwsa /usr/local/lib/uwsa_to_delete'",
                ]
                completed, pinfo = core.exec_cmd_list(cmd_list)
            files.replace_in('/etc/uwsa/uwsa.conf','/usr/local/lib/uwsa','/var/lib/uwsa')

        #validate v0.4 remove mysql_xxx in conf

        all_conf = files.ls("/var/lib/uwsa/site/*")
        for f in all_conf:
            if files.is_file(f):
                files.replace_in(f,'mysql_schema','schema')
                files.replace_in(f,'mysql_user','user')
                files.replace_in(f,'mysql_pass','pass')

        #install prereque
        dependencies = "python-ldap python-iniparse python-mysqldb"
        print t("Will install"), dependencies
        cmd_list = [
            'apt-get update',
            "bash -c 'DEBIAN_FRONTEND=noninteractive apt-get install -y %s'" % dependencies,
        ]
        completed, pinfo = core.exec_cmd_list(cmd_list)
        if not completed:
            raise Exception(t("Cannot install uwsa dependencies! %s" % dependencies))

        print t("post install DONE!")
コード例 #10
0
ファイル: site.py プロジェクト: pylanglois/uwsa
    def create_wordpress(self):
        if self.conf.get('wordpress','enabled'):
            site_path, root_path, log_path, upload_tmp_path = self.generate_dir()
            wp_tpl_webroot = CONF_MAP('site','wordpress_template_path') + "/webroot"
            wp_tpl_schema = CONF_MAP('site','wordpress_template_path') + "/schema/wordpress_tpl_schema.sql"
            wp_webroot_conf = root_path + "/wp-config.php"
            mysql_user = self.conf.get('mysql','user')
            mysql_pass = self.conf.get('mysql','pass')
            mysql_schema = self.conf.get('mysql','schema')
            site_name = self.conf.get('main','site_name')

            if inputs.get_input_noyes(t("Do you want deploy the default wordpress template under %s?") % root_path):
                if files.exists(wp_tpl_webroot):
                    cmd_list = [
                        "bash -c 'cp -fr %s/* %s/'" % (wp_tpl_webroot, root_path),
                    ]
                    completed, pinfo = core.exec_cmd_list(cmd_list)
                    if not completed:
                        L.error(t("Cannot deploy the template."))
                else:
                    L.info(t("There is no template under %s") % wp_tpl_webroot)
            elif inputs.get_input_yesno(t("Do you want to only deploy default plugins?")):
                if files.exists(wp_tpl_webroot):
                    cmd_list = [
                        "bash -c 'mkdir -p %s/wp-content/plugins'" % root_path,
                        "bash -c 'cp -fr %s/wp-content/plugins/* %s/wp-content/plugins/'" % (wp_tpl_webroot, root_path),
                    ]
                    completed, pinfo = core.exec_cmd_list(cmd_list)
                    if not completed:
                        L.error(t("Cannot deploy plugins."))
                else:
                    L.info(t("There is no template under %s") % wp_tpl_webroot)

            if files.exists(wp_webroot_conf):
                params_dict = {
                        'DB_NAME': mysql_schema,
                        'DB_USER': mysql_user,
                        'DB_PASSWORD': mysql_pass,
                        'DB_HOST':'localhost',
                    }
                for key in params_dict:
                    pattern = "define\(\s*?['\"]%s['\"].*;" % key
                    target = "define('%s', '%s');" % (key, params_dict[key])
                    files.re_replace_in(wp_webroot_conf, pattern, target)
            else:
                L.info(t("There is no wp-config.php under %s") % root_path)

            if files.exists(wp_tpl_schema) and inputs.get_input_noyes(t("Do you want to restore default database?")):
                L.info(t("Restoring default schema %s.") % mysql_schema)
                tmp_file = "/tmp/uwsa_wp_schema_%s" % uuid.uuid4()
                files.cp(wp_tpl_schema, tmp_file)
                files.re_replace_in(tmp_file,'UWSA_SCHEMA_NAME', mysql_schema)
                files.replace_in_php_database(tmp_file,'UWSA_SITE_NAME', site_name)
                cmd_list = [
                    {
                        'command': "bash -c 'mysql -u %s -p%s %s < %s'" % (mysql_user, mysql_pass, mysql_schema, tmp_file),
                        'anonymous': "bash -c 'mysql -u %s -p%s %s < %s'"  % (mysql_user, "XXXXX", mysql_schema, tmp_file),
                    },
                ]

                completed, pinfo = core.exec_cmd_list(cmd_list)
                if not completed:
                    L.error(t("Failed to restore schema %s!") % mysql_schema)
                os.remove(tmp_file)
コード例 #11
0
ファイル: site.py プロジェクト: pylanglois/uwsa
 def ask_redirect(self, redirect=False):
     redirect = inputs.get_input_yesno(t("Do you (really) need a www redirect?"))
     return redirect
コード例 #12
0
ファイル: site.py プロジェクト: pylanglois/uwsa
 def ask_overwrite(self, site_name):
     q = t("The site %(name)s already exists. Do you want to overwrite its configuration?") % {'name':site_name}
     return inputs.get_input_yesno(q)