128 lines
No EOL
4.1 KiB
Python
128 lines
No EOL
4.1 KiB
Python
import os, codecs, sys, shutil, subprocess
|
|
from pathlib import Path
|
|
from linuxmusterLinuxclient7 import logging, constants, hooks, config
|
|
|
|
|
|
def applyAll():
|
|
"""
|
|
Applies all templates from `/usr/share/linuxmuster-linuxclient7/templates`
|
|
|
|
:return: True on success, False otherwise
|
|
:rtype: bool
|
|
"""
|
|
logging.info('Applying all configuration templates:')
|
|
|
|
templateDir = constants.configFileTemplateDir
|
|
for templateFile in os.listdir(templateDir):
|
|
templatePath = templateDir + '/' + templateFile
|
|
logging.info('* ' + templateFile + ' ...')
|
|
if not _apply(templatePath):
|
|
logging.error("Aborting!")
|
|
return False
|
|
|
|
# reload sctemctl
|
|
logging.info('Reloading systemctl ... ')
|
|
if not subprocess.call(["systemctl", "daemon-reload"]) == 0:
|
|
logging.error("Failed!")
|
|
return False
|
|
|
|
return True
|
|
|
|
# --------------------
|
|
# - Helper functions -
|
|
# --------------------
|
|
|
|
|
|
def _apply(templatePath):
|
|
try:
|
|
# read template file
|
|
rc, fileData = _readTextfile(templatePath)
|
|
|
|
if not rc:
|
|
logging.error('Failed!')
|
|
return False
|
|
|
|
fileData = _resolveVariables(fileData)
|
|
|
|
# get target path
|
|
firstLine = fileData.split('\n')[0]
|
|
targetFilePath = firstLine.partition(' ')[2]
|
|
|
|
# remove first line (the target file path)
|
|
fileData = fileData[fileData.find('\n'):]
|
|
|
|
# never ever overwrite sssd.conf, this will lead to issues!
|
|
# sssd.conf is written by `realm join`!
|
|
if targetFilePath in constants.notTemplatableFiles:
|
|
logging.warning("Skipping forbidden file {}".format(targetFilePath))
|
|
return True
|
|
|
|
# create target directory
|
|
Path(Path(targetFilePath).parent.absolute()).mkdir(parents=True, exist_ok=True)
|
|
|
|
# remove comment lines beginning with # from .xml files
|
|
if targetFilePath.endswith('.xml'):
|
|
fileData = _stripComment(fileData)
|
|
|
|
# write config file
|
|
logging.debug("-> to {}".format(targetFilePath))
|
|
with open(targetFilePath, 'w') as targetFile:
|
|
targetFile.write(fileData)
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
logging.error('Failed!')
|
|
logging.exception(e)
|
|
return False
|
|
|
|
def _resolveVariables(fileData):
|
|
# replace placeholders with values
|
|
rc, networkConfig = config.network()
|
|
|
|
if not rc:
|
|
return False, None
|
|
|
|
# network
|
|
fileData = fileData.replace('@@serverHostname@@', networkConfig["serverHostname"])
|
|
fileData = fileData.replace('@@domain@@', networkConfig["domain"])
|
|
fileData = fileData.replace('@@realm@@', networkConfig["realm"])
|
|
|
|
# constants
|
|
fileData = fileData.replace('@@userTemplateDir@@', constants.userTemplateDir)
|
|
fileData = fileData.replace('@@hiddenShareMountBasepath@@', constants.hiddenShareMountBasepath.format("%(USER)"))
|
|
|
|
# hooks
|
|
fileData = fileData.replace('@@hookScriptBoot@@', hooks.getLocalHookScript(hooks.Type.Boot))
|
|
fileData = fileData.replace('@@hookScriptShutdown@@', hooks.getLocalHookScript(hooks.Type.Shutdown))
|
|
fileData = fileData.replace('@@hookScriptLoginLogoutAsRoot@@', hooks.getLocalHookScript(hooks.Type.LoginLogoutAsRoot))
|
|
fileData = fileData.replace('@@hookScriptSessionStarted@@', hooks.getLocalHookScript(hooks.Type.SessionStarted))
|
|
|
|
return fileData
|
|
|
|
# read textfile in variable
|
|
def _readTextfile(filePath):
|
|
if not os.path.isfile(filePath):
|
|
return False, None
|
|
try:
|
|
infile = codecs.open(filePath ,'r', encoding='utf-8', errors='ignore')
|
|
content = infile.read()
|
|
infile.close()
|
|
return True, content
|
|
except Exception as e:
|
|
logging.info('Cannot read ' + filePath + '!')
|
|
logging.exception(e)
|
|
return False, None
|
|
|
|
# remove lines beginning with #
|
|
def _stripComment(fileData):
|
|
filedata_stripped = ''
|
|
for line in fileData.split('\n'):
|
|
if line[:1] == '#':
|
|
continue
|
|
else:
|
|
if filedata_stripped == '':
|
|
filedata_stripped = line
|
|
else:
|
|
filedata_stripped = filedata_stripped + '\n' + line
|
|
return filedata_stripped |