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
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
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)
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
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()
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)
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)
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
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!")
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)
def ask_redirect(self, redirect=False): redirect = inputs.get_input_yesno(t("Do you (really) need a www redirect?")) return redirect
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)