diff --git a/admin/dashboard.py b/admin/dashboard.py index 2055975..5367fb9 100644 --- a/admin/dashboard.py +++ b/admin/dashboard.py @@ -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=['{}'.format(url_for('admin_app.pastafari2_edit_server', id=row_id, op_admin=1), _('Edit'))] - #arr_options.append('{}'.format(url_for('admin_app.pastafari2_edit_users', id=row_id, op_admin=1), _('Users'))) + arr_options.append('{}'.format(url_for('admin_app.pastafari2_edit_users', server_id=row_id), _('Users'))) arr_options.append('{}'.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/') +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":"","id":"Edit
Users
Delete
Edit update task"}],"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/', 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/') +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} + diff --git a/models/pastafari2.py b/models/pastafari2.py index 4d3d2d0..4dfa509 100644 --- a/models/pastafari2.py +++ b/models/pastafari2.py @@ -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=[])) + diff --git a/scripts/system/add_user.py b/scripts/system/add_user.py new file mode 100644 index 0000000..7600438 --- /dev/null +++ b/scripts/system/add_user.py @@ -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') +""" diff --git a/templates/admin/add_user.phtml b/templates/admin/add_user.phtml new file mode 100644 index 0000000..e76d04d --- /dev/null +++ b/templates/admin/add_user.phtml @@ -0,0 +1,46 @@ +<%inherit file="dashboard.phtml"/> +<%block name="content"> +

${_('Servers')} >> ${hostname} - ${_('Users')} >> ${_('Add user')}

+
+ ${form|n} +

+

+

${_('Servers')} >> ${hostname} - ${_('Users')} >> ${_('Add user')}

+ +<%block name="jscript_block"> + + + diff --git a/templates/admin/edit_users.phtml b/templates/admin/edit_users.phtml new file mode 100644 index 0000000..9857163 --- /dev/null +++ b/templates/admin/edit_users.phtml @@ -0,0 +1,18 @@ +<%inherit file="dashboard.phtml"/> +<%block name="content"> +

${_('Servers')} >> ${server_data['hostname']} - ${_('Users')}

+

${_('Add new user to server')}

+
+
+

*${_('Only can edit users system created from this control panel')}

+

${_('Servers')} >> ${server_data['hostname']} - ${_('Users')}

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