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)
