LCM/scripts/python3/Register.py (124 lines of code) (raw):

#!/usr/bin/env python3 import sys import os import os.path import tempfile import shutil from sys import argv from os.path import dirname, join, realpath import warnings with warnings.catch_warnings(): warnings.filterwarnings("ignore",category=DeprecationWarning) from imp import load_source pathToCurrentScript = realpath(__file__) pathToCommonScriptsFolder = dirname(pathToCurrentScript) DSCLogPath = join(pathToCommonScriptsFolder, 'nxDSCLog.py') nxDSCLog = load_source('nxDSCLog', DSCLogPath) LG = nxDSCLog.DSCLog def usage(): print("""Usage: Register.py [OPTIONS] OPTIONS (case insensitive): --RegistrationKey KEY --ServerURL URL --ConfigurationName NAME --RefreshFrequencyMins NUM default=30 --ConfigurationModeFrequencyMins NUM default=15 --ConfigurationMode (ApplyAndMonitor, ApplyAndAutoCorrect, ApplyOnly, MonitorOnly) default=ApplyAndMonitor --RefreshMode (Pull|Push) default=Pull --Help """) LG().Log("DEBUG", "Starting script logic for " + argv[0]+ " runing with python " + str(sys.version_info)) # Apply a DSC meta configuration based on a template Variables = dict() # Parse command line arguments args = [] optlist = [] command_line_length = len(sys.argv) i = 0 inArgument = False currentArgument = "" arg = "" while i < command_line_length: arg = sys.argv[i] if i == 0: # skip the program name i += 1 continue if inArgument: Variables[currentArgument] = arg inArgument = False else: if arg[0:2] == "--": inArgument = True currentArgument = arg[2:].lower() else: # The rest are not options args = sys.argv[i:] break i += 1 if inArgument: Variables[currentArgument] = arg AcceptableOptions = ["registrationkey", "serverurl", "configurationname", "refreshfrequencymins", "configurationmodefrequencymins", "configurationmode", "refreshmode", "help", "regeneratecert"] if "help" in Variables: usage() sys.exit(0) optionsValid = True for arg in Variables.keys(): if arg.lower() not in AcceptableOptions: optionsValid = False print("Error: %s is not a valid option" % arg) if len(Variables.keys()) == 0: if len(args) == 2: # Assume first parameter is RegistrationKey and second parameter is ServerURL in this case Variables["registrationkey"] = args[0] Variables["serverurl"] = args[1] else: print("Error: Unexpected (" + str(len(args)) + ") number of non-option arguments. Without options specified, we expect arguments to be RegistrationKey followed by ServerURL.") optionsValid = False if optionsValid == False: usage() sys.exit(1) ServerURL = "" RegistrationKey = "" ConfigurationName = "" # If RefreshMode == Pull (which is default), then RegistrationKey and ServerURL are required. RefreshMode = "Pull" if "refreshmode" in Variables: RefreshMode = Variables["refreshmode"] if RefreshMode == "Pull": if "registrationkey" not in Variables: print("Error: RegistrationKey must be specified for Pull mode") usage() sys.exit(1) if "serverurl" not in Variables: print("Error: ServerURL must be specified for Pull mode") usage() sys.exit(1) ServerURL = Variables["serverurl"] RegistrationKey = Variables["registrationkey"] if "configurationname" in Variables: ConfigurationName = Variables["configurationname"] ConfigurationMode = "ApplyAndMonitor" if "configurationmode" in Variables: ConfigurationMode = Variables["configurationmode"] RefreshFrequencyMins = "30" if "refreshfrequencymins" in Variables: RefreshFrequencyMins = Variables["refreshfrequencymins"] ConfigurationModeFrequencyMins = "15" if "configurationmodefrequencymins" in Variables: ConfigurationModeFrequencyMins = Variables["configurationmodefrequencymins"] RegenerateCert = False if "regeneratecert" in Variables: RegenerateCert = True metaConfig = "" if RefreshMode == "Push": metaConfig = """ instance of MSFT_DSCMetaConfiguration as $MSFT_DSCMetaConfiguration1ref { DownloadManagerName = "WebDownloadManager"; RefreshMode = "<REFRESHMODE>"; ConfigurationMode = "<CONFIGURATIONMODE>"; }; instance of OMI_ConfigurationDocument { Version="1.0.0"; }; """ else: metaConfig=""" instance of MSFT_WebDownloadManager as $MSFT_WebDownloadManager1ref { ResourceID = "[ConfigurationRepositoryWeb]AzureAutomationDSC"; SourceInfo = "C:\\\\OaaS-RegistrationMetaConfig2.ps1::20::9::ConfigurationRepositoryWeb"; RegistrationKey = "<REGKEY>"; ServerURL = "<SERVERURL>"; ConfigurationNames = {"<CONFIGURATIONNAME>"}; }; instance of MSFT_WebResourceManager as $MSFT_WebResourceManager1ref { SourceInfo = "C:\\\\OaaS-RegistrationMetaConfig2.ps1::27::9::ResourceRepositoryWeb"; ResourceID = "[ResourceRepositoryWeb]AzureAutomationDSC"; RegistrationKey = "<REGKEY>"; ServerURL = "<SERVERURL>"; }; instance of MSFT_WebReportManager as $MSFT_WebReportManager1ref { SourceInfo = "C:\\\\OaaS-RegistrationMetaConfig2.ps1::34::9::ReportServerWeb"; ResourceID = "[ReportServerWeb]AzureAutomationDSC"; RegistrationKey = "<REGKEY>"; ServerURL = "<SERVERURL>"; }; instance of MSFT_DSCMetaConfiguration as $MSFT_DSCMetaConfiguration1ref { RefreshMode = "<REFRESHMODE>"; AllowModuleOverwrite = False; RefreshFrequencyMins = <REFRESHFREQUENCYMINS>; RebootNodeIfNeeded = False; ConfigurationModeFrequencyMins = <CONFIGURATIONMODEFREQUENCYMINS>; ConfigurationMode = "<CONFIGURATIONMODE>"; ResourceModuleManagers = { $MSFT_WebResourceManager1ref }; ReportManagers = { $MSFT_WebReportManager1ref }; ConfigurationDownloadManagers = { $MSFT_WebDownloadManager1ref }; }; instance of OMI_ConfigurationDocument { Version="2.0.0"; MinimumCompatibleVersion = "2.0.0"; CompatibleVersionAdditionalProperties= { "MSFT_DSCMetaConfiguration:StatusRetentionTimeInDays" }; Author="azureautomation"; Name="RegistrationMetaConfig"; }; """ metaConfig = metaConfig.replace("<REFRESHMODE>", RefreshMode) metaConfig = metaConfig.replace("<REFRESHFREQUENCYMINS>", RefreshFrequencyMins) metaConfig = metaConfig.replace("<CONFIGURATIONMODEFREQUENCYMINS>", ConfigurationModeFrequencyMins) metaConfig = metaConfig.replace("<CONFIGURATIONMODE>", ConfigurationMode) metaConfig = metaConfig.replace("<SERVERURL>", ServerURL) metaConfig = metaConfig.replace("<REGKEY>", RegistrationKey) metaConfig = metaConfig.replace("<CONFIGURATIONNAME>", ConfigurationName) # Write to file and run SendMetaConfigurationApply.py tempdir = tempfile.mkdtemp() meta_path = tempdir + "/metaconf.mof" f = open(meta_path, "w") f.write(metaConfig) f.close() # Generate new cert if specified if RegenerateCert == True: OAAS_CERTPATH="<OAAS_CERTPATH>" OAAS_KEYPATH="<OAAS_KEYPATH>" OAAS_THUMBPRINT="<OAAS_THUMBPRINT>" os.system("touch " + OAAS_KEYPATH + "; chmod 0600 " + OAAS_KEYPATH); os.system("touch " + OAAS_KEYPATH + "_old; chmod 0600 " + OAAS_KEYPATH + "_old"); os.system("openssl req -subj '/CN=DSC-OaaS' -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout " + OAAS_KEYPATH + "_old -out " + OAAS_CERTPATH + " && openssl rsa -in " + OAAS_KEYPATH + "_old -out " + OAAS_KEYPATH + " && rm -f " + OAAS_KEYPATH + "_old"); os.system("openssl x509 -noout -in " + OAAS_CERTPATH + " -fingerprint | sed 's/^.*=//' > " + OAAS_THUMBPRINT); os.system("<DSC_SCRIPT_PATH>/python3/SetDscLocalConfigurationManager.py -configurationmof " + meta_path) shutil.rmtree(tempdir) LG().Log("DEBUG", "End of script logic for " + argv[0] + " runing with python " + str(sys.version_info))