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 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.generate_admin_class import GenerateAdminClass
from paramecio2.libraries.i18n import I18n, PGetText from paramecio2.libraries.i18n import I18n, PGetText
from paramecio2.modules.admin import admin_app, t as admin_t 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.db.webmodel import WebModel
from paramecio2.libraries.lists import AjaxList from paramecio2.libraries.lists import AjaxList
from paramecio2.libraries.db.extraforms.fileform import FileForm 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.libraries.task import Task as SSHTask
from modules.pastafari2.models.tasks import Task, LogTask from modules.pastafari2.models.tasks import Task, LogTask
from modules.pastafari2.libraries.configtask import config_task 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 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 #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=['<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'))) 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 pass
return {'error': error, 'form': error_form, 'txt_error': txt_error} 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/edit_users/<int:server_id>')
def pastafari2_edit_users(server_id):
@admin_app.route('/pastafari2/get_server_users', methods=['POST']) db=g.connection
def pastafari2_get_server_users():
#{"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":""} server=ServerDbTask(db)
# {"fields": [{"Username": true, "Options": false}], "rows": [{"username": "developer", "options": ""}], "html_pages": ""} 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]] 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': ''} arr_return={'fields': fields, 'rows': rows, 'html_pages': ''}
@ -888,4 +898,115 @@ def pastafari2_get_server_users():
return json.dumps(arr_return) 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.urls import make_media_url
from paramecio2.libraries import datetime from paramecio2.libraries import datetime
from paramecio2.modules.admin.models.admin import UserAdmin from paramecio2.modules.admin.models.admin import UserAdmin
from paramecio2.libraries.db.extrafields.usernamefield import UserNameField
from modules.pastafari2.models.tasks import LonelyIpField from modules.pastafari2.models.tasks import LonelyIpField
from paramecio2.libraries.db.extrafields.passwordfield import PasswordField from paramecio2.libraries.db.extrafields.passwordfield import PasswordField
#from modules.monit.models.monit import Server #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(corefields.ForeignKeyField('user_id', UserAdmin(connection), 11, True, 'id', 'group', select_fields=[]))
self.register(DateTimeField('last_login')) 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>