Skip to content

Commit 9847796

Browse files
onovyzaitcev
authored andcommitted
Set owner of drive-audit recon cache to swift user
Fixies this problem: * swift-drive-audit needs to be run by root, because only root have "umount" permission * swift-object servers typically runs as user swift * if swift-drive-audit is run by root, /var/cache/swift/drive.recon is owned by root, with 0o600 * recon middleware (inside swift-object-server) can't read this cache file: swift-object: Error reading recon cache file This patch adds "user" option to drive-audit config file. Recon cache is chowned to this user. Change-Id: Ibf20543ee690b7c5a37fabd1540fd5c0c7b638c9
1 parent a79d850 commit 9847796

File tree

5 files changed

+32
-2
lines changed

5 files changed

+32
-2
lines changed

bin/swift-drive-audit

+2-1
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ if __name__ == '__main__':
208208
total_errors += count
209209
recon_file = recon_cache_path + "/drive.recon"
210210
dump_recon_cache(recon_errors, recon_file, logger)
211-
dump_recon_cache({'drive_audit_errors': total_errors}, recon_file, logger)
211+
dump_recon_cache({'drive_audit_errors': total_errors}, recon_file, logger,
212+
set_owner=conf.get("user", "swift"))
212213

213214
if unmounts == 0:
214215
logger.info("No drives were unmounted")

doc/source/admin_guide.rst

+2
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ settings:
264264
================== ============== ===========================================
265265
Option Default Description
266266
------------------ -------------- -------------------------------------------
267+
user swift Drop privileges to this user for non-root
268+
tasks
267269
log_facility LOG_LOCAL0 Syslog log facility
268270
log_level INFO Log level
269271
device_dir /srv/node Directory devices are mounted under

etc/drive-audit.conf-sample

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
[drive-audit]
2+
# user = swift
23
# device_dir = /srv/node
34
#
45
# You can specify default log routing here if you want:

swift/common/utils.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -3037,13 +3037,15 @@ def put_recon_cache_entry(cache_entry, key, item):
30373037
cache_entry[key] = item
30383038

30393039

3040-
def dump_recon_cache(cache_dict, cache_file, logger, lock_timeout=2):
3040+
def dump_recon_cache(cache_dict, cache_file, logger, lock_timeout=2,
3041+
set_owner=None):
30413042
"""Update recon cache values
30423043
30433044
:param cache_dict: Dictionary of cache key/value pairs to write out
30443045
:param cache_file: cache file to update
30453046
:param logger: the logger to use to log an encountered error
30463047
:param lock_timeout: timeout (in seconds)
3048+
:param set_owner: Set owner of recon cache file
30473049
"""
30483050
try:
30493051
with lock_file(cache_file, lock_timeout, unlink=False) as cf:
@@ -3062,6 +3064,8 @@ def dump_recon_cache(cache_dict, cache_file, logger, lock_timeout=2):
30623064
with NamedTemporaryFile(dir=os.path.dirname(cache_file),
30633065
delete=False) as tf:
30643066
tf.write(json.dumps(cache_entry) + '\n')
3067+
if set_owner:
3068+
os.chown(tf.name, pwd.getpwnam(set_owner).pw_uid, -1)
30653069
renamer(tf.name, cache_file, fsync=False)
30663070
finally:
30673071
if tf is not None:

test/unit/common/test_utils.py

+22
Original file line numberDiff line numberDiff line change
@@ -1377,6 +1377,28 @@ def test_dump_recon_cache(self):
13771377
finally:
13781378
rmtree(testdir_base)
13791379

1380+
def test_dump_recon_cache_set_owner(self):
1381+
testdir_base = mkdtemp()
1382+
testcache_file = os.path.join(testdir_base, 'cache.recon')
1383+
logger = utils.get_logger(None, 'server', log_route='server')
1384+
try:
1385+
submit_dict = {'key1': {'value1': 1, 'value2': 2}}
1386+
1387+
_ret = lambda: None
1388+
_ret.pw_uid = 100
1389+
_mock_getpwnam = MagicMock(return_value=_ret)
1390+
_mock_chown = mock.Mock()
1391+
1392+
with patch('os.chown', _mock_chown), \
1393+
patch('pwd.getpwnam', _mock_getpwnam):
1394+
utils.dump_recon_cache(submit_dict, testcache_file,
1395+
logger, set_owner="swift")
1396+
1397+
_mock_getpwnam.assert_called_once_with("swift")
1398+
self.assertEqual(_mock_chown.call_args[0][1], 100)
1399+
finally:
1400+
rmtree(testdir_base)
1401+
13801402
def test_dump_recon_cache_permission_denied(self):
13811403
testdir_base = mkdtemp()
13821404
testcache_file = os.path.join(testdir_base, 'cache.recon')

0 commit comments

Comments
 (0)