1import os
2import json
3from csvpath.util.exceptions import InputException
4from csvpath.util.file_readers import DataFileReader
5from csvpath.util.file_writers import DataFileWriter
6from csvpath.util.nos import Nos
7from .paths_metadata import PathsMetadata
8from ..listener import Listener
9from ..metadata import Metadata
10
11
12class PathsListener(Listener):
13 """@private"""
14 #
15 # PathsRegistrar is the primary listener. this listener
16 # tracks all named-paths groups loaded to inputs/named_paths
17 # in a manifest.json. Like FilesListener it has the potential
18 # for lost updates if used in a situation where there could
19 # be concurrent writes. if that is the situation it can be
20 # turned off and/or replaced with a database-backed version.
21 #
22 def __init__(self, csvpaths=None):
23 Listener.__init__(self, csvpaths.config if csvpaths else None)
24 self.csvpaths = csvpaths
25 self._manager = None
26 self.type_name = "paths"
27
28 @property
29 def manager(self):
30 if self._manager is None:
31 self._manager = self.csvpaths.paths_manager
32 return self._manager
33
34 @property
35 def manifest(self) -> list:
36 mpath = self.manifest_path
37 with DataFileReader(mpath) as file:
38 j = json.load(file.source)
39 return j
40
41 @property
42 def manifest_path(self) -> None:
43 mf = os.path.join(self.csvpaths.config.inputs_csvpaths_path, "manifest.json")
44 if not Nos(mf).exists():
45 with DataFileWriter(path=mf) as file:
46 file.append("[]")
47 return mf
48
49 def _prep_update(self, mdata: Metadata) -> dict:
50 mani = {}
51 mani["named_paths_name"] = mdata.named_paths_name
52 mani["named_paths_home"] = mdata.named_paths_home
53 mani["group_file_path"] = mdata.group_file_path
54 mani["source_path"] = mdata.source_path
55 mani["fingerprint"] = mdata.fingerprint
56 mani["time"] = mdata.time_string
57 mani["uuid"] = mdata.uuid_string
58 if mdata.username:
59 mani["username"] = mdata.username
60 if mdata.hostname:
61 mani["hostname"] = mdata.hostname
62 if mdata.ip_address:
63 mani["ip_address"] = mdata.ip_address
64 mani["paths_manifest"] = mdata.manifest_path
65 mani["manifest_path"] = self.manifest_path
66 return mani
67
68 def metadata_update(self, mdata: Metadata) -> None:
69 mani = self._prep_update(mdata)
70 jdata = self.manifest
71 jdata.append(mani)
72 with DataFileWriter(path=self.manifest_path) as file:
73 json.dump(jdata, file.sink, indent=2)