May-10-2025, 06:39 PM
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 ?
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)