mirror of
https://github.com/Pardus-LiderAhenk/ahenk
synced 2024-11-14 19:02:27 +03:00
agreement feature added to Ahenk. User must be accept agreement when first login on a Ahenk. Display and type of dm are getting on logging
This commit is contained in:
parent
b3299303a8
commit
4eb03dacde
3 changed files with 144 additions and 11 deletions
|
@ -10,7 +10,6 @@ import sys
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from base.Scope import Scope
|
from base.Scope import Scope
|
||||||
from base.command.commander import Commander
|
from base.command.commander import Commander
|
||||||
from base.config.ConfigManager import ConfigManager
|
from base.config.ConfigManager import ConfigManager
|
||||||
|
@ -27,6 +26,9 @@ from base.registration.Registration import Registration
|
||||||
from base.scheduler.scheduler_factory import SchedulerFactory
|
from base.scheduler.scheduler_factory import SchedulerFactory
|
||||||
from base.system.system import System
|
from base.system.system import System
|
||||||
from base.task.TaskManager import TaskManager
|
from base.task.TaskManager import TaskManager
|
||||||
|
from base.agreement.agreement import Agreement
|
||||||
|
from base.util.util import Util
|
||||||
|
from multiprocessing import Process
|
||||||
|
|
||||||
ahenkdaemon = None
|
ahenkdaemon = None
|
||||||
|
|
||||||
|
@ -155,7 +157,6 @@ class AhenkDeamon(BaseDaemon):
|
||||||
def run(self):
|
def run(self):
|
||||||
print('Ahenk running...')
|
print('Ahenk running...')
|
||||||
|
|
||||||
self.signal_number = 0
|
|
||||||
globalscope = Scope()
|
globalscope = Scope()
|
||||||
globalscope.setInstance(globalscope)
|
globalscope.setInstance(globalscope)
|
||||||
|
|
||||||
|
@ -197,6 +198,8 @@ class AhenkDeamon(BaseDaemon):
|
||||||
self.messenger = self.init_messenger()
|
self.messenger = self.init_messenger()
|
||||||
self.logger.info('[AhenkDeamon] Messager was set')
|
self.logger.info('[AhenkDeamon] Messager was set')
|
||||||
|
|
||||||
|
Agreement().agreement_contract_update()
|
||||||
|
|
||||||
self.init_message_response_queue()
|
self.init_message_response_queue()
|
||||||
|
|
||||||
# if registration.is_ldap_registered() is False:
|
# if registration.is_ldap_registered() is False:
|
||||||
|
@ -238,16 +241,58 @@ class AhenkDeamon(BaseDaemon):
|
||||||
self.logger.debug('[AhenkDeamon] Signal is :{}'.format(str(json_data['event'])))
|
self.logger.debug('[AhenkDeamon] Signal is :{}'.format(str(json_data['event'])))
|
||||||
|
|
||||||
if 'login' == str(json_data['event']):
|
if 'login' == str(json_data['event']):
|
||||||
self.logger.info('[AhenkDeamon] login event is handled for user: {}'.format(json_data['username']))
|
username = json_data['username']
|
||||||
login_message = message_manager.login_msg(json_data['username'])
|
display = json_data['display']
|
||||||
|
desktop = json_data['desktop']
|
||||||
|
self.logger.info('[AhenkDeamon] login event is handled for user: {}'.format(username))
|
||||||
|
login_message = message_manager.login_msg(username)
|
||||||
messenger.send_direct_message(login_message)
|
messenger.send_direct_message(login_message)
|
||||||
get_policy_message = message_manager.policy_request_msg(json_data['username'])
|
|
||||||
|
scope.getDbService().update('session', scope.getDbService().get_cols('session'), [username, display, desktop, Util.timestamp()])
|
||||||
|
|
||||||
|
agreement = Agreement()
|
||||||
|
agreement_choice = False
|
||||||
|
if agreement.check_agreement(username) is False:
|
||||||
|
self.logger.debug('[AhenkDeamon] User {} has not accepted agreement.'.format(username))
|
||||||
|
thread_ask = Process(target=agreement.ask, args=(username, display,))
|
||||||
|
thread_ask.start()
|
||||||
|
|
||||||
|
agreement_timeout = scope.getConfigurationManager().get('SESSION', 'agreement_timeout')
|
||||||
|
|
||||||
|
timeout = int(agreement_timeout) # sec
|
||||||
|
timer = time.time()
|
||||||
|
while 1:
|
||||||
|
if thread_ask.is_alive() is False:
|
||||||
|
self.logger.warning('[AhenkDeamon] {} was answered the question '.format(username))
|
||||||
|
if Agreement().check_agreement(username):
|
||||||
|
self.logger.warning('[AhenkDeamon] Choice of {} is YES'.format(username))
|
||||||
|
agreement_choice = True
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
self.logger.warning('[AhenkDeamon] Choice of {} is NO'.format(username))
|
||||||
|
agreement_choice = False
|
||||||
|
break
|
||||||
|
|
||||||
|
if (time.time() - timer) > timeout:
|
||||||
|
if thread_ask.is_alive():
|
||||||
|
thread_ask.terminate()
|
||||||
|
Util.execute('pkill -9 -u {}'.format(username))
|
||||||
|
self.logger.warning('[AhenkDeamon] Session of {} was ended because of timeout of contract agreement'.format(username))
|
||||||
|
break
|
||||||
|
time.sleep(0.1)
|
||||||
|
else:
|
||||||
|
agreement_choice = True
|
||||||
|
|
||||||
|
if agreement_choice is True:
|
||||||
|
get_policy_message = message_manager.policy_request_msg(username)
|
||||||
messenger.send_direct_message(get_policy_message)
|
messenger.send_direct_message(get_policy_message)
|
||||||
|
|
||||||
elif 'logout' == str(json_data['event']):
|
elif 'logout' == str(json_data['event']):
|
||||||
self.logger.info('[AhenkDeamon] logout event is handled for user: {}'.format(str(json_data['username'])))
|
username = json_data['username']
|
||||||
logout_message = message_manager.logout_msg(json_data['username'])
|
self.logger.info('[AhenkDeamon] logout event is handled for user: {}'.format(username))
|
||||||
|
logout_message = message_manager.logout_msg(username)
|
||||||
messenger.send_direct_message(logout_message)
|
messenger.send_direct_message(logout_message)
|
||||||
plugin_manager.process_safe_mode(str(json_data['username']))
|
plugin_manager.process_safe_mode(username)
|
||||||
elif 'send' == str(json_data['event']):
|
elif 'send' == str(json_data['event']):
|
||||||
self.logger.info('[AhenkDeamon] Sending message over ahenkd command. Response Message: {}'.format(str(json_data['message'])))
|
self.logger.info('[AhenkDeamon] Sending message over ahenkd command. Response Message: {}'.format(str(json_data['message'])))
|
||||||
message = str(json.dumps(json_data['message']))
|
message = str(json.dumps(json_data['message']))
|
||||||
|
@ -300,8 +345,6 @@ if __name__ == '__main__':
|
||||||
elif result is True:
|
elif result is True:
|
||||||
if System.Ahenk.is_running() is True:
|
if System.Ahenk.is_running() is True:
|
||||||
os.kill(int(System.Ahenk.get_pid_number()), signal.SIGALRM)
|
os.kill(int(System.Ahenk.get_pid_number()), signal.SIGALRM)
|
||||||
|
|
||||||
|
|
||||||
except(KeyboardInterrupt, SystemExit):
|
except(KeyboardInterrupt, SystemExit):
|
||||||
if System.Ahenk.is_running() is True:
|
if System.Ahenk.is_running() is True:
|
||||||
print('Ahenk will be closed.')
|
print('Ahenk will be closed.')
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
from base.Scope import Scope
|
||||||
|
from base.util.util import Util
|
||||||
|
|
||||||
|
|
||||||
|
class Agreement:
|
||||||
|
def __init__(self):
|
||||||
|
scope = Scope().getInstance()
|
||||||
|
self.logger = scope.getLogger()
|
||||||
|
self.message_manager = scope.getMessageManager()
|
||||||
|
self.messenger = scope.getMessenger()
|
||||||
|
self.db_service = scope.getDbService()
|
||||||
|
self.ask_path = '/opt/ahenk/base/agreement/ask.py'
|
||||||
|
self.logger.debug('[Agreement] Instance initialized.')
|
||||||
|
|
||||||
|
def agreement_contract_update(self):
|
||||||
|
self.messenger.send_direct_message(self.message_manager.agreement_request_msg())
|
||||||
|
self.logger.debug('[Agreement] Requested updated agreement contract from lider.')
|
||||||
|
|
||||||
|
def check_agreement(self, username):
|
||||||
|
self.logger.debug('[Agreement] Checking agreement for user {}.'.format(username))
|
||||||
|
contract_id = self.get_current_contract_id()
|
||||||
|
if contract_id is None:
|
||||||
|
self.logger.debug('[Agreement] There is no any contract in database.')
|
||||||
|
if self.db_service.select_one_result('agreement', 'id', " contract_id='{0}' and username='{1}' and choice='Y' ".format('-1', username)) is None:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
if self.db_service.select_one_result('agreement', 'id', " contract_id='{0}' and username='{1}' and choice='Y' ".format(contract_id, username)) is None:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_current_contract_id(self):
|
||||||
|
return self.db_service.select_one_result('contract', 'id', 'id =(select MAX(id) from contract)')
|
||||||
|
|
||||||
|
def ask(self, username, display):
|
||||||
|
|
||||||
|
result = self.db_service.select('contract', ['content', 'title', 'id'], 'id =(select MAX(id) from contract)')
|
||||||
|
|
||||||
|
# TODO sec read from conf file
|
||||||
|
|
||||||
|
if result is None or len(result) < 1:
|
||||||
|
content = 'Ahenk kurulu bu bilgisayarda ilk defa oturum açıyorsunuz. ' \
|
||||||
|
'Devam ederseniz Lider-Ahenk in bilgisayar üzeride yapacağı ' \
|
||||||
|
'tüm işlemlere onay vermiş sayılacaksınız. Kabul ediyor musunuz?' \
|
||||||
|
' \n({} saniye içinde olumlu cevaplandırmadığınız takdirde oturumunuz ' \
|
||||||
|
'sonlandırılacaktır.)'.format(10)
|
||||||
|
title = 'Ahenk Kurulu Bilgisayar Kullanım Anlaşması'
|
||||||
|
contract_id = '-1'
|
||||||
|
else:
|
||||||
|
content = result[0]
|
||||||
|
title = result[1]
|
||||||
|
contract_id = result[2]
|
||||||
|
|
||||||
|
command = 'export DISPLAY={0};python3 {1} \'{2}\' \'{3}\' '.format(display, self.ask_path, content, title)
|
||||||
|
result_code, p_out, p_err = Util.execute(command, as_user=username)
|
||||||
|
pout = str(p_out).replace('\n', '')
|
||||||
|
if pout != 'Error':
|
||||||
|
if pout == 'Y':
|
||||||
|
self.logger.debug('[Agreement] Agreement was accepted by {}.'.format(username))
|
||||||
|
self.db_service.update('agreement', self.db_service.get_cols('agreement'), [contract_id, username, Util.timestamp(), 'Y'])
|
||||||
|
elif pout == 'N':
|
||||||
|
self.db_service.update('agreement', self.db_service.get_cols('agreement'), [contract_id, username, Util.timestamp(), 'N'])
|
||||||
|
self.logger.debug('[Agreement] Agreement was ignored by {}. Session will be closed'.format(username))
|
||||||
|
Util.execute('pkill -9 -u {}'.format(username))
|
||||||
|
else:
|
||||||
|
self.logger.error('[Agreement] A problem occurred while executing ask.py. Error Message: {}'.format(str(pout)))
|
||||||
|
else:
|
||||||
|
self.logger.error('[Agreement] A problem occurred while executing ask.py (Probably argument fault). Error Message: {}'.format(str(pout)))
|
20
opt/ahenk/base/agreement/ask.py
Normal file → Executable file
20
opt/ahenk/base/agreement/ask.py
Normal file → Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
import sys
|
||||||
|
import easygui
|
||||||
|
|
||||||
|
|
||||||
|
def ask(content, title):
|
||||||
|
choice = easygui.ynbox(content, title, ('Evet', 'Hayır'))
|
||||||
|
if choice:
|
||||||
|
print('Y')
|
||||||
|
else:
|
||||||
|
print('N')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
if len(sys.argv) == 3:
|
||||||
|
try:
|
||||||
|
ask(sys.argv[1], sys.argv[2])
|
||||||
|
except Exception as e:
|
||||||
|
print(str(e))
|
||||||
|
else:
|
||||||
|
print('Error')
|
Loading…
Reference in a new issue