From 980193c3479aae3dea61275c5a91878fcfdfd7e6 Mon Sep 17 00:00:00 2001 From: Antonio de la Rosa Date: Sun, 2 Nov 2025 18:03:46 +0100 Subject: [PATCH] Added delete user support. --- admin/dashboard.py | 70 ++++++++++++++++++++++++++++++- scripts/system/delete_user.py | 26 ++++++++++++ tasks/system/add_user.py | 2 - tasks/system/delete_user.py | 64 ++++++++++++++++++++++++++++ templates/admin/delete_user.phtml | 32 ++++++++++++++ 5 files changed, 191 insertions(+), 3 deletions(-) create mode 100644 scripts/system/delete_user.py create mode 100644 tasks/system/delete_user.py create mode 100644 templates/admin/delete_user.phtml diff --git a/admin/dashboard.py b/admin/dashboard.py index eff52e7..875e9d4 100644 --- a/admin/dashboard.py +++ b/admin/dashboard.py @@ -890,7 +890,7 @@ def pastafari2_get_server_users(server_id): with db.query('select * from systemuser WHERE server_id=%s', [server_id]) as cursor: for user in cursor: - rows.append({'username': ''+user['username']+'', 'options': ''}) + rows.append({'username': ''+user['username']+'', 'options': ''+_('Delete')+''}) arr_return={'fields': fields, 'rows': rows, 'html_pages': ''} @@ -1067,3 +1067,71 @@ def pastafari2_change_user_password(server_id): return {'error': error, 'error_form': error_form, 'task_id': task_id} +@admin_app.route('/pastafari2/delete_user/') +def pastafari2_delete_user(): + + db=g.connection + + server=ServerDbTask(db) + + server_id=request.args.get('server_id', '0') + + user=SystemUser(db) + + arr_server=server.select_a_row(server_id) + + username=request.args.get('username') + + arr_user=user.set_conditions('WHERE username=%s AND server_id=%s', [username, server_id]).select_a_row_where() + + if arr_server and arr_user: + + return t.load_template('delete_user.phtml', title=_('Delete user'), path_module='admin_app.pastafari2_dashboard', server_id=server_id, server=arr_server, username=username, user_id=arr_user['id']) + + else: + + return "" + +@admin_app.route('/pastafari2/delete_user_db/', methods=['POST']) +def pastafari2_delete_user_db(server_id): + + db=g.connection + + error=0 + + server=ServerDbTask(db) + + user=SystemUser(db) + + arr_server=server.set_conditions('WHERE id=%s', [server_id]).select_a_row_where([], True) + + user_id=request.form.get('user_id', '0') + + arr_user=user.set_conditions('WHERE id=%s AND server_id=%s', [user_id, server_id]).select_a_row_where([], True) + + error_form={} + + #server.set_conditions('WHERE id=%s', [server_id]).delete() + + if arr_server and arr_user: + #user.set_conditions('WHERE id=%s',[arr_user['id']]).delete() + sshtask=Task(db) + + ssh_key_priv=config_task.ssh_private_key + + if not sshtask.run_task(arr_server['ip'], 'modules.pastafari2.tasks.system.delete_user', 'Delete user', 'Delete', 'Task for delete a unix user', {'user_id': user_id, 'username': arr_user['username']}, config_task.remote_user, '', '', url_for('admin_app.pastafari2_dashboard', server_id=server_id), ssh_key_priv=ssh_key_priv, ssh_key_password='', send_task=True, ssh_port=arr_server['ssh_port']): + + error=1 + + task_id=sshtask.task_id + + if task_id: + + log=check_task_status(_('User deleted'), db, task_id) + + error=log['error'] + + error_form['#user_delete_error']=log['message'] + + return {'error': error, 'error_form': error_form, 'task_id': task_id} + diff --git a/scripts/system/delete_user.py b/scripts/system/delete_user.py new file mode 100644 index 0000000..11e87e1 --- /dev/null +++ b/scripts/system/delete_user.py @@ -0,0 +1,26 @@ +#!/usr/bin/python3 -u + +import sys +import argparse +import os +#from pastafariutils.unix import add_user, del_user, change_password +from pathlib import Path +from subprocess import call, DEVNULL +import json +import time +import shutil +import pwd +import distro +import subprocess +from pastafariutils import linux + +parser=argparse.ArgumentParser(prog='delete_user.py', description='Delete user in linux system') + +parser.add_argument('--user', help='The unix user', required=True) + +args=parser.parse_args() + +if not linux.shell_command('sudo userdel -r {}'.format(args.user)): + linux.json_log('Sorry, cannot delete theuser, please check permissions and the user exists', error=1, status=1, progress=100, no_progress=0, return_message=0, result=None) + exit(1) + diff --git a/tasks/system/add_user.py b/tasks/system/add_user.py index 52febb8..cd6083c 100644 --- a/tasks/system/add_user.py +++ b/tasks/system/add_user.py @@ -60,7 +60,5 @@ class ServerTask(Task): system_user.create_forms() system_user.insert({'username': self.data['username'], 'home': self.data['home'], 'server_id': arr_server['id']}) - - #with self.connection.query('insert into systemuser (username, home, server_id) VALUES (%s, %s, %s)', [self.data['username'], self.data['home']]) as cursor: return True diff --git a/tasks/system/delete_user.py b/tasks/system/delete_user.py new file mode 100644 index 0000000..56b83b7 --- /dev/null +++ b/tasks/system/delete_user.py @@ -0,0 +1,64 @@ +#/usr/bin/env python3 + +from collections import OrderedDict +import json +from modules.pastafari2.libraries.task import Task +from modules.pastafari2.models.pastafari2 import ServerDbTask, SystemUser +from modules.pastafari2.libraries.configtask import config_task +#import distro + +class ServerTask(Task): + + def __init__(self, server, conn, remote_user='root', remote_password='', private_key='./ssh/id_rsa', password_key='', remote_path='pastafari2', task_id=0, data={}, port=22): + + super().__init__(server, conn, remote_user, remote_password, private_key, password_key, remote_path, task_id, data, port) + + self.name_task='Delete user to server' + + self.description_task='Delete user to the selected server' + + self.codename_task='delete_user' + + self.files=[] + + self.files=[['modules/pastafari2/scripts/system/delete_user.py', 0o750]] + + # Format first array element is command with the interpreter, the task is agnostic, the files in os directory. The commands are setted with 750 permission. + # First element is the file, next elements are the arguments + + self.commands_to_execute=[['modules/pastafari2/scripts/system/delete_user.py', '']] + + #THe files to delete + + self.delete_files=[] + + self.delete_directories=['modules/pastafari2/scripts'] + + #self.task=Task(conn) + + self.one_time=False + + self.version='1.0' + + self.path_module='admin_app.pastafari2_dashboard' + + def pre_task(self): + + + self.commands_to_execute=[['/home/{}/pythonenv/bin/python3 -u modules/pastafari2/scripts/system/delete_user.py'.format(config_task.remote_user), '--user={}'.format(self.data['username'])]] + + return True + + def post_task(self): + + serverdb=ServerDbTask(self.connection) + + system_user=SystemUser(self.connection) + + arr_server=serverdb.set_conditions('WHERE ip=%s', [self.server]).select_a_row_where() + + system_user.create_forms() + + system_user.set_conditions('WHERE id=%s', self.data['user_id']).delete() + + return True diff --git a/templates/admin/delete_user.phtml b/templates/admin/delete_user.phtml new file mode 100644 index 0000000..39e8caa --- /dev/null +++ b/templates/admin/delete_user.phtml @@ -0,0 +1,32 @@ +<%inherit file="dashboard.phtml"/> +<%block name="content"> +

${_('Servers')} >> ${server['hostname']} - ${_('Users')} >> ${_('Delete user')}

+
+
+

${_('User')}: ${username}

+

${_('WARNING: The user is only deleted from database because if is deleted and is necessary for any service, you lost this services. Please, check the services used by the user and delete using other gui services how webmin.')}

+ +

+

+
+
+

${_('Servers')} >> ${server['hostname']} - ${_('Users')} >> ${_('Delete user')}

+ +<%block name="jscript_block"> + + +