Example #1
0
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
Example #2
0
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()
Example #3
0
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}"
Example #4
0
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()
Example #6
0
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()
Example #7
0
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
Example #8
0
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)
Example #9
0
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)
Example #11
0
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]
Example #12
0
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())
Example #13
0
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()
Example #16
0
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()
Example #17
0
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()
Example #18
0
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()
Example #19
0
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)
Example #20
0
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.')
Example #21
0
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
Example #22
0
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')]
Example #24
0
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)