Added users support to pastafari

This commit is contained in:
Antonio de la Rosa 2025-11-01 01:02:26 +01:00
parent ba7fd8dcc9
commit 646f0bb721
5 changed files with 263 additions and 16 deletions

View file

@ -1,5 +1,5 @@
from settings import config
from flask import g, url_for, request, session, make_response
from flask import g, url_for, request, session, make_response, flash
from paramecio2.libraries.generate_admin_class import GenerateAdminClass
from paramecio2.libraries.i18n import I18n, PGetText
from paramecio2.modules.admin import admin_app, t as admin_t
@ -12,11 +12,11 @@ from modules.pastafari2.libraries.scandir import scandir
from paramecio2.libraries.db.webmodel import WebModel
from paramecio2.libraries.lists import AjaxList
from paramecio2.libraries.db.extraforms.fileform import FileForm
from paramecio2.libraries.formsutils import show_form
from paramecio2.libraries.formsutils import show_form, check_form
from modules.pastafari2.libraries.task import Task as SSHTask
from modules.pastafari2.models.tasks import Task, LogTask
from modules.pastafari2.libraries.configtask import config_task
from modules.pastafari2.models.pastafari2 import ServerGroup, ServerDbTask, UpdateServerScripts
from modules.pastafari2.models.pastafari2 import ServerGroup, ServerDbTask, UpdateServerScripts, SystemUser
from paramecio2.libraries.config_admin import config_admin
#from modules.pastafari2.settings.config_admin import pastafari_admin_i18n, pastafari_admin_i18n, pastafari_settings_i18n, pastafari_servers_i18n, pastafari_groups_i18n, pastafari_tasks_log_i18n, num_element_admin
@ -425,7 +425,7 @@ def options_options(row_id, row):
arr_options=['<a href="{}">{}</a>'.format(url_for('admin_app.pastafari2_edit_server', id=row_id, op_admin=1), _('Edit'))]
#arr_options.append('<a href="{}">{}</a>'.format(url_for('admin_app.pastafari2_edit_users', id=row_id, op_admin=1), _('Users')))
arr_options.append('<a href="{}">{}</a>'.format(url_for('admin_app.pastafari2_edit_users', server_id=row_id), _('Users')))
arr_options.append('<a href="{}">{}</a>'.format(url_for('admin_app.pastafari2_delete_server', server_id=row_id), _('Delete')))
@ -865,22 +865,32 @@ def pastafari2_save_positions():
pass
return {'error': error, 'form': error_form, 'txt_error': txt_error}
"""
@admin_app.route('/pastafari2/edit_users')
def pastafari2_edit_users():
return t.load_template('edit_users.phtml', title=_('Edit server users'), path_module='admin_app.pastafari2_dashboard')
@admin_app.route('/pastafari2/get_server_users', methods=['POST'])
def pastafari2_get_server_users():
@admin_app.route('/pastafari2/edit_users/<int:server_id>')
def pastafari2_edit_users(server_id):
#{"fields":[["Hostname",true],["IP",true],["Selected",false],["Options",false]],"rows":[{"hostname":"debian-pc.cuchulu.com","ip":"192.168.122.10","select_id":"<input type=\"checkbox\" name=\"server_id_14\" class=\"server_id\" value=\"14\"/>","id":"<a href=\"/pastafari2/edit_server/?id=14&op_admin=1\">Edit</a><br /><a href=\"/pastafari2/edit_users?id=14&op_admin=1\">Users</a><br /><a href=\"/pastafari2/delete_server/?server_id=14\">Delete</a><br /><a href=\"/pastafari2/edit_update/?server_id=14\">Edit update task</a>"}],"html_pages":""}
db=g.connection
# {"fields": [{"Username": true, "Options": false}], "rows": [{"username": "developer", "options": ""}], "html_pages": ""}
server=ServerDbTask(db)
arr_server=server.select_a_row(server_id)
return t.load_template('edit_users.phtml', title=_('Edit server users'), path_module='admin_app.pastafari2_dashboard', server_id=server_id, server_data=arr_server)
@admin_app.route('/pastafari2/get_server_users/<int:server_id>', methods=['POST'])
def pastafari2_get_server_users(server_id):
db=g.connection
fields=[['Username', True], ['Options', False]]
rows=[{'username': 'developer', 'options': ''}]
#rows=[{'username': 'developer', 'options': ''}]
rows=[]
with db.query('select * from systemuser WHERE server_id=%s', [server_id]) as cursor:
for user in cursor:
rows.append({'username': user['username'], 'options': ''})
arr_return={'fields': fields, 'rows': rows, 'html_pages': ''}
@ -888,4 +898,115 @@ def pastafari2_get_server_users():
return json.dumps(arr_return)
"""
@admin_app.route('/pastafari2/add_user/<int:server_id>')
def pastafari2_add_user(server_id):
db=g.connection
server=ServerDbTask(db)
system_user=SystemUser(db)
system_user.fields['server_id'].name_form=HiddenForm
system_user.fields['server_id'].extra_parameters=[]
system_user.create_forms()
arr_server=server.select_a_row(server_id)
if arr_server:
#system_user.forms['server_id'].default_value=arr_server['id']
#print(system_user.forms['server_id'].default_value)
form=show_form({'server_id': arr_server['id']}, system_user.forms, t, yes_error=False, pass_values=True, modelform_tpl='forms/modelform.phtml')
#system_user.forms['server_id'].parameters=[]
return t.load_template('add_user.phtml', title=_('Add server user'), path_module='admin_app.pastafari2_dashboard', server_id=server_id, hostname=arr_server['hostname'], form=form)
return ""
@admin_app.route('/pastafari2/add_user_task/', methods=['POST'])
def pastafari2_add_user_task():
db=g.connection
error_form={}
arr_log={}
error=True
txt_error=''
task_id=0
server_id=request.form.get('server_id', '0')
system_user=SystemUser(db)
system_user.create_forms()
#(error, fields, values, post)=system_user.check_all_fields(dict(request.form), external_agent=True)
(error, error_form, post, arr_form)=check_form(dict(request.form), system_user.forms)
if not error:
with db.query('select count(*) as num_user from systemuser WHERE username=%s', [post['username']]) as cursor:
num_user=cursor.fetchone()['num_user']
if num_user==0:
with db.query('select * from serverdbtask WHERE id=%s', [server_id]) as cursor:
arr_server=cursor.fetchone()
if arr_server:
sshtask=Task(db)
if not sshtask.run_task(arr_server['ip'], 'modules.pastafari2.tasks.system.add_user', 'Create user in server', 'Create_user', 'Task for create and user in the server', {'username': post['username'], 'home': '/home/{}'.format(post['username'])}, config_task.remote_user, '', '', url_for('admin_app.pastafari2_dashboard'), ssh_key_priv=config_task.ssh_private_key, ssh_key_password=config_task.ssh_private_key_password, send_task=True, ssh_port=arr_server['ssh_port']):
error=1
else:
error=0
task_id=sshtask.task_id
if task_id:
check_task=True
while check_task:
with db.query('select * from logtask where task_id=%s order by id DESC limit 1', [task_id]) as cursor:
arr_log=cursor.fetchone()
if arr_log:
if arr_log['status']==1:
error=arr_log['error']
error_form['#username_error']=arr_log['message']
check_task=False
if not error:
flash(_('The user was added successfully'))
else:
error=1
error_form['#username_error']=_('User exists')
else:
error=1
error_form['#username_error']='Username invalid'
return {'error': error, 'txt_error': txt_error, 'error_form': error_form, 'task_id': task_id, 'log': arr_log}

View file

@ -13,6 +13,7 @@ from paramecio2.libraries.db.extrafields.filefield import FileField
from paramecio2.libraries.urls import make_media_url
from paramecio2.libraries import datetime
from paramecio2.modules.admin.models.admin import UserAdmin
from paramecio2.libraries.db.extrafields.usernamefield import UserNameField
from modules.pastafari2.models.tasks import LonelyIpField
from paramecio2.libraries.db.extrafields.passwordfield import PasswordField
#from modules.monit.models.monit import Server
@ -115,4 +116,12 @@ class UserToken(WebModel):
self.register(corefields.ForeignKeyField('user_id', UserAdmin(connection), 11, True, 'id', 'group', select_fields=[]))
self.register(DateTimeField('last_login'))
class SystemUser(WebModel):
def __init__(self, connection):
super().__init__(connection)
self.register(UserNameField('username', 4096), True)
#self.register(corefields.CharField('home', 4096))
self.register(corefields.ForeignKeyField('server_id', ServerDbTask(connection), 11, False, 'id', 'group', select_fields=[]))

View file

@ -0,0 +1,53 @@
#!/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='add_user.py', description='A user to the linux system')
parser.add_argument('--user', help='The unix user', required=True)
parser.add_argument('--home', help='The home of the unix user')
parser.add_argument('--shell', help='The home of the unix user')
args=parser.parse_args()
if not linux.shell_command('sudo useradd -m -d {} -s {} {}'.format(args.home, args.shell, args.user)):
linux.json_log('Sorry, cannot create the new user, please check permissions and the users not exists', error=1, status=1, progress=100, no_progress=0, return_message=0, result=None)
exit(1)
"""
if args.password:
password_user=args.password
ret_pass=change_password(args.user, password_user)
if not ret_pass[0]:
print('Error, cannot change password for %s' % args.user+"\n"+ret_pass[1]+"\n")
exit(1)
else:
print('Changed password succesfully...\n')
"""
"""
if args.ssh_pub_key_file:
if call("sudo su - %s -s /bin/bash -c 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && touch ~/.ssh/authorized_keys' && sudo cat %s >> /home/%s/.ssh/authorized_keys && sudo usermod --shell /bin/bash %s" % (args.user, args.ssh_pub_key_file, args.user, args.user), shell=True) > 0:
print('Error, cannot add ssh pub key to user %s' % args.user )
exit(1)
else:
print('Added ssh key successfully...\n')
"""

View file

@ -0,0 +1,46 @@
<%inherit file="dashboard.phtml"/>
<%block name="content">
<p><a href="${url_for('admin_app.pastafari2_dashboard')}">${_('Servers')}</a> &gt;&gt; <a href="${url_for('admin_app.pastafari2_edit_users', server_id=server_id)}">${hostname} - ${_('Users')}</a> &gt;&gt; ${_('Add user')}</p>
<form method="post" name="add_user_form" id="add_user_form" >
${form|n}
<p><input type="submit" value="${_('Add user')}" />
</form>
<p><a href="${url_for('admin_app.pastafari2_dashboard')}">${_('Servers')}</a> &gt;&gt; <a href="${url_for('admin_app.pastafari2_edit_users', server_id=server_id)}">${hostname} - ${_('Users')}</a> &gt;&gt; ${_('Add user')}</p>
</%block>
<%block name="jscript_block">
<script type="text/javascript" src="${make_media_url('js/jsutils/posting2.js', 'pastafari2')}"></script>
<script>
var options={url: "${url_for('.pastafari2_add_user_task')}", loading: '#layer_loading', success: function (data) {
/*task_id=data.task_id;
if(task_id>0) {
//location.href="${url_for('.pastafari2_progress')}?task_id="+task_id;
$('#layer_loading').show();
}*/
if(!data.error) {
window.location='${url_for("admin_app.pastafari2_edit_users", server_id=server_id)}';
}
else {
alert(_('Cannot add the new users!.'));
}
}, error_data: function (data) {
console.log(JSON.stringify(data));
}
};
jQuery('#add_user_form').sendPost(options);
</script>
</%block>

View file

@ -0,0 +1,18 @@
<%inherit file="dashboard.phtml"/>
<%block name="content">
<p><a href="${url_for('admin_app.pastafari2_dashboard')}">${_('Servers')}</a> &gt;&gt; ${server_data['hostname']} - ${_('Users')}</p>
<p><a href="${url_for('admin_app.pastafari2_add_user', server_id=server_id)}">${_('Add new user to server')}</a></p>
<div id="table_users">
</div>
<p><strong>*${_('Only can edit users system created from this control panel')}</strong></p>
<p><a href="${url_for('admin_app.pastafari2_dashboard')}">${_('Servers')}</a> &gt;&gt; ${server_data['hostname']} - ${_('Users')}</p>
</%block>
<%block name="jscript_block">
<script src="${make_media_url('js/jsutils/posting2.js', 'pastafari2')}"></script>
<script src="${make_media_url('js/jsutils/ajax_list.js', 'pastafari2')}"></script>
<script>
options={'url': "${url_for('.pastafari2_get_server_users', server_id=server_id)}"};
alist=$('#table_users').ajaxList('table_list', options);
</script>
</%block>