File: //usr/bin/fm-agent/fm_agent.py
#!/usr/bin/env python
import sys
import platform
import os
ACCEPTABLE_SYNC_DELAY = 20
AGG_URL = "rx.us01.fortimonitor.com"
BASE_CONFIG_DIR = "/etc"
BASE_CUSTOM_PLUGIN_DIR = "/usr/share"
BASE_DATA_DIR = "/var/lib"
BASE_LOG_DIR = "/var/log"
BIN_DIR = "/usr/bin/fm-agent"
BRAND = "fm"
LIB_DIR = "/usr/lib/fm-agent"
PKG_DIR = "fm-agent"
STARTUP_TIMEOUT = 2 # In minutes
USER = "fm-agent"
VERSION = "2025.4.5"
if "freebsd" in sys.platform.lower():
sys.path.insert(0, "/usr/local/fm-agent/lib/dependencies")
# Add platform/version-specific dependency directory if present
version = sys.version_info
sys.path.insert(
0,
"/usr/local/fm-agent/lib/dependencies/%s/python%s.%s"
% (sys.platform, version[0], version[1]),
)
sys.path.insert(0, "/usr/local/fm-agent/lib/library")
BASE_CONFIG_DIR = "/usr/local/etc"
BIN_DIR = "/usr/local/fm-agent/bin"
LIB_DIR = "/usr/local/fm-agent/lib"
elif "darwin" == sys.platform.lower():
filePath = os.path.realpath(__file__)
agent_bin, _ = os.path.split(filePath)
agent_version_dir = os.path.split(agent_bin)[0]
agent_home = os.path.split(agent_version_dir)[0]
architecture = None
import subprocess
with subprocess.Popen(
"arch", shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE
) as p:
try:
stdout, stderr = p.communicate(timeout=5.0)
architecture = stdout.decode("utf-8").strip()
except subprocess.TimeoutExpired:
p.kill()
if architecture is None:
sys.stderr.write("Could not determine machine architecture\n")
sys.exit(-12)
svi = sys.version_info
py_executable_root = os.path.join(
os.path.dirname(os.path.dirname(sys.executable)),
"lib/python{}.{}/site-packages".format(svi.major, svi.minor),
)
searchPaths = [
"lib",
"lib/library",
"{}/{}".format(py_executable_root, architecture),
"lib/dependencies",
]
for dir in searchPaths:
sys.path.insert(0, os.path.join(agent_version_dir, dir))
BASE_CONFIG_DIR = os.path.join(agent_home, "config")
BASE_CUSTOM_PLUGIN_DIR = os.path.join(agent_home, "share")
BASE_DATA_DIR = os.path.join(agent_home, "data")
BASE_LOG_DIR = os.path.join(agent_home, "logs")
BIN_DIR = os.path.join(agent_version_dir, "bin")
LIB_DIR = os.path.join(agent_version_dir, "lib")
else:
# Add the main dependency directory
sys.path.insert(0, "/usr/lib/fm-agent/dependencies")
# Add platform/version-specific dependency directory if present
version = sys.version_info
try:
is_64bit = sys.maxsize > 2**32
except:
is_64bit = True
os_name = sys.platform
if not is_64bit:
os_name += "-32"
sys.path.insert(
0,
"/usr/lib/fm-agent/dependencies/%s/python%s.%s"
% (os_name, version[0], version[1]),
)
# Add the main agent code directory
sys.path.insert(0, "/usr/lib/fm-agent/library")
sys.path.insert(0, "/usr/lib/fm-agent/")
# Add processor/platform/version dependency directory if present, in order to pick up
# Sparc libraries properly
processor = platform.uname()[-1]
sys.path.insert(
0,
"/usr/lib/fm-agent/dependencies/%s/%s/python%s.%s"
% (processor, os_name, version[0], version[1]),
)
# Add the main agent code directory
sys.path.insert(0, "/usr/lib/fm-agent/library")
from agent import Agent
if __name__ == "__main__":
agent = Agent(
BRAND,
AGG_URL,
VERSION,
USER,
BIN_DIR,
LIB_DIR,
PKG_DIR,
STARTUP_TIMEOUT,
BASE_CONFIG_DIR,
BASE_CUSTOM_PLUGIN_DIR,
BASE_DATA_DIR,
BASE_LOG_DIR,
ACCEPTABLE_SYNC_DELAY,
)
agent.main()