From: Adam King Date: Wed, 19 Jan 2022 02:44:54 +0000 (-0500) Subject: cephadm: fully replace agent files when writing them X-Git-Tag: v17.1.0~31^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cc94012ba104463a818c23889603ecb3510967d9;p=ceph.git cephadm: fully replace agent files when writing them otherwise, if the new file is shorter than the old one we will end up with a malformed file retaining the end bit of the old version Signed-off-by: Adam King --- diff --git a/src/cephadm/cephadm b/src/cephadm/cephadm index 98579a1ac3b..ca1d86063a7 100755 --- a/src/cephadm/cephadm +++ b/src/cephadm/cephadm @@ -3720,8 +3720,10 @@ class MgrListener(Thread): config = data['config'] for filename in config: if filename in self.agent.required_files: - with open(os.path.join(self.agent.daemon_dir, filename), 'w') as f: + file_path = os.path.join(self.agent.daemon_dir, filename) + with open(os.open(file_path + '.new', os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f: f.write(config[filename]) + os.rename(file_path + '.new', file_path) self.agent.pull_conf_settings() self.agent.wakeup() @@ -3781,17 +3783,23 @@ class CephadmAgent(): # Create the required config files in the daemons dir, with restricted permissions for filename in config: if filename in self.required_files: - with open(os.open(os.path.join(self.daemon_dir, filename), os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f: + file_path = os.path.join(self.daemon_dir, filename) + with open(os.open(file_path + '.new', os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f: f.write(config[filename]) + os.rename(file_path + '.new', file_path) - with open(os.open(os.path.join(self.daemon_dir, 'unit.run'), os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f: + unit_run_path = os.path.join(self.daemon_dir, 'unit.run') + with open(os.open(unit_run_path + '.new', os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f: f.write(self.unit_run()) + os.rename(unit_run_path + '.new', unit_run_path) meta: Dict[str, Any] = {} + meta_file_path = os.path.join(self.daemon_dir, 'unit.meta') if 'meta_json' in self.ctx and self.ctx.meta_json: meta = json.loads(self.ctx.meta_json) or {} - with open(os.open(os.path.join(self.daemon_dir, 'unit.meta'), os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f: + with open(os.open(meta_file_path + '.new', os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f: f.write(json.dumps(meta, indent=4) + '\n') + os.rename(meta_file_path + '.new', meta_file_path) unit_file_path = os.path.join(self.ctx.unit_dir, self.unit_name()) with open(os.open(unit_file_path + '.new', os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f: