def get_branches(doctype, docname, current_branch): verify_whitelisted_call() app_path = os.path.join('..', 'apps', docname) #'../apps/'+docname branches = (check_output("git branch".split(), cwd=app_path)).split() branches.remove('*') branches.remove(current_branch) return branches
def create_site(site_name, install_epaas, mysql_password, admin_password, key): verify_whitelisted_call() commands = [ "bench new-site --mariadb-root-password {mysql_password} --admin-password {admin_password} {site_name}" .format(site_name=site_name, admin_password=admin_password, mysql_password=mysql_password) ] if install_epaas == "true": with open('apps.txt', 'r') as f: app_list = f.read() if 'epaas' not in app_list: commands.append("bench get-app epaas") commands.append("bench --site {site_name} install-app epaas".format( site_name=site_name)) dataent.enqueue('bench_manager.bench_manager.utils.run_command', commands=commands, doctype="Bench Settings", key=key) all_sites = safe_decode(check_output("ls")).strip('\n').split('\n') while site_name not in all_sites: time.sleep(2) print("waiting for site creation...") all_sites = safe_decode(check_output("ls")).strip('\n').split('\n') doc = dataent.get_doc({ 'doctype': 'Site', 'site_name': site_name, 'app_list': 'dataent', 'developer_flag': 1 }) doc.insert() dataent.db.commit()
def create_site(site_name, key, first_name, last_name, password, email, apps=None): mysql_password = frappe.get_conf().get("root_password") admin_password = frappe.get_conf().get("admin_password") verify_whitelisted_call() commands = [ "bench new-site --mariadb-root-password {mysql_password} --admin-password {admin_password} --no-mariadb-socket {site_name}".format( site_name=site_name, admin_password=admin_password, mysql_password=mysql_password, ), f"bench --site {site_name} add-system-manager --first-name {first_name} --last-name {last_name} --password {password} {email}" ] list_apps = ["frappe"] if apps: list_apps = apps.split(",") for app in list_apps: commands.append(f"bench --site {site_name} install-app {app}") frappe.enqueue( "bench_manager.bench_manager.utils.run_command", commands=commands, doctype="Bench Settings", key=key, ) return f"Creating {site_name}"
def pass_exists(doctype, docname=''): verify_whitelisted_call() #return string convention 'TT',<root_password>,<admin_password> ret = {'condition':'', 'root_password':'', 'admin_password':''} common_site_config_path = 'common_site_config.json' with open(common_site_config_path, 'r') as f: common_site_config_data = json.load(f) ret['condition'] += 'T' if common_site_config_data.get('root_password') else 'F' ret['root_password'] = common_site_config_data.get('root_password') ret['condition'] += 'T' if common_site_config_data.get('admin_password') else 'F' ret['admin_password'] = common_site_config_data.get('admin_password') if docname == '': #Prompt reached here on new-site return ret site_config_path = docname+'/site_config.json' with open(site_config_path, 'r') as f: site_config_data = json.load(f) #FF FT TF if ret['condition'][1] == 'F': ret['condition'] = ret['condition'][0] + 'T' if site_config_data.get('admin_password') else 'F' ret['admin_password'] = site_config_data.get('admin_password') else: if site_config_data.get('admin_password'): ret['condition'] = ret['condition'][0] + 'T' ret['admin_password'] = site_config_data.get('admin_password') return ret
def sync_apps(): verify_whitelisted_call() app_dirs = update_app_list() app_entries = [x['name'] for x in frappe.get_all('App')] create_apps = list(set(app_dirs) - set(app_entries)) delete_apps = list(set(app_entries) - set(app_dirs)) create_apps = filter(lambda a: a != '', create_apps) delete_apps = filter(lambda a: a != '', delete_apps) for app in create_apps: doc = frappe.get_doc({ 'doctype': 'App', 'app_name': app, 'app_description': 'lorem ipsum', 'app_publisher': 'lorem ipsum', 'app_email': 'lorem ipsum', 'developer_flag': 1 }) doc.insert() frappe.db.commit() for app in delete_apps: doc = frappe.get_doc('App', app) doc.developer_flag = 1 doc.save() doc.delete() frappe.db.commit()
def create_site(site_name, install_erpnext, mysql_password, admin_password, key): verify_whitelisted_call() commands = [ "bench new-site --mariadb-root-password {mysql_password} --admin-password {admin_password} --no-mariadb-socket {site_name}" .format(site_name=site_name, admin_password=admin_password, mysql_password=mysql_password) ] if install_erpnext == "true": with open("apps.txt", "r") as f: app_list = f.read() if "erpnext" not in app_list: commands.append("bench get-app erpnext") commands.append("bench --site {site_name} install-app erpnext".format( site_name=site_name)) frappe.enqueue( "bench_manager.bench_manager.utils.run_command", commands=commands, doctype="Bench Settings", key=key, ) all_sites = safe_decode(check_output("ls")).strip("\n").split("\n") while site_name not in all_sites: time.sleep(2) print("waiting for site creation...") all_sites = safe_decode(check_output("ls")).strip("\n").split("\n") doc = frappe.get_doc({ "doctype": "Site", "site_name": site_name, "app_list": "frappe", "developer_flag": 1 }) doc.insert() frappe.db.commit()
def pass_exists(doctype, docname=""): verify_whitelisted_call() # return string convention 'TT',<root_password>,<admin_password> ret = {"condition": "", "root_password": "", "admin_password": ""} common_site_config_path = "common_site_config.json" with open(common_site_config_path, "r") as f: common_site_config_data = json.load(f) ret["condition"] += "T" if common_site_config_data.get( "root_password") else "F" ret["root_password"] = common_site_config_data.get("root_password") ret["condition"] += "T" if common_site_config_data.get( "admin_password") else "F" ret["admin_password"] = common_site_config_data.get("admin_password") if docname == "": # Prompt reached here on new-site return ret site_config_path = docname + "/site_config.json" with open(site_config_path, "r") as f: site_config_data = json.load(f) # FF FT TF if ret["condition"][1] == "F": ret["condition"] = (ret["condition"][0] + "T" if site_config_data.get("admin_password") else "F") ret["admin_password"] = site_config_data.get("admin_password") else: if site_config_data.get("admin_password"): ret["condition"] = ret["condition"][0] + "T" ret["admin_password"] = site_config_data.get("admin_password") return ret
def hardcore_migrate(site_name, app_name): verify_whitelisted_call() site = frappe.get_doc("Site", site_name) us = site.db_name pa = site.get_password('db_password') us, pa = set_conection(us, pa) frappe.db.sql("""DELETE dp from `tabDocPerm` dp join `tabDocType` dt on dp.parent = dt.name join `tabModule Def` md on md.name = dt.module WHERE md.app_name = '{}' """.format(app_name)) frappe.db.commit() frappe.db.sql("""DELETE df from `tabDocField` df join `tabDocType` dt on df.parent = dt.name join `tabModule Def` md on md.name = dt.module WHERE md.app_name = '{}' """.format(app_name)) frappe.db.commit() frappe.db.sql("""TRUNCATE TABLE `tabCustom Field`""", auto_commit=True) frappe.db.sql("""DELETE dt from `tabDocType` dt join `tabModule Def` md on md.name = dt.module WHERE md.app_name = '{}' """.format(app_name)) frappe.db.sql("""DELETE dt from `tabPrint Format` dt join `tabModule Def` md on md.name = dt.module WHERE md.app_name = '{}' """.format(app_name)) frappe.db.sql("""DELETE dt from `tabReport` dt join `tabModule Def` md on md.name = dt.module WHERE md.app_name = '{}' """.format(app_name)) frappe.db.commit() set_conection(us, pa)
def sync_apps(): verify_whitelisted_call() app_dirs = update_app_list() app_entries = [x["name"] for x in frappe.get_all("App")] create_apps = list(set(app_dirs) - set(app_entries)) delete_apps = list(set(app_entries) - set(app_dirs)) create_apps = [app for app in create_apps if app != ""] delete_apps = [app for app in delete_apps if app != ""] for app in create_apps: doc = frappe.get_doc({ "doctype": "App", "app_name": app, "app_description": "lorem ipsum", "app_publisher": "lorem ipsum", "app_email": "lorem ipsum", "developer_flag": 1, }) doc.insert() frappe.db.commit() for app in delete_apps: doc = frappe.get_doc("App", app) doc.developer_flag = 1 doc.save() doc.delete() frappe.db.commit()
def restore_backup(doctype, docname, on_a_new_site, existing_site, new_site_name, mysql_password, admin_password, key): verify_whitelisted_call() backup = frappe.get_doc('Site Backup', docname) commands = [] password_suffix = "--admin-password {admin_password} --mariadb-root-password {mysql_password}".format( mysql_password=mysql_password, admin_password=admin_password) site_name = existing_site if on_a_new_site == '1': site_name = new_site_name commands.append("bench new-site {site_name} {password_suffix}".format( site_name=site_name, password_suffix=password_suffix)) command = "bench --site {site_name} --force restore {backup_file_path}_database.sql".format( site_name=site_name, backup_file_path=backup.file_path) if not os.path.isfile("{backup_file_path}_database.sql".format( backup_file_path=backup.file_path)): command += ".gz" if backup.public_file_backup: command += " --with-public-files ../{backup_file_path}_files.tar".format( backup_file_path=backup.file_path) if backup.private_file_backup: command += " --with-private-files ../{backup_file_path}_private_files.tar".format( backup_file_path=backup.file_path) command += " {password_suffix}".format(password_suffix=password_suffix) commands.append(command) frappe.enqueue('bench_manager.bench_manager.utils.run_command', commands=commands, doctype=doctype, key=key, docname=docname)
def get_installable_apps(doctype, docname): verify_whitelisted_call() app_list_file = 'apps.txt' with open(app_list_file, "r") as f: apps = f.read().split('\n') installed_apps = frappe.get_doc(doctype, docname).app_list.split('\n') installable_apps = set(apps) - set(installed_apps) return [x for x in installable_apps]
def sync_all(in_background=False): if not in_background: frappe.msgprint('Sync has started and will run in the background...') verify_whitelisted_call() frappe.enqueue('bench_manager.bench_manager.doctype.bench_settings.bench_settings.sync_sites') frappe.enqueue('bench_manager.bench_manager.doctype.bench_settings.bench_settings.sync_apps') frappe.enqueue('bench_manager.bench_manager.doctype.bench_settings.bench_settings.sync_backups') frappe.set_value('Bench Settings', None, 'last_sync_timestamp', frappe.utils.time.time())
def verify_password(site_name, mysql_password): verify_whitelisted_call() try: db = pymysql.connect(host=frappe.conf.db_host or 'localhost', user='******' ,passwd=mysql_password) db.close() except Exception as e: print (e) frappe.throw("MySQL password is incorrect") return "console"
def sync_all(in_background=False): verify_whitelisted_call() sync_sites() sync_apps() sync_backups() frappe.set_value('Bench Settings', None, 'last_sync_timestamp', frappe.utils.time.time()) if not in_background: frappe.msgprint('Sync Complete')
def sync_backups(): verify_whitelisted_call() backup_dirs_data = update_backup_list() backup_entries = [x['name'] for x in frappe.get_all('Site Backup')] backup_dirs = [ x['date'] + ' ' + x['time'] + ' ' + x['site_name'] + ' ' + x['stored_location'] for x in backup_dirs_data ] create_backups = list(set(backup_dirs) - set(backup_entries)) delete_backups = list(set(backup_entries) - set(backup_dirs)) for date_time_sitename_loc in create_backups: date_time_sitename_loc = date_time_sitename_loc.split(' ') backup = {} for x in backup_dirs_data: if (x['date'] == date_time_sitename_loc[0] and x['time'] == date_time_sitename_loc[1] and x['site_name'] == date_time_sitename_loc[2] and x['stored_location'] == date_time_sitename_loc[3]): backup = x break doc = frappe.get_doc({ 'doctype': 'Site Backup', 'site_name': backup['site_name'], 'date': backup['date'], 'time': backup['time'], 'stored_location': backup['stored_location'], 'public_file_backup': backup['public_file_backup'], 'private_file_backup': backup['private_file_backup'], 'hash': backup['hash'], 'file_path': backup['file_path'], 'developer_flag': 1 }) doc.insert() frappe.db.commit() for backup in delete_backups: doc = frappe.get_doc('Site Backup', backup) doc.developer_flag = 1 doc.save() frappe.db.commit() doc.delete() frappe.db.commit()
def sync_backups(): verify_whitelisted_call() backup_dirs_data = update_backup_list() backup_entries = [x["name"] for x in frappe.get_all("Site Backup")] backup_dirs = [ x["date"] + " " + x["time"] + " " + x["site_name"] + " " + x["stored_location"] for x in backup_dirs_data ] create_backups = list(set(backup_dirs) - set(backup_entries)) delete_backups = list(set(backup_entries) - set(backup_dirs)) for date_time_sitename_loc in create_backups: date_time_sitename_loc = date_time_sitename_loc.split(" ") backup = {} for x in backup_dirs_data: if (x["date"] == date_time_sitename_loc[0] and x["time"] == date_time_sitename_loc[1] and x["site_name"] == date_time_sitename_loc[2] and x["stored_location"] == date_time_sitename_loc[3]): backup = x break doc = frappe.get_doc({ "doctype": "Site Backup", "site_name": backup["site_name"], "date": backup["date"], "time": backup["time"], "stored_location": backup["stored_location"], "public_file_backup": backup["public_file_backup"], "private_file_backup": backup["private_file_backup"], "hash": backup["hash"], "file_path": backup["file_path"], "developer_flag": 1, }) doc.insert() frappe.db.commit() for backup in delete_backups: doc = frappe.get_doc("Site Backup", backup) doc.developer_flag = 1 doc.save() frappe.db.commit() doc.delete() frappe.db.commit()
def sync_sites(): verify_whitelisted_call() site_dirs = update_site_list() site_entries = [x['name'] for x in frappe.get_all('Site')] create_sites = list(set(site_dirs) - set(site_entries)) delete_sites = list(set(site_entries) - set(site_dirs)) for site in create_sites: doc = frappe.get_doc({'doctype': 'Site', 'site_name': site, 'developer_flag':1}) doc.insert() frappe.db.commit() for site in delete_sites: doc = frappe.get_doc('Site', site) doc.developer_flag = 1 doc.save() doc.delete() frappe.db.commit()
def sync_sites(): verify_whitelisted_call() site_dirs = update_site_list() site_entries = [x["name"] for x in frappe.get_all("Site")] create_sites = list(set(site_dirs) - set(site_entries)) delete_sites = list(set(site_entries) - set(site_dirs)) for site in create_sites: doc = frappe.get_doc({ "doctype": "Site", "site_name": site, "developer_flag": 1 }) doc.insert() frappe.db.commit() for site in delete_sites: doc = frappe.get_doc("Site", site) doc.developer_flag = 1 doc.save() doc.delete() frappe.db.commit()
def create_site(site_name, install_erpnext, mysql_password, admin_password, key, email=None, doc=None): verify_whitelisted_call() commands = [ "bench new-site --mariadb-root-password {mysql_password} --admin-password {admin_password} {site_name}" .format(site_name=site_name, admin_password=admin_password, mysql_password=mysql_password) ] if install_erpnext == "true": with open('apps.txt', 'r') as f: app_list = f.read() if 'erpnext' not in app_list: commands.append("bench get-app erpnext") commands.append("bench --site {site_name} install-app erpnext".format( site_name=site_name)) if 'lite' in app_list: commands.append("bench --site {site_name} install-app lite".format( site_name=site_name)) if 'mawred_theme' in app_list: commands.append( "bench --site {site_name} install-app mawred_theme".format( site_name=site_name)) sits_list = frappe.get_list("Site Request", {"email": email}) if sits_list: doc = frappe.get_doc("Site Request", {"email": email}) a = "bench --site pas.com.sa execute bench_manager.api.add_data_to_site --kwargs \"{'site':'" + site_name + "','full_name': '" + doc.full_name + "','company_name': '" + doc.association_name + "','email': '" + doc.email + "'}\"" commands.append(a) if 'loginapp' in app_list: commands.append( "bench --site {site_name} install-app loginapp".format( site_name=site_name)) settings = frappe.get_single('SAAS Settings') domain = settings.main_domain alias = settings.alias_domain alias_site_name = doc.subdomain + "." + alias commands.append( "bench setup add-domain {site_name} --site {site_name} --ssl-certificate /etc/letsencrypt/live/{domain}/fullchain.pem --ssl-certificate-key /etc/letsencrypt/live/{domain}/privkey.pem " .format(site_name=site_name, domain=domain)) if alias: commands.append( "bench setup add-domain {alias_site_name} --site {site_name} --ssl-certificate /etc/letsencrypt/live/{alias_domain}/fullchain.pem --ssl-certificate-key /etc/letsencrypt/live/{alias_domain}/privkey.pem " .format(site_name=site_name, alias_domain=alias, alias_site_name=alias_site_name)) commands.append("bench setup nginx --yes") commands.append("sudo service nginx restart") frappe.enqueue('bench_manager.bench_manager.utils.run_command', commands=commands, doctype="Bench Settings", key=key, timeout=1200) all_sites = safe_decode(check_output("ls")).strip('\n').split('\n') while site_name not in all_sites: time.sleep(2) print("waiting for site creation...") all_sites = safe_decode(check_output("ls")).strip('\n').split('\n') doc = frappe.get_doc({ 'doctype': 'Site', 'site_name': site_name, 'app_list': 'frappe', 'developer_flag': 1 }) doc.insert() frappe.db.commit() if email: sits_list = frappe.get_list("Site Request", {"email": email}) if sits_list: site = frappe.get_doc("Site Request", {"email": email}) email_args = { "recipients": site.email, "sender": None, "subject": "Your New site created " + site_name, "message": "site :" + site_name + "<br>" + "user :"******"administrator" + "<br>" + "passwored :" + admin_password, "now": True, } enqueue(method=frappe.sendmail, queue='short', timeout=300, is_async=True, **email_args)
def restart_bench(key): verify_whitelisted_call() frappe.enqueue( 'bench_manager.bench_manager.doctype.bench_settings.bench_settings.do_restart', key=key) frappe.msgprint('Restart scheduled within the next 5 seconds.')
def get_removable_apps(doctype, docname): verify_whitelisted_call() removable_apps = frappe.get_doc(doctype, docname).app_list.split('\n') removable_apps.remove('frappe') return removable_apps
def get_restore_options(doctype, docname): verify_whitelisted_call() return [x["name"] for x in frappe.get_all("Site")]
def get_restore_options(doctype, docname): verify_whitelisted_call() return [x['name'] for x in frappe.get_all('Site')]
def create_site_internal(email, full_name, plan): einvoice_plan = ['EInvoice', 'الفاتورة الالكترونية'] verify_whitelisted_call() settings = frappe.get_single('SAAS Settings') install_erpnext = "true" mysql_password = settings.mysql_password admin_password = settings.admin_password email = email customers = frappe.get_list("Customer", {"customer_email": email}, ignore_permissions=True) if customers: customer = frappe.get_doc("Customer", {"customer_email": email}) site_name = customer.site_name + "." + settings.main_domain letters = string.ascii_lowercase key = ''.join(random.choice(letters) for i in range(10)) commands = [ "bench new-site --mariadb-root-password {mysql_password} --admin-password {admin_password} {site_name}" .format(site_name=site_name, admin_password=admin_password, mysql_password=mysql_password) ] site_request = None sr = frappe.get_list("Site Request", {"email": email}, ignore_permissions=True) if sr: site_request = email if not site_exist(site_name): if install_erpnext == "true": with open('apps.txt', 'r') as f: app_list = f.read() if 'erpnext' not in app_list: commands.append("bench get-app erpnext") if plan not in einvoice_plan: commands.append( "bench --site {site_name} install-app erpnext".format( site_name=site_name)) if plan in einvoice_plan: commands.append( "bench --site {site_name} install-app einvoice".format( site_name=site_name)) if 'lite' in app_list and plan not in einvoice_plan: commands.append( "bench --site {site_name} install-app lite".format( site_name=site_name)) if 'mawred_theme' in app_list: commands.append( "bench --site {site_name} install-app mawred_theme". format(site_name=site_name)) a = "bench --site pas.com.sa execute bench_manager.api.add_data_to_site --kwargs \"{'site':'" + site_name + "','full_name': '" + full_name + "','company_name': '" + customer.company_name + "','email': '" + email + "'}\"" commands.append(a) if 'loginapp' in app_list: commands.append( "bench --site {site_name} install-app loginapp".format( site_name=site_name)) domain = settings.main_domain alias = settings.alias_domain alias_site_name = customer.site_name + "." + alias commands.append( "bench setup add-domain {site_name} --site {site_name} --ssl-certificate /etc/letsencrypt/live/{domain}/fullchain.pem --ssl-certificate-key /etc/letsencrypt/live/{domain}/privkey.pem " .format(site_name=site_name, domain=domain)) if alias: commands.append( "bench setup add-domain {alias_site_name} --site {site_name} --ssl-certificate /etc/letsencrypt/live/{alias_domain}/fullchain.pem --ssl-certificate-key /etc/letsencrypt/live/{alias_domain}/privkey.pem " .format(site_name=site_name, alias_domain=alias, alias_site_name=alias_site_name)) commands.append("bench setup nginx --yes") commands.append("sudo service nginx restart") # if plan in einvoice_plan: # commands.append("bench --site {site_name} uninstall-app erpnext".format(site_name=site_name)) # commands.append("bench --site {site_name} uninstall-app lite".format(site_name=site_name)) # commands.append("bench --site {site_name} install-app einvoice".format(site_name=site_name)) frappe.enqueue('bench_manager.bench_manager.utils.run_command', commands=commands, doctype="Site Request", docname=email, site_request=site_request, key=key, timeout=1200)