Python Forum
[Python] Issue of Adding Single and Bulk Vouchers to UserMan
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Python] Issue of Adding Single and Bulk Vouchers to UserMan
#1
Hi , i have the following code to add bulk of voucher (users) to Mikrotik UserMan Radius , it's working ok but when i add vouchers , Mikrotik CPU utilization is high( up to 30%) and the process of adding vouchers taking long time.
any suggestions to improve that ?
def run_batch_ssh_commands(ip, username, password, command_list):
    full_command = "\n".join(command_list)
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname=ip, username=username, password=password)
    stdin, stdout, stderr = client.exec_command(full_command)
    output = stdout.read().decode()
    error = stderr.read().decode()
    client.close()
    return output, error
def run_batch_ssh_commands(ip, username, password, command_list):
    full_command = "\n".join(command_list)
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname=ip, username=username, password=password)
    stdin, stdout, stderr = client.exec_command(full_command)
    output = stdout.read().decode()
    error = stderr.read().decode()
    client.close()
    return output, error    
@app.route('/add-user', methods=['GET', 'POST'])
def add_user():
    if 'ip' not in session:
        return redirect(url_for('login'))

    error = None
    success = None
    profiles = []

    try:
        connection = routeros_api.RouterOsApiPool(
            host=session['ip'],
            username=session['username'],
            password=session['password'],
            port=int(session['port']),
            plaintext_login=True
        )
        api = connection.get_api()
        profile_resource = api.get_resource('/tool/user-manager/profile')
        profiles = profile_resource.get()

        if request.method == 'POST':
            mode = request.form.get("mode", "single")

            if mode == "bulk":
                prefix = request.form['prefix']
                username_len = int(request.form['username_length'])
                username_type = request.form['username_type']
                password_len = int(request.form['password_length'])
                password_type = request.form['password_type']
                count = int(request.form['user_count'])
                profile = request.form['profile']

                chars_map = {
                    "digits": string.digits,
                    "letters": string.ascii_letters,
                    "mixed": string.ascii_letters + string.digits
                }

                usernames = []
                commands = []

                for _ in range(count):
                    uname = prefix + ''.join(random.choices(chars_map[username_type], k=username_len))
                    passwd = ''.join(random.choices(chars_map[password_type], k=password_len))
                    usernames.append(uname)

                    # أمر الإضافة
                    commands.append(
                        f'/tool user-manager user add username={uname} password={passwd} customer=admin shared-users=1'
                    )

                    # أمر التفعيل (علشان الكرت يظهر فعليًا)
                    commands.append(
                        f'/tool user-manager user create-and-activate-profile customer=admin profile={profile} numbers=[find username="{uname}"]'
                    )

                output, error_msg = run_batch_ssh_commands(
                    session['ip'], session['username'], session['password'], commands
                )

                if error_msg:
                    error = f"❌ خطأ أثناء التنفيذ:\n{error_msg}"
                else:
                    success = f"✅ تم إضافة وتفعيل {len(usernames)} مستخدم بنجاح."

            else:
                # فردي
                username = request.form['username']
                password = request.form['password']
                profile = request.form['profile']

                commands = [
                    f'/tool user-manager user add username={username} password={password} customer=admin shared-users=1',
                    f'/tool user-manager user create-and-activate-profile customer=admin profile={profile} numbers=[find username="{username}"]'
                ]

                output, error_msg = run_batch_ssh_commands(
                    session['ip'], session['username'], session['password'], commands
                )

                if error_msg:
                    error = f"❌ حدث خطأ أثناء التفعيل:\n{error_msg}"
                else:
                    success = "✅ تم إضافة المستخدم وتفعيل البروفايل بنجاح."

    except Exception as e:
        error = f"🚫 خطأ عام: {str(e)}"

    return render_template('add_user.html', profiles=profiles, error=error, success=success)
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Bulk loading of data using python shivamsvmsri 2 2,238 Sep-28-2023, 09:04 AM
Last Post: shivamsvmsri
  python sql query single quote in a string mg24 1 2,214 Nov-18-2022, 08:01 PM
Last Post: deanhystad
  python Multithreading on single file mg24 3 3,570 Nov-05-2022, 01:33 PM
Last Post: snippsat
  How can I get Python Bulk Email Verification Script With API? zainalee 1 3,151 Jun-06-2021, 09:19 AM
Last Post: snippsat
Video Python Bulk Email Verification Script With API Aj1128 0 3,201 Nov-28-2020, 11:38 AM
Last Post: Aj1128
  Bulk add column to dataframe sambanerjee 1 2,788 Sep-24-2020, 07:34 PM
Last Post: sambanerjee
  bulk update in elasticsearch pythonlearner1 1 7,084 Jun-10-2020, 10:01 PM
Last Post: pythonlearner1
  Bulk Generating Cloze Deletions based on Tatoeba sentences and word frequency lists wizzie 10 7,310 Dec-23-2019, 12:16 PM
Last Post: wizzie
  Adding markers to Folium map only adding last element. tantony 0 2,918 Oct-16-2019, 03:28 PM
Last Post: tantony
  Issue with ginput and adding points to an exisiting plot gaminer 0 2,203 Oct-12-2019, 07:08 PM
Last Post: gaminer

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020