1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
|
# Microsoft Azure Linux Agent
#
# Copyright 2014 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Requires Python 2.4+ and Openssl 1.0+
#
"""
Module conf loads and parses configuration file
"""
import os
import os.path
import azurelinuxagent.common.utils.fileutil as fileutil
from azurelinuxagent.common.exception import AgentConfigError
class ConfigurationProvider(object):
"""
Parse and store key:values in /etc/waagent.conf.
"""
def __init__(self):
self.values = dict()
def load(self, content):
if not content:
raise AgentConfigError("Can't not parse empty configuration")
for line in content.split('\n'):
if not line.startswith("#") and "=" in line:
parts = line.split('=')
if len(parts) < 2:
continue
key = parts[0].strip()
value = parts[1].split('#')[0].strip("\" ")
self.values[key] = value if value != "None" else None
def get(self, key, default_val):
val = self.values.get(key)
return val if val is not None else default_val
def get_switch(self, key, default_val):
val = self.values.get(key)
if val is not None and val.lower() == 'y':
return True
elif val is not None and val.lower() == 'n':
return False
return default_val
def get_int(self, key, default_val):
try:
return int(self.values.get(key))
except TypeError:
return default_val
except ValueError:
return default_val
__conf__ = ConfigurationProvider()
def load_conf_from_file(conf_file_path, conf=__conf__):
"""
Load conf file from: conf_file_path
"""
if os.path.isfile(conf_file_path) == False:
raise AgentConfigError(("Missing configuration in {0}"
"").format(conf_file_path))
try:
content = fileutil.read_file(conf_file_path)
conf.load(content)
except IOError as err:
raise AgentConfigError(("Failed to load conf file:{0}, {1}"
"").format(conf_file_path, err))
__SWITCH_OPTIONS__ = {
"OS.AllowHTTP" : False,
"OS.EnableFirewall" : False,
"OS.EnableFIPS" : False,
"OS.EnableRDMA" : False,
"OS.UpdateRdmaDriver" : False,
"OS.CheckRdmaDriver" : False,
"Logs.Verbose" : False,
"Provisioning.Enabled" : True,
"Provisioning.UseCloudInit" : False,
"Provisioning.AllowResetSysUser" : False,
"Provisioning.RegenerateSshHostKeyPair" : False,
"Provisioning.DeleteRootPassword" : False,
"Provisioning.DecodeCustomData" : False,
"Provisioning.ExecuteCustomData" : False,
"Provisioning.MonitorHostName" : False,
"DetectScvmmEnv" : False,
"ResourceDisk.Format" : False,
"DetectScvmmEnv" : False,
"ResourceDisk.Format" : False,
"ResourceDisk.EnableSwap" : False,
"AutoUpdate.Enabled" : True,
"EnableOverProvisioning" : False
}
__STRING_OPTIONS__ = {
"Lib.Dir" : "/var/lib/waagent",
"DVD.MountPoint" : "/mnt/cdrom/secure",
"Pid.File" : "/var/run/waagent.pid",
"Extension.LogDir" : "/var/log/azure",
"OS.OpensslPath" : "/usr/bin/openssl",
"OS.SshDir" : "/etc/ssh",
"OS.HomeDir" : "/home",
"OS.PasswordPath" : "/etc/shadow",
"OS.SudoersDir" : "/etc/sudoers.d",
"OS.RootDeviceScsiTimeout" : None,
"Provisioning.SshHostKeyPairType" : "rsa",
"Provisioning.PasswordCryptId" : "6",
"HttpProxy.Host" : None,
"ResourceDisk.MountPoint" : "/mnt/resource",
"ResourceDisk.MountOptions" : None,
"ResourceDisk.Filesystem" : "ext3",
"AutoUpdate.GAFamily" : "Prod"
}
__INTEGER_OPTIONS__ = {
"OS.SshClientAliveInterval" : 180,
"Provisioning.PasswordCryptSaltLength" : 10,
"HttpProxy.Port" : None,
"ResourceDisk.SwapSizeMB" : 0,
"Autoupdate.Frequency" : 3600
}
def get_configuration(conf=__conf__):
options = {}
for option in __SWITCH_OPTIONS__:
options[option] = conf.get_switch(option, __SWITCH_OPTIONS__[option])
for option in __STRING_OPTIONS__:
options[option] = conf.get(option, __STRING_OPTIONS__[option])
for option in __INTEGER_OPTIONS__:
options[option] = conf.get_int(option, __INTEGER_OPTIONS__[option])
return options
def enable_firewall(conf=__conf__):
return conf.get_switch("OS.EnableFirewall", False)
def enable_rdma(conf=__conf__):
return conf.get_switch("OS.EnableRDMA", False) or \
conf.get_switch("OS.UpdateRdmaDriver", False) or \
conf.get_switch("OS.CheckRdmaDriver", False)
def enable_rdma_update(conf=__conf__):
return conf.get_switch("OS.UpdateRdmaDriver", False)
def get_logs_verbose(conf=__conf__):
return conf.get_switch("Logs.Verbose", False)
def get_lib_dir(conf=__conf__):
return conf.get("Lib.Dir", "/var/lib/waagent")
def get_published_hostname(conf=__conf__):
return os.path.join(get_lib_dir(conf), 'published_hostname')
def get_dvd_mount_point(conf=__conf__):
return conf.get("DVD.MountPoint", "/mnt/cdrom/secure")
def get_agent_pid_file_path(conf=__conf__):
return conf.get("Pid.File", "/var/run/waagent.pid")
def get_ext_log_dir(conf=__conf__):
return conf.get("Extension.LogDir", "/var/log/azure")
def get_fips_enabled(conf=__conf__):
return conf.get_switch("OS.EnableFIPS", False)
def get_openssl_cmd(conf=__conf__):
return conf.get("OS.OpensslPath", "/usr/bin/openssl")
def get_ssh_client_alive_interval(conf=__conf__):
return conf.get("OS.SshClientAliveInterval", 180)
def get_ssh_dir(conf=__conf__):
return conf.get("OS.SshDir", "/etc/ssh")
def get_home_dir(conf=__conf__):
return conf.get("OS.HomeDir", "/home")
def get_passwd_file_path(conf=__conf__):
return conf.get("OS.PasswordPath", "/etc/shadow")
def get_sudoers_dir(conf=__conf__):
return conf.get("OS.SudoersDir", "/etc/sudoers.d")
def get_sshd_conf_file_path(conf=__conf__):
return os.path.join(get_ssh_dir(conf), "sshd_config")
def get_ssh_key_glob(conf=__conf__):
return os.path.join(get_ssh_dir(conf), 'ssh_host_*key*')
def get_ssh_key_private_path(conf=__conf__):
return os.path.join(get_ssh_dir(conf),
'ssh_host_{0}_key'.format(get_ssh_host_keypair_type(conf)))
def get_ssh_key_public_path(conf=__conf__):
return os.path.join(get_ssh_dir(conf),
'ssh_host_{0}_key.pub'.format(get_ssh_host_keypair_type(conf)))
def get_root_device_scsi_timeout(conf=__conf__):
return conf.get("OS.RootDeviceScsiTimeout", None)
def get_ssh_host_keypair_type(conf=__conf__):
keypair_type = conf.get("Provisioning.SshHostKeyPairType", "rsa")
if keypair_type == "auto":
'''
auto generates all supported key types and returns the
rsa thumbprint as the default.
'''
return "rsa"
return keypair_type
def get_ssh_host_keypair_mode(conf=__conf__):
return conf.get("Provisioning.SshHostKeyPairType", "rsa")
def get_provision_enabled(conf=__conf__):
return conf.get_switch("Provisioning.Enabled", True)
def get_provision_cloudinit(conf=__conf__):
return conf.get_switch("Provisioning.UseCloudInit", False)
def get_allow_reset_sys_user(conf=__conf__):
return conf.get_switch("Provisioning.AllowResetSysUser", False)
def get_regenerate_ssh_host_key(conf=__conf__):
return conf.get_switch("Provisioning.RegenerateSshHostKeyPair", False)
def get_delete_root_password(conf=__conf__):
return conf.get_switch("Provisioning.DeleteRootPassword", False)
def get_decode_customdata(conf=__conf__):
return conf.get_switch("Provisioning.DecodeCustomData", False)
def get_execute_customdata(conf=__conf__):
return conf.get_switch("Provisioning.ExecuteCustomData", False)
def get_password_cryptid(conf=__conf__):
return conf.get("Provisioning.PasswordCryptId", "6")
def get_password_crypt_salt_len(conf=__conf__):
return conf.get_int("Provisioning.PasswordCryptSaltLength", 10)
def get_monitor_hostname(conf=__conf__):
return conf.get_switch("Provisioning.MonitorHostName", False)
def get_httpproxy_host(conf=__conf__):
return conf.get("HttpProxy.Host", None)
def get_httpproxy_port(conf=__conf__):
return conf.get_int("HttpProxy.Port", None)
def get_detect_scvmm_env(conf=__conf__):
return conf.get_switch("DetectScvmmEnv", False)
def get_resourcedisk_format(conf=__conf__):
return conf.get_switch("ResourceDisk.Format", False)
def get_resourcedisk_enable_swap(conf=__conf__):
return conf.get_switch("ResourceDisk.EnableSwap", False)
def get_resourcedisk_mountpoint(conf=__conf__):
return conf.get("ResourceDisk.MountPoint", "/mnt/resource")
def get_resourcedisk_mountoptions(conf=__conf__):
return conf.get("ResourceDisk.MountOptions", None)
def get_resourcedisk_filesystem(conf=__conf__):
return conf.get("ResourceDisk.Filesystem", "ext3")
def get_resourcedisk_swap_size_mb(conf=__conf__):
return conf.get_int("ResourceDisk.SwapSizeMB", 0)
def get_autoupdate_gafamily(conf=__conf__):
return conf.get("AutoUpdate.GAFamily", "Prod")
def get_autoupdate_enabled(conf=__conf__):
return conf.get_switch("AutoUpdate.Enabled", True)
def get_autoupdate_frequency(conf=__conf__):
return conf.get_int("Autoupdate.Frequency", 3600)
def get_enable_overprovisioning(conf=__conf__):
return conf.get_switch("EnableOverProvisioning", False)
def get_allow_http(conf=__conf__):
return conf.get_switch("OS.AllowHTTP", False)
|