__metaclass__ = type DOCUMENTATION = ''' options: _uri: required: True description: - Path in which the cache plugin will save the JSON files env: - name: ANSIBLE_CACHE_PLUGIN_CONNECTION ini: - key: fact_caching_connection section: defaults type: path _prefix: description: User defined prefix to use when creating the JSON files env: - name: ANSIBLE_CACHE_PLUGIN_PREFIX ini: - key: fact_caching_prefix section: defaults _timeout: default: 86400 description: Expiration timeout for the cache plugin data env: - name: ANSIBLE_CACHE_PLUGIN_TIMEOUT ini: - key: fact_caching_timeout section: defaults type: integer ''' import os import tempfile from ansible.plugins.cache.jsonfile import CacheModule as JsonCacheModule class CacheModule(JsonCacheModule): def set(self, key, value): self._cache[key] = value cachefile = self._get_cache_file_name(key) tmpfile_handle, tmpfile_path = tempfile.mkstemp(dir=os.path.dirname(cachefile)) try: try: self._dump(value, tmpfile_path) except (OSError, IOError) as e: display.warning("error in '%s' cache plugin while trying to write to '%s' : %s" % (self.plugin_name, tmpfile_path, to_bytes(e))) try: os.chmod(tmpfile_path, 0o644) os.rename(tmpfile_path, cachefile) except (OSError, IOError) as e: display.warning("error in '%s' cache plugin while trying to move '%s' to '%s' : %s" % (self.plugin_name, tmpfile_path, cachefile, to_bytes(e))) finally: try: os.unlink(tmpfile_path) except OSError: pass