Added delete user support.

This commit is contained in:
Antonio de la Rosa 2025-11-02 18:03:46 +01:00
parent 88e2428a71
commit 980193c347
5 changed files with 191 additions and 3 deletions

View file

@ -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: with db.query('select * from systemuser WHERE server_id=%s', [server_id]) as cursor:
for user in cursor: for user in cursor:
rows.append({'username': '<a href="#" class="change_password">'+user['username']+'</a>', 'options': ''}) rows.append({'username': '<a href="#" class="change_password">'+user['username']+'</a>', 'options': '<a href="'+url_for('admin_app.pastafari2_delete_user', server_id=server_id, username=user['username'])+'">'+_('Delete')+'</a>'})
arr_return={'fields': fields, 'rows': rows, 'html_pages': ''} 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} 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/<int:server_id>', 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}

View file

@ -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)

View file

@ -61,6 +61,4 @@ class ServerTask(Task):
system_user.insert({'username': self.data['username'], 'home': self.data['home'], 'server_id': arr_server['id']}) 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 return True

View file

@ -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

View file

@ -0,0 +1,32 @@
<%inherit file="dashboard.phtml"/>
<%block name="content">
<p><a href="${url_for('.pastafari2_dashboard')}">${_('Servers')}</a> &gt;&gt; <a href="${url_for('admin_app.pastafari2_edit_users', server_id=server_id)}">${server['hostname']} - ${_('Users')}</a> &gt;&gt; ${_('Delete user')}</p>
<div class="form">
<form method="post" id="delete_user">
<p><strong>${_('User')}</strong>: ${username}</p>
<p><strong>${_('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.')}</strong></p>
<input type="hidden" name="user_id" value="${user_id}" />
<p id="user_delete_error" class="error"></p>
<p><input type="submit" value="${_('Confirm delete user?')}" /></p>
</form>
</div>
<p><a href="${url_for('.pastafari2_dashboard')}">${_('Servers')}</a> &gt;&gt; <a href="${url_for('admin_app.pastafari2_edit_users', server_id=server_id)}">${server['hostname']} - ${_('Users')}</a> &gt;&gt; ${_('Delete user')}</p>
</%block>
<%block name="jscript_block">
<script language="Javascript" src="${make_media_url('js/jsutils/posting2.js', 'pastafari2')}"></script>
<script>
var options={url: "${url_for('admin_app.pastafari2_delete_user_db', server_id=server_id)}", loading: '#layer_loading', pre_callback: function (data) {
//alert('This action overwrite all ssh keys');
}, success: function (data) {
location.href="${url_for('admin_app.pastafari2_edit_users', server_id=server_id)}";
}
};
$('#delete_user').sendPost(options);
</script>
</%block>