mirror of
https://github.com/sqall01/LSMS.git
synced 2024-11-16 17:18:26 +01:00
190 lines
7.3 KiB
Python
Executable file
190 lines
7.3 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
# written by sqall
|
|
# twitter: https://twitter.com/sqall01
|
|
# blog: https://h4des.org
|
|
# github: https://github.com/sqall01
|
|
#
|
|
# Licensed under the MIT License.
|
|
|
|
import os
|
|
import subprocess
|
|
import socket
|
|
import sys
|
|
import time
|
|
from scripts.config.config import START_PROCESS_TIMEOUT, TO_ADDR, FROM_ADDR, ALERTR_FIFO
|
|
from scripts.lib.alerts import raise_alert_alertr, raise_alert_mail
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
print_output = False
|
|
if ALERTR_FIFO is None and FROM_ADDR is None and TO_ADDR is None:
|
|
print_output = True
|
|
|
|
script_dir = os.path.dirname(os.path.abspath(__file__)) + "/scripts/"
|
|
for script in os.listdir(script_dir):
|
|
# Execute all python scripts.
|
|
if script[-3:] == ".py" and script != "__init__.py":
|
|
|
|
if print_output:
|
|
print("Executing %s" % script)
|
|
|
|
to_execute = [script_dir + script]
|
|
|
|
# Pass arguments to scripts.
|
|
if len(sys.argv) > 1:
|
|
to_execute.extend(sys.argv[1:])
|
|
|
|
process = None
|
|
try:
|
|
process = subprocess.Popen(to_execute,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE)
|
|
|
|
process.wait(START_PROCESS_TIMEOUT)
|
|
|
|
# Catch timeout.
|
|
except subprocess.TimeoutExpired:
|
|
if print_output:
|
|
print("Script '%s' timed out." % script)
|
|
|
|
else:
|
|
if ALERTR_FIFO is not None:
|
|
|
|
hostname = socket.gethostname()
|
|
optional_data = dict()
|
|
optional_data["script"] = script
|
|
optional_data["hostname"] = hostname
|
|
message = "Script '%s' on host '%s' timed out." % (script, hostname)
|
|
optional_data["message"] = message
|
|
|
|
raise_alert_alertr(ALERTR_FIFO,
|
|
optional_data)
|
|
|
|
if FROM_ADDR is not None and TO_ADDR is not None:
|
|
|
|
hostname = socket.gethostname()
|
|
subject = "[Security] Script '%s' on '%s' timed out" % (script, hostname)
|
|
message = "Script '%s' on host '%s' timed out." % (script, hostname)
|
|
|
|
raise_alert_mail(FROM_ADDR,
|
|
TO_ADDR,
|
|
subject,
|
|
message)
|
|
|
|
# Catch any execution error.
|
|
except Exception as e:
|
|
if print_output:
|
|
print("Executing script '%s' raised error: %s" % (script, str(e)))
|
|
|
|
else:
|
|
if ALERTR_FIFO is not None:
|
|
|
|
hostname = socket.gethostname()
|
|
optional_data = dict()
|
|
optional_data["script"] = script
|
|
optional_data["hostname"] = hostname
|
|
message = "Executing script '%s' on host '%s' raised error: %s" % (script, hostname, str(e))
|
|
optional_data["message"] = message
|
|
|
|
raise_alert_alertr(ALERTR_FIFO,
|
|
optional_data)
|
|
|
|
if FROM_ADDR is not None and TO_ADDR is not None:
|
|
|
|
hostname = socket.gethostname()
|
|
subject = "[Security] Executing script '%s' on '%s' raised error" % (script, hostname)
|
|
message = "Executing script '%s' on host '%s' raised error: %s" % (script, hostname, str(e))
|
|
|
|
raise_alert_mail(FROM_ADDR,
|
|
TO_ADDR,
|
|
subject,
|
|
message)
|
|
|
|
continue
|
|
|
|
exit_code = process.poll()
|
|
|
|
# Process did not terminate yet.
|
|
if exit_code is None:
|
|
process.terminate()
|
|
time.sleep(5)
|
|
exit_code = process.poll()
|
|
|
|
# Kill process if not exited.
|
|
if exit_code != -15:
|
|
if print_output:
|
|
print("Script '%s' did not terminate. Killing it." % script)
|
|
|
|
else:
|
|
if ALERTR_FIFO is not None:
|
|
|
|
hostname = socket.gethostname()
|
|
optional_data = dict()
|
|
optional_data["script"] = script
|
|
optional_data["hostname"] = hostname
|
|
message = "Script '%s' on host '%s' did not terminate. Killing it." % (script, hostname)
|
|
optional_data["message"] = message
|
|
|
|
raise_alert_alertr(ALERTR_FIFO,
|
|
optional_data)
|
|
|
|
if FROM_ADDR is not None and TO_ADDR is not None:
|
|
|
|
hostname = socket.gethostname()
|
|
subject = "[Security] Script '%s' on '%s' did not terminate" % (script, hostname)
|
|
message = "Script '%s' on host '%s' did not terminate. Killing it." % (script, hostname)
|
|
|
|
raise_alert_mail(FROM_ADDR,
|
|
TO_ADDR,
|
|
subject,
|
|
message)
|
|
|
|
# noinspection PyBroadException
|
|
try:
|
|
process.kill()
|
|
except:
|
|
pass
|
|
|
|
# Process executed successfully.
|
|
elif exit_code == 0:
|
|
if print_output:
|
|
stdout, stderr = process.communicate()
|
|
print(stdout.decode("ascii"))
|
|
print("")
|
|
|
|
continue
|
|
|
|
# Process encountered error.
|
|
else:
|
|
if print_output:
|
|
print("Script '%s' exited with exit code: %d" % (script, exit_code))
|
|
|
|
else:
|
|
if ALERTR_FIFO is not None:
|
|
hostname = socket.gethostname()
|
|
optional_data = dict()
|
|
optional_data["script"] = script
|
|
optional_data["hostname"] = hostname
|
|
message = "Script '%s' on host '%s' exited with exit code '%d'." % (script, hostname, exit_code)
|
|
optional_data["message"] = message
|
|
|
|
raise_alert_alertr(ALERTR_FIFO,
|
|
optional_data)
|
|
|
|
if FROM_ADDR is not None and TO_ADDR is not None:
|
|
hostname = socket.gethostname()
|
|
subject = "[Security] Script '%s' on '%s' unsuccessful" % (script, hostname)
|
|
message = "Script '%s' on host '%s' exited with exit code '%d'." % (script, hostname, exit_code)
|
|
|
|
raise_alert_mail(FROM_ADDR,
|
|
TO_ADDR,
|
|
subject,
|
|
message)
|
|
|
|
# noinspection PyBroadException
|
|
try:
|
|
process.kill()
|
|
except:
|
|
pass
|