import datetime
import os
import sys
import fcntl


class ClAuditLog:
	def __init__(self, log_file_name):
		self._log_file_name = log_file_name

	def info_log_write(self, msg=""):
		dt_now = datetime.datetime.now()
		# Determine parent PID and it's name
		parent_proc_id = os.getppid()
		# Determine parent process name
		proc_name = self._get_process_name(parent_proc_id)

		# write to log file
		try:
			audit_log_file = open(self._log_file_name, 'a')
			fcntl.lockf(audit_log_file, fcntl.LOCK_EX | fcntl.LOCK_NB)
			audit_log_file.write(dt_now.strftime("%Y.%m.%d %H:%M:%S") +
								": Parent process: " + proc_name +
								" (PID: " + str(parent_proc_id) + "): Args: " + str(sys.argv[1:]) +
								" " + msg + "\n")
			audit_log_file.close()
		except (IOError, OSError):
			# Ignore all file errors
			pass

	@staticmethod
	def _get_process_name(pid):
		'''
		Get process name by pid
		:param pid: PID for get process name
		:return: process name
		'''
		name = "<Unknown>"
		try:
			f = open("/proc/%s/stat" % pid, 'r')
			name = f.read().split(' ')[1].replace('(', '').replace(')', '')
			f.close()
		except:
			pass
		return name
