mirror of
https://github.com/Pardus-LiderAhenk/ahenk
synced 2024-12-25 17:42:17 +03:00
228 lines
10 KiB
Python
228 lines
10 KiB
Python
|
#!/usr/bin/python
|
|||
|
# -*- coding: utf-8 -*-
|
|||
|
# Author: Cemre ALPSOY <cemre.alpsoy@agem.com.tr>
|
|||
|
|
|||
|
from base.plugin.abstract_plugin import AbstractPlugin
|
|||
|
import json
|
|||
|
|
|||
|
|
|||
|
class ServiceManagement(AbstractPlugin):
|
|||
|
def __init__(self, data, context):
|
|||
|
super(AbstractPlugin, self).__init__()
|
|||
|
self.data = data
|
|||
|
self.context = context
|
|||
|
self.logger = self.get_logger()
|
|||
|
self.message_code = self.get_message_code()
|
|||
|
self.service_status = 'service {} status'
|
|||
|
|
|||
|
def start_stop_service(self, service_name, service_action):
|
|||
|
(result_code, p_out, p_err) = self.execute('service {0} {1}'.format(service_name, service_action))
|
|||
|
if result_code == 0:
|
|||
|
message = 'Service start/stop action was successful: '.format(service_action)
|
|||
|
|
|||
|
else:
|
|||
|
message = 'Service action was unsuccessful: {0}, return code {1}'.format(service_action, str(result_code))
|
|||
|
|
|||
|
self.logger.debug(message)
|
|||
|
return result_code, message
|
|||
|
|
|||
|
def is_service_exist(self, service_name):
|
|||
|
result_code, p_out, p_err = self.execute("service --status-all")
|
|||
|
p_err = ' ' + p_err
|
|||
|
p_out = ' ' + p_out
|
|||
|
lines = p_out.split('\n')
|
|||
|
for line in lines:
|
|||
|
line_split = line.split(' ')
|
|||
|
if len(line_split) >= 5:
|
|||
|
result, out, err = self.execute(self.service_status.format(service_name))
|
|||
|
|
|||
|
if 'Unknown job' not in str(err):
|
|||
|
if line_split[len(line_split) - 4] == '+':
|
|||
|
return "ACTIVE"
|
|||
|
elif line_split[len(line_split) - 4] == '-':
|
|||
|
return "INACTIVE"
|
|||
|
else:
|
|||
|
return "NOTFOUND"
|
|||
|
|
|||
|
def is_service_running(self, service_name):
|
|||
|
result_code, p_out, p_err = self.execute("ps -A")
|
|||
|
if service_name in p_out:
|
|||
|
return True
|
|||
|
else:
|
|||
|
return False
|
|||
|
|
|||
|
def set_startup_service(self, service_name):
|
|||
|
(result_code, p_out, p_err) = self.execute('update-rc.d {} defaults'.format(service_name))
|
|||
|
|
|||
|
if result_code == 0:
|
|||
|
message = 'Service startup action was successful: {}'.format(service_name)
|
|||
|
else:
|
|||
|
message = 'Service action was unsuccessful: {0}, return code {1}'.format(service_name, str(result_code))
|
|||
|
|
|||
|
self.logger.debug('SERVICE' + message)
|
|||
|
return result_code, message
|
|||
|
|
|||
|
def send_mail(self, stopped_services, all_services):
|
|||
|
if self.context.is_mail_send():
|
|||
|
mail_content = self.context.get_mail_content();
|
|||
|
if mail_content.__contains__('{stopped_services}'):
|
|||
|
mail_content = str(mail_content).replace('{stopped_services}', str(stopped_services));
|
|||
|
if mail_content.__contains__('{ahenk}'):
|
|||
|
mail_content = str(mail_content).replace('{ahenk}', str(self.Ahenk.dn()));
|
|||
|
|
|||
|
self.context.set_mail_content(mail_content)
|
|||
|
|
|||
|
self.context.create_response(code=self.message_code.TASK_PROCESSED.value,
|
|||
|
message='Servis izleme görevi başarıyla oluşturuldu.',
|
|||
|
data=json.dumps({
|
|||
|
'Result': 'İşlem Başarı ile gercekleştirildi',
|
|||
|
'mail_content': str(self.context.get_mail_content()),
|
|||
|
'mail_subject': str(self.context.get_mail_subject()),
|
|||
|
'mail_send': self.context.is_mail_send(),
|
|||
|
'services': all_services
|
|||
|
}),
|
|||
|
content_type=self.get_content_type().APPLICATION_JSON.value)
|
|||
|
else:
|
|||
|
self.context.create_response(code=self.message_code.TASK_PROCESSED.value,
|
|||
|
message='Servis izleme görevi başarıyla oluşturuldu.',
|
|||
|
data=json.dumps({
|
|||
|
'Result': 'İşlem Başarı ile gercekleştirildi',
|
|||
|
'mail_send': self.context.is_mail_send(),
|
|||
|
'services': all_services
|
|||
|
}),
|
|||
|
content_type=self.get_content_type().APPLICATION_JSON.value)
|
|||
|
|
|||
|
def save_service(self, service):
|
|||
|
cols = ['serviceName', 'serviceStatus', 'timestamp', 'task_id'];
|
|||
|
values = [service["serviceName"], service["serviceStatus"], self.timestamp(),service['task_id']]
|
|||
|
return self.db_service.update('service', cols, values)
|
|||
|
|
|||
|
def save_service_list(self, service_list):
|
|||
|
cols = ['serviceName', 'serviceStatus', 'timestamp', 'task_id'];
|
|||
|
values = [service_list[1], service_list[2], self.timestamp(), service_list[4]]
|
|||
|
return self.db_service.update('service', cols, values, 'id='+ str(service_list[0]))
|
|||
|
|
|||
|
def get_service_status(self,service):
|
|||
|
service_name = service["serviceName"] + ".service"
|
|||
|
serviceStatus = service["serviceStatus"]
|
|||
|
result_code, p_out, p_err = self.execute("systemctl status " + str(service_name) + " | grep 'Active\|Loaded'")
|
|||
|
# self.logger.debug("-----p_out"+ str(p_out))
|
|||
|
if 'not-found' in p_out:
|
|||
|
service["serviceStatus"] = 'Service Not Found'
|
|||
|
|
|||
|
elif 'running' in p_out:
|
|||
|
service["serviceStatus"] = 'Running'
|
|||
|
|
|||
|
elif ('inactive' in p_out) or ('failed' in p_out):
|
|||
|
service["serviceStatus"] = 'Stopped'
|
|||
|
elif ('abandoned' in p_out):
|
|||
|
service["serviceStatus"] = 'Active Abandoned'
|
|||
|
else:
|
|||
|
service["serviceStatus"] = 'Running'
|
|||
|
|
|||
|
return service
|
|||
|
|
|||
|
def save_service_status(self, service):
|
|||
|
service= self.get_service_status(service)
|
|||
|
self.save_service(service)
|
|||
|
|
|||
|
|
|||
|
def get_services_status(self, services):
|
|||
|
for service in services:
|
|||
|
service= self.get_service_status(service)
|
|||
|
|
|||
|
def get_services_status_and_save(self, services):
|
|||
|
for service in services:
|
|||
|
service= self.get_service_status(service)
|
|||
|
service_id_from_db=self.save_service(service)
|
|||
|
service['id']=service_id_from_db
|
|||
|
|
|||
|
def handle_task(self):
|
|||
|
try:
|
|||
|
self.logger.debug("Service Management task is started.")
|
|||
|
services = self.data['serviceManageParam']
|
|||
|
task_id= self.context.get('task_id')
|
|||
|
# setting task id
|
|||
|
for srv in services:
|
|||
|
srv['task_id']=task_id
|
|||
|
srv['agentDn']=self.Ahenk.dn()
|
|||
|
srv['isServiceMonitoring']= True
|
|||
|
|
|||
|
db_services = self.db_service.select('service', '*','task_id=' +str(task_id))
|
|||
|
|
|||
|
if len(db_services) < 1:
|
|||
|
self.get_services_status_and_save(services)
|
|||
|
|
|||
|
stopped_services = ''
|
|||
|
for servc in services:
|
|||
|
if servc['serviceStatus'] == 'Stopped':
|
|||
|
stopped_services += servc['serviceName'] + ' ,'
|
|||
|
|
|||
|
if stopped_services != '':
|
|||
|
self.send_mail(stopped_services, services)
|
|||
|
else:
|
|||
|
self.context.create_response(code=self.message_code.TASK_PROCESSED.value,
|
|||
|
message='Servis izleme görevi başarıyla oluşturuldu.',
|
|||
|
data=json.dumps({
|
|||
|
'Result': 'İşlem Başarı ile gercekleştirildi',
|
|||
|
'services': services,
|
|||
|
}),
|
|||
|
content_type=self.get_content_type().APPLICATION_JSON.value)
|
|||
|
else:
|
|||
|
servicesStatusChanged =[]
|
|||
|
self.get_services_status(services)
|
|||
|
for srv in services:
|
|||
|
isExist=False;
|
|||
|
for srvDb in db_services:
|
|||
|
if srv['serviceName'] == srvDb[1]:
|
|||
|
isExist=True
|
|||
|
if isExist ==False:
|
|||
|
srv=self.get_service_status(srv)
|
|||
|
self.save_service(srv)
|
|||
|
|
|||
|
|
|||
|
for srv in services:
|
|||
|
for srvDb in db_services:
|
|||
|
srvDbList=list(srvDb)
|
|||
|
if srv['serviceName'] == srvDb[1] and srv['serviceStatus'] != srvDbList[2]:
|
|||
|
srvDbList[2]=srv['serviceStatus']
|
|||
|
self.save_service_list(srvDbList)
|
|||
|
servicesStatusChanged.append(srv)
|
|||
|
|
|||
|
if len(servicesStatusChanged)>0:
|
|||
|
|
|||
|
stopped_services=''
|
|||
|
for servc in servicesStatusChanged:
|
|||
|
if servc['serviceStatus']== 'Stopped' :
|
|||
|
stopped_services += servc['serviceName'] + ' ,'
|
|||
|
|
|||
|
if stopped_services != '':
|
|||
|
|
|||
|
self.send_mail(stopped_services,servicesStatusChanged)
|
|||
|
|
|||
|
else:
|
|||
|
self.context.create_response(code=self.message_code.TASK_PROCESSED.value,
|
|||
|
message='Servis izleme görevi başarıyla oluşturuldu.',
|
|||
|
data=json.dumps({
|
|||
|
'Result': 'İşlem Başarı ile gercekleştirildi',
|
|||
|
'services': servicesStatusChanged
|
|||
|
}),
|
|||
|
content_type=self.get_content_type().APPLICATION_JSON.value)
|
|||
|
else:
|
|||
|
self.context.create_response(code=None,
|
|||
|
message='Servis izleme görevi başarıyla oluşturuldu.',
|
|||
|
data=None,
|
|||
|
content_type=self.get_content_type().APPLICATION_JSON.value)
|
|||
|
|
|||
|
|
|||
|
except Exception as e:
|
|||
|
self.logger.error(str(e))
|
|||
|
self.context.create_response(code=self.message_code.TASK_ERROR.value,
|
|||
|
message='Servis yönetimi sırasında bir hata oluştu: {0}'.format(
|
|||
|
str(e)))
|
|||
|
|
|||
|
|
|||
|
def handle_task(task, context):
|
|||
|
plugin = ServiceManagement(task, context)
|
|||
|
plugin.handle_task()
|