dissect.target 3.14.dev8__tar.gz → 3.14.dev10__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (521) hide show
  1. {dissect.target-3.14.dev8/dissect.target.egg-info → dissect.target-3.14.dev10}/PKG-INFO +2 -1
  2. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystem.py +87 -7
  3. dissect.target-3.14.dev10/dissect/target/filesystems/btrfs.py +180 -0
  4. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/utils.py +14 -3
  5. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/av/symantec.py +3 -4
  6. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/_os.py +27 -18
  7. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/target.py +29 -25
  8. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/mount.py +2 -12
  9. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10/dissect.target.egg-info}/PKG-INFO +2 -1
  10. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect.target.egg-info/SOURCES.txt +1 -0
  11. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect.target.egg-info/requires.txt +1 -0
  12. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/pyproject.toml +1 -0
  13. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/test__os.py +6 -6
  14. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/test_target.py +1 -0
  15. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/COPYRIGHT +0 -0
  16. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/LICENSE +0 -0
  17. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/MANIFEST.in +0 -0
  18. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/README.md +0 -0
  19. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/__init__.py +0 -0
  20. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/container.py +0 -0
  21. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/__init__.py +0 -0
  22. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/asdf.py +0 -0
  23. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/ewf.py +0 -0
  24. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/hdd.py +0 -0
  25. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/hds.py +0 -0
  26. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/qcow2.py +0 -0
  27. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/raw.py +0 -0
  28. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/split.py +0 -0
  29. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/vdi.py +0 -0
  30. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/vhd.py +0 -0
  31. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/vhdx.py +0 -0
  32. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/containers/vmdk.py +0 -0
  33. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/data/autocompletion/target_bash_completion.sh +0 -0
  34. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/exceptions.py +0 -0
  35. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/__init__.py +0 -0
  36. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/ad1.py +0 -0
  37. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/cb.py +0 -0
  38. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/config.py +0 -0
  39. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/dir.py +0 -0
  40. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/exfat.py +0 -0
  41. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/extfs.py +0 -0
  42. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/fat.py +0 -0
  43. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/ffs.py +0 -0
  44. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/itunes.py +0 -0
  45. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/ntfs.py +0 -0
  46. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/smb.py +0 -0
  47. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/squashfs.py +0 -0
  48. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/tar.py +0 -0
  49. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/vmfs.py +0 -0
  50. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/xfs.py +0 -0
  51. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/filesystems/zip.py +0 -0
  52. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/__init__.py +0 -0
  53. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/cache.py +0 -0
  54. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/config.py +0 -0
  55. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/configutil.py +0 -0
  56. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/data/windowsZones.xml +0 -0
  57. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/descriptor_extensions.py +0 -0
  58. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/docs.py +0 -0
  59. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/fsutil.py +0 -0
  60. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/hashutil.py +0 -0
  61. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/keychain.py +0 -0
  62. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/lazy.py +0 -0
  63. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/loaderutil.py +0 -0
  64. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/localeutil.py +0 -0
  65. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/mount.py +0 -0
  66. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/network_managers.py +0 -0
  67. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/record.py +0 -0
  68. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/regutil.py +0 -0
  69. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/shell_folder_ids.py +0 -0
  70. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/ssh.py +0 -0
  71. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/helpers/targetd.py +0 -0
  72. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loader.py +0 -0
  73. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/__init__.py +0 -0
  74. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/ad1.py +0 -0
  75. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/asdf.py +0 -0
  76. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/cb.py +0 -0
  77. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/dir.py +0 -0
  78. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/hyperv.py +0 -0
  79. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/itunes.py +0 -0
  80. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/kape.py +0 -0
  81. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/local.py +0 -0
  82. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/log.py +0 -0
  83. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/multiraw.py +0 -0
  84. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/ova.py +0 -0
  85. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/ovf.py +0 -0
  86. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/phobos.py +0 -0
  87. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/profile.py +0 -0
  88. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/pvm.py +0 -0
  89. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/pvs.py +0 -0
  90. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/raw.py +0 -0
  91. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/remote.py +0 -0
  92. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/res.py +0 -0
  93. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/smb.py +0 -0
  94. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/tanium.py +0 -0
  95. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/tar.py +0 -0
  96. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/target.py +0 -0
  97. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/targetd.py +0 -0
  98. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/utm.py +0 -0
  99. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/vb.py +0 -0
  100. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/vbox.py +0 -0
  101. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/velociraptor.py +0 -0
  102. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/vma.py +0 -0
  103. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/vmwarevm.py +0 -0
  104. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/vmx.py +0 -0
  105. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/loaders/xva.py +0 -0
  106. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugin.py +0 -0
  107. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/__init__.py +0 -0
  108. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/__init__.py +0 -0
  109. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/av/__init__.py +0 -0
  110. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/av/mcafee.py +0 -0
  111. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/av/sophos.py +0 -0
  112. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/av/trendmicro.py +0 -0
  113. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/browser/__init__.py +0 -0
  114. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/browser/browser.py +0 -0
  115. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/browser/chrome.py +0 -0
  116. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/browser/chromium.py +0 -0
  117. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/browser/edge.py +0 -0
  118. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/browser/firefox.py +0 -0
  119. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/browser/iexplore.py +0 -0
  120. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/container/__init__.py +0 -0
  121. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/container/docker.py +0 -0
  122. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/remoteaccess/__init__.py +0 -0
  123. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/remoteaccess/anydesk.py +0 -0
  124. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/remoteaccess/remoteaccess.py +0 -0
  125. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/remoteaccess/teamviewer.py +0 -0
  126. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/shell/__init__.py +0 -0
  127. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/shell/powershell.py +0 -0
  128. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/ssh/__init__.py +0 -0
  129. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/ssh/openssh.py +0 -0
  130. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/ssh/opensshd.py +0 -0
  131. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/vpn/__init__.py +0 -0
  132. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/vpn/openvpn.py +0 -0
  133. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/vpn/wireguard.py +0 -0
  134. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/webhosting/__init__.py +0 -0
  135. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/webhosting/cpanel.py +0 -0
  136. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/webserver/__init__.py +0 -0
  137. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/webserver/apache.py +0 -0
  138. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/webserver/caddy.py +0 -0
  139. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/webserver/iis.py +0 -0
  140. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/webserver/nginx.py +0 -0
  141. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/apps/webserver/webserver.py +0 -0
  142. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/child/__init__.py +0 -0
  143. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/child/esxi.py +0 -0
  144. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/child/hyperv.py +0 -0
  145. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/child/virtuozzo.py +0 -0
  146. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/child/vmware_workstation.py +0 -0
  147. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/child/wsl.py +0 -0
  148. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/__init__.py +0 -0
  149. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/acquire_handles.py +0 -0
  150. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/acquire_hash.py +0 -0
  151. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/icat.py +0 -0
  152. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/ntfs/__init__.py +0 -0
  153. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/ntfs/mft.py +0 -0
  154. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/ntfs/mft_timeline.py +0 -0
  155. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/ntfs/usnjrnl.py +0 -0
  156. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/ntfs/utils.py +0 -0
  157. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/resolver.py +0 -0
  158. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/unix/__init__.py +0 -0
  159. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/unix/capability.py +0 -0
  160. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/unix/suid.py +0 -0
  161. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/walkfs.py +0 -0
  162. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/filesystem/yara.py +0 -0
  163. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/general/__init__.py +0 -0
  164. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/general/config.py +0 -0
  165. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/general/default.py +0 -0
  166. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/general/example.py +0 -0
  167. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/general/loaders.py +0 -0
  168. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/general/osinfo.py +0 -0
  169. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/general/plugins.py +0 -0
  170. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/general/scrape.py +0 -0
  171. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/general/users.py +0 -0
  172. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/__init__.py +0 -0
  173. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/__init__.py +0 -0
  174. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/_os.py +0 -0
  175. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  176. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/citrix/_os.py +0 -0
  177. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/freebsd/__init__.py +0 -0
  178. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/freebsd/_os.py +0 -0
  179. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/ios/__init__.py +0 -0
  180. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/ios/_os.py +0 -0
  181. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/openbsd/__init__.py +0 -0
  182. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/openbsd/_os.py +0 -0
  183. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/osx/__init__.py +0 -0
  184. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/osx/_os.py +0 -0
  185. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/bsd/osx/user.py +0 -0
  186. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/cronjobs.py +0 -0
  187. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/datetime.py +0 -0
  188. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/etc.py +0 -0
  189. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/generic.py +0 -0
  190. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/history.py +0 -0
  191. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/__init__.py +0 -0
  192. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/_os.py +0 -0
  193. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/android/__init__.py +0 -0
  194. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/android/_os.py +0 -0
  195. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/cmdline.py +0 -0
  196. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/debian/__init__.py +0 -0
  197. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/debian/_os.py +0 -0
  198. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/debian/apt.py +0 -0
  199. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/debian/dpkg.py +0 -0
  200. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/debian/vyos/__init__.py +0 -0
  201. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/debian/vyos/_os.py +0 -0
  202. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/environ.py +0 -0
  203. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/esxi/__init__.py +0 -0
  204. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/esxi/_os.py +0 -0
  205. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/fortigate/__init__.py +0 -0
  206. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/fortigate/_os.py +0 -0
  207. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/iptables.py +0 -0
  208. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/modules.py +0 -0
  209. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/netstat.py +0 -0
  210. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/proc.py +0 -0
  211. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/processes.py +0 -0
  212. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/redhat/__init__.py +0 -0
  213. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/redhat/_os.py +0 -0
  214. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/redhat/yum.py +0 -0
  215. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/sockets.py +0 -0
  216. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/suse/__init__.py +0 -0
  217. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/suse/_os.py +0 -0
  218. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/linux/suse/zypper.py +0 -0
  219. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/locale.py +0 -0
  220. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/log/__init__.py +0 -0
  221. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/log/atop.py +0 -0
  222. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/log/audit.py +0 -0
  223. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/log/auth.py +0 -0
  224. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/log/journal.py +0 -0
  225. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/log/lastlog.py +0 -0
  226. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/log/messages.py +0 -0
  227. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/log/utmp.py +0 -0
  228. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/packagemanager.py +0 -0
  229. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/services.py +0 -0
  230. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/unix/shadow.py +0 -0
  231. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/__init__.py +0 -0
  232. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/_os.py +0 -0
  233. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/activitiescache.py +0 -0
  234. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/adpolicy.py +0 -0
  235. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/amcache.py +0 -0
  236. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/catroot.py +0 -0
  237. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/cim.py +0 -0
  238. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/clfs.py +0 -0
  239. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/datetime.py +0 -0
  240. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/defender.py +0 -0
  241. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/dpapi/__init__.py +0 -0
  242. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/dpapi/blob.py +0 -0
  243. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/dpapi/crypto.py +0 -0
  244. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/dpapi/dpapi.py +0 -0
  245. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/dpapi/master_key.py +0 -0
  246. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/env.py +0 -0
  247. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/exchange/__init__.py +0 -0
  248. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/exchange/exchange.py +0 -0
  249. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/generic.py +0 -0
  250. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/lnk.py +0 -0
  251. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/locale.py +0 -0
  252. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/log/__init__.py +0 -0
  253. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/log/amcache.py +0 -0
  254. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/log/etl.py +0 -0
  255. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/log/evt.py +0 -0
  256. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/log/evtx.py +0 -0
  257. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/log/pfro.py +0 -0
  258. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/notifications.py +0 -0
  259. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/prefetch.py +0 -0
  260. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/recyclebin.py +0 -0
  261. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/7zip.py +0 -0
  262. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/__init__.py +0 -0
  263. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/appxdebugkeys.py +0 -0
  264. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/auditpol.py +0 -0
  265. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/bam.py +0 -0
  266. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/cit.py +0 -0
  267. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/clsid.py +0 -0
  268. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/firewall.py +0 -0
  269. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/mru.py +0 -0
  270. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/muicache.py +0 -0
  271. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/nethist.py +0 -0
  272. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/recentfilecache.py +0 -0
  273. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/regf.py +0 -0
  274. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/runkeys.py +0 -0
  275. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/shellbags.py +0 -0
  276. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/shimcache.py +0 -0
  277. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/trusteddocs.py +0 -0
  278. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/usb.py +0 -0
  279. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/regf/userassist.py +0 -0
  280. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/registry.py +0 -0
  281. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/sam.py +0 -0
  282. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/services.py +0 -0
  283. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/sru.py +0 -0
  284. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/startupinfo.py +0 -0
  285. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/syscache.py +0 -0
  286. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/task_helpers/__init__.py +0 -0
  287. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/task_helpers/tasks_job.py +0 -0
  288. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/task_helpers/tasks_records.py +0 -0
  289. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/task_helpers/tasks_xml.py +0 -0
  290. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/tasks.py +0 -0
  291. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/thumbcache.py +0 -0
  292. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/ual.py +0 -0
  293. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/plugins/os/windows/wer.py +0 -0
  294. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/report.py +0 -0
  295. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/__init__.py +0 -0
  296. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/build_pluginlist.py +0 -0
  297. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/dd.py +0 -0
  298. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/dump/__init__.py +0 -0
  299. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/dump/run.py +0 -0
  300. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/dump/state.py +0 -0
  301. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/dump/utils.py +0 -0
  302. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/fs.py +0 -0
  303. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/info.py +0 -0
  304. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/logging.py +0 -0
  305. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/query.py +0 -0
  306. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/reg.py +0 -0
  307. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/shell.py +0 -0
  308. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/tools/utils.py +0 -0
  309. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/volume.py +0 -0
  310. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/volumes/__init__.py +0 -0
  311. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/volumes/bde.py +0 -0
  312. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/volumes/ddf.py +0 -0
  313. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/volumes/disk.py +0 -0
  314. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/volumes/luks.py +0 -0
  315. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/volumes/lvm.py +0 -0
  316. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/volumes/md.py +0 -0
  317. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect/target/volumes/vmfs.py +0 -0
  318. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect.target.egg-info/dependency_links.txt +0 -0
  319. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect.target.egg-info/entry_points.txt +0 -0
  320. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/dissect.target.egg-info/top_level.txt +0 -0
  321. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/setup.cfg +0 -0
  322. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/__init__.py +0 -0
  323. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/_docs/Makefile +0 -0
  324. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/_docs/conf.py +0 -0
  325. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/_docs/index.rst +0 -0
  326. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/_utils.py +0 -0
  327. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/conftest.py +0 -0
  328. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/containers/__init__.py +0 -0
  329. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/containers/test_split.py +0 -0
  330. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/filesystems/__init__.py +0 -0
  331. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/filesystems/test_cb.py +0 -0
  332. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/filesystems/test_config.py +0 -0
  333. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/filesystems/test_dir.py +0 -0
  334. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/filesystems/test_exfat.py +0 -0
  335. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/filesystems/test_fat.py +0 -0
  336. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/filesystems/test_ntfs.py +0 -0
  337. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/filesystems/test_smb.py +0 -0
  338. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/filesystems/test_tar.py +0 -0
  339. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/filesystems/test_zip.py +0 -0
  340. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/__init__.py +0 -0
  341. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_cache.py +0 -0
  342. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_config.py +0 -0
  343. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_configutil.py +0 -0
  344. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_docs.py +0 -0
  345. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_fsutil.py +0 -0
  346. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_hashutil.py +0 -0
  347. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_keychain.py +0 -0
  348. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_loaderutil.py +0 -0
  349. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_localeutil.py +0 -0
  350. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_record.py +0 -0
  351. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_regutil.py +0 -0
  352. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/helpers/test_utils.py +0 -0
  353. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/__init__.py +0 -0
  354. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_asdf.py +0 -0
  355. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_cb.py +0 -0
  356. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_dir.py +0 -0
  357. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_hyperv.py +0 -0
  358. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_kape.py +0 -0
  359. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_local.py +0 -0
  360. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_log.py +0 -0
  361. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_multiraw.py +0 -0
  362. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_ova.py +0 -0
  363. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_ovf.py +0 -0
  364. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_phobos.py +0 -0
  365. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_pvm.py +0 -0
  366. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_pvs.py +0 -0
  367. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_remote.py +0 -0
  368. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_smb.py +0 -0
  369. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_tanium.py +0 -0
  370. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_tar.py +0 -0
  371. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_utm.py +0 -0
  372. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_vbox.py +0 -0
  373. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_velociraptor.py +0 -0
  374. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/loaders/test_vmwarevm.py +0 -0
  375. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/__init__.py +0 -0
  376. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/__init__.py +0 -0
  377. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/av/__init__.py +0 -0
  378. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/av/test_mcafee.py +0 -0
  379. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/av/test_sophos.py +0 -0
  380. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/av/test_symantec.py +0 -0
  381. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/av/test_trendmicro.py +0 -0
  382. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/browser/__init__.py +0 -0
  383. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/browser/test_browser.py +0 -0
  384. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/container/__init__.py +0 -0
  385. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/container/test_docker.py +0 -0
  386. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/remoteaccess/__init__.py +0 -0
  387. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/remoteaccess/test_anydesk.py +0 -0
  388. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/remoteaccess/test_teamviewer.py +0 -0
  389. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/shell/__init__.py +0 -0
  390. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/shell/test_powershell.py +0 -0
  391. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/ssh/__init__.py +0 -0
  392. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/ssh/test_openssh.py +0 -0
  393. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/ssh/test_opensshd.py +0 -0
  394. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/vpn/__init__.py +0 -0
  395. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/vpn/test_openvpn.py +0 -0
  396. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/vpn/test_wireguard.py +0 -0
  397. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/webhosting/__init__.py +0 -0
  398. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/webhosting/test_cpanel.py +0 -0
  399. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/webserver/__init__.py +0 -0
  400. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/webserver/test_apache.py +0 -0
  401. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/webserver/test_caddy.py +0 -0
  402. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/webserver/test_iis.py +0 -0
  403. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/apps/webserver/test_nginx.py +0 -0
  404. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/child/__init__.py +0 -0
  405. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/child/test_hyperv.py +0 -0
  406. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/child/test_virtuozzo.py +0 -0
  407. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/child/test_wsl.py +0 -0
  408. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/__init__.py +0 -0
  409. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/ntfs/__init__.py +0 -0
  410. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/ntfs/test_mft.py +0 -0
  411. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/ntfs/test_usnjrnl.py +0 -0
  412. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/test_acquire_handles.py +0 -0
  413. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/test_acquire_hash.py +0 -0
  414. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/test_icat.py +0 -0
  415. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/test_resolver.py +0 -0
  416. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/test_walkfs.py +0 -0
  417. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/test_yara.py +0 -0
  418. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/unix/__init__.py +0 -0
  419. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/unix/test_capability.py +0 -0
  420. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/filesystem/unix/test_suid.py +0 -0
  421. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/general/__init__.py +0 -0
  422. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/general/test_config.py +0 -0
  423. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/general/test_default.py +0 -0
  424. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/general/test_plugins.py +0 -0
  425. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/general/test_scrape.py +0 -0
  426. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/general/test_users.py +0 -0
  427. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/__init__.py +0 -0
  428. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/__init__.py +0 -0
  429. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/bsd/__init__.py +0 -0
  430. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  431. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/bsd/citrix/test__os.py +0 -0
  432. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/bsd/osx/__init__.py +0 -0
  433. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/bsd/osx/test__os.py +0 -0
  434. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/bsd/osx/test_user.py +0 -0
  435. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/__init__.py +0 -0
  436. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/android/__init__.py +0 -0
  437. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/android/test__os.py +0 -0
  438. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/debian/__init__.py +0 -0
  439. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/debian/test_apt.py +0 -0
  440. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/debian/test_dpkg.py +0 -0
  441. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/redhat/__init__.py +0 -0
  442. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/redhat/test_yum.py +0 -0
  443. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/suse/__init__.py +0 -0
  444. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/suse/test_zypper.py +0 -0
  445. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/test_cmdline.py +0 -0
  446. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/test_environ.py +0 -0
  447. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/test_iptables.py +0 -0
  448. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/test_modules.py +0 -0
  449. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/test_netstat.py +0 -0
  450. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/test_proc.py +0 -0
  451. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/test_processes.py +0 -0
  452. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/linux/test_sockets.py +0 -0
  453. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/log/__init__.py +0 -0
  454. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/log/test_atop.py +0 -0
  455. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/log/test_audit.py +0 -0
  456. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/log/test_auth.py +0 -0
  457. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/log/test_lastlog.py +0 -0
  458. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/log/test_messages.py +0 -0
  459. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/log/test_utmp.py +0 -0
  460. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/test_generic.py +0 -0
  461. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/test_history.py +0 -0
  462. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/test_ips.py +0 -0
  463. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/test_journal.py +0 -0
  464. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/test_locale.py +0 -0
  465. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/test_packagemanager.py +0 -0
  466. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/test_services.py +0 -0
  467. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/test_shadow.py +0 -0
  468. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/test_users.py +0 -0
  469. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/unix/test_version.py +0 -0
  470. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/__init__.py +0 -0
  471. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/log/test_etl.py +0 -0
  472. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/log/test_evt.py +0 -0
  473. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/log/test_evtx.py +0 -0
  474. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/regf/__init__.py +0 -0
  475. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/regf/test_appxdebugkeys.py +0 -0
  476. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/regf/test_cit.py +0 -0
  477. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/regf/test_clsid.py +0 -0
  478. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/regf/test_muicache.py +0 -0
  479. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/regf/test_trusteddocs.py +0 -0
  480. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/regf/test_userassist.py +0 -0
  481. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test__os.py +0 -0
  482. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_adpolicy.py +0 -0
  483. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_amcache.py +0 -0
  484. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_clfs.py +0 -0
  485. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_datetime.py +0 -0
  486. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_defender.py +0 -0
  487. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_dpapi.py +0 -0
  488. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_env.py +0 -0
  489. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_generic.py +0 -0
  490. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_lnk.py +0 -0
  491. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_locale.py +0 -0
  492. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_mru.py +0 -0
  493. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_notifications.py +0 -0
  494. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_prefetch.py +0 -0
  495. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_recyclebin.py +0 -0
  496. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_registry.py +0 -0
  497. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_sam.py +0 -0
  498. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_shimcache.py +0 -0
  499. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_sru.py +0 -0
  500. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_syscache.py +0 -0
  501. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_tasks.py +0 -0
  502. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_thumbcache.py +0 -0
  503. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_ual.py +0 -0
  504. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/plugins/os/windows/test_wer.py +0 -0
  505. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/test_container.py +0 -0
  506. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/test_filesystem.py +0 -0
  507. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/test_plugin.py +0 -0
  508. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/test_registration.py +0 -0
  509. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/test_report.py +0 -0
  510. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/test_volume.py +0 -0
  511. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/tools/__init__.py +0 -0
  512. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/tools/test_dump.py +0 -0
  513. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/tools/test_fs.py +0 -0
  514. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/tools/test_mount.py +0 -0
  515. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/tools/test_query.py +0 -0
  516. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/tools/test_shell.py +0 -0
  517. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/tools/test_utils.py +0 -0
  518. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/volumes/__init__.py +0 -0
  519. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/volumes/test_bde.py +0 -0
  520. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tests/volumes/test_md.py +0 -0
  521. {dissect.target-3.14.dev8 → dissect.target-3.14.dev10}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.14.dev8
3
+ Version: 3.14.dev10
4
4
  Summary: This module ties all other Dissect modules together, it provides a programming API and command line tools which allow easy access to various data sources inside disk images or file collections (a.k.a. targets)
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License: Affero General Public License v3
@@ -35,6 +35,7 @@ Requires-Dist: flow.record~=3.13.0
35
35
  Requires-Dist: structlog
36
36
  Provides-Extra: full
37
37
  Requires-Dist: asn1crypto; extra == "full"
38
+ Requires-Dist: dissect.btrfs<2.0.dev,>=1.0.dev; extra == "full"
38
39
  Requires-Dist: dissect.cim<4.0.dev,>=3.0.dev; extra == "full"
39
40
  Requires-Dist: dissect.clfs<2.0.dev,>=1.0.dev; extra == "full"
40
41
  Requires-Dist: dissect.esedb<4.0.dev,>=3.0.dev; extra == "full"
@@ -45,10 +45,12 @@ class Filesystem:
45
45
  # This has the added benefit of having a readily available "pretty name" for each implementation
46
46
  __type__: str = None
47
47
  """A short string identifying the type of filesystem."""
48
+ __multi_volume__: bool = False
49
+ """Whether this filesystem supports multiple volumes (disks)."""
48
50
 
49
51
  def __init__(
50
52
  self,
51
- volume: Optional[BinaryIO] = None,
53
+ volume: Optional[Union[BinaryIO, list[BinaryIO]]] = None,
52
54
  alt_separator: str = "",
53
55
  case_sensitive: bool = True,
54
56
  ) -> None:
@@ -56,7 +58,7 @@ class Filesystem:
56
58
 
57
59
  Args:
58
60
  volume: A volume or other file-like object associated with the filesystem.
59
- case_sensitive: Defines if the paths in the Filesystem are case sensitive or not.
61
+ case_sensitive: Defines if the paths in the filesystem are case sensitive or not.
60
62
  alt_separator: The alternative separator used to distingish between directories in a path.
61
63
 
62
64
  Raises:
@@ -82,7 +84,7 @@ class Filesystem:
82
84
  return cls.__type__
83
85
 
84
86
  def path(self, *args) -> fsutil.TargetPath:
85
- """Get a specific path from the filesystem."""
87
+ """Instantiate a new path-like object on this filesystem."""
86
88
  return fsutil.TargetPath(self, *args)
87
89
 
88
90
  @classmethod
@@ -125,6 +127,52 @@ class Filesystem:
125
127
  """
126
128
  raise NotImplementedError()
127
129
 
130
+ @classmethod
131
+ def detect_id(cls, fh: BinaryIO) -> Optional[bytes]:
132
+ """Return a filesystem set identifier.
133
+
134
+ Only used in filesystems that support multiple volumes (disks) to find all volumes
135
+ belonging to a single filesystem.
136
+
137
+ Args:
138
+ fh: A file-like object, usually a disk or partition.
139
+ """
140
+ if not cls.__multi_volume__:
141
+ return None
142
+
143
+ offset = fh.tell()
144
+ try:
145
+ fh.seek(0)
146
+ return cls._detect_id(fh)
147
+ except NotImplementedError:
148
+ raise
149
+ except Exception as e:
150
+ log.warning("Failed to detect ID on %s filesystem", cls.__fstype__)
151
+ log.debug("", exc_info=e)
152
+ finally:
153
+ fh.seek(offset)
154
+
155
+ return None
156
+
157
+ @staticmethod
158
+ def _detect_id(fh: BinaryIO) -> Optional[bytes]:
159
+ """Return a filesystem set identifier.
160
+
161
+ This method should be implemented by subclasses of filesystems that support multiple volumes (disks).
162
+ The position of ``fh`` is guaranteed to be ``0``.
163
+
164
+ Args:
165
+ fh: A file-like object, usually a disk or partition.
166
+
167
+ Returns:
168
+ An identifier that can be used to combine the given ``fh`` with others beloning to the same set.
169
+ """
170
+ raise NotImplementedError()
171
+
172
+ def iter_subfs(self) -> Iterator[Filesystem]:
173
+ """Yield possible sub-filesystems."""
174
+ yield from ()
175
+
128
176
  def get(self, path: str) -> FilesystemEntry:
129
177
  """Retrieve a :class:`FilesystemEntry` from the filesystem.
130
178
 
@@ -1461,6 +1509,18 @@ def register(module: str, class_name: str, internal: bool = True) -> None:
1461
1509
  FILESYSTEMS.append(getattr(import_lazy(module), class_name))
1462
1510
 
1463
1511
 
1512
+ def is_multi_volume_filesystem(fh: BinaryIO) -> bool:
1513
+ for filesystem in FILESYSTEMS:
1514
+ try:
1515
+ if filesystem.__multi_volume__ and filesystem.detect(fh):
1516
+ return True
1517
+ except ImportError as e:
1518
+ log.info("Failed to import %s", filesystem)
1519
+ log.debug("", exc_info=e)
1520
+
1521
+ return False
1522
+
1523
+
1464
1524
  def open(fh: BinaryIO, *args, **kwargs) -> Filesystem:
1465
1525
  offset = fh.tell()
1466
1526
  fh.seek(0)
@@ -1469,10 +1529,7 @@ def open(fh: BinaryIO, *args, **kwargs) -> Filesystem:
1469
1529
  for filesystem in FILESYSTEMS:
1470
1530
  try:
1471
1531
  if filesystem.detect(fh):
1472
- instance = filesystem(fh, *args, **kwargs)
1473
- instance.volume = fh
1474
-
1475
- return instance
1532
+ return filesystem(fh, *args, **kwargs)
1476
1533
  except ImportError as e:
1477
1534
  log.info("Failed to import %s", filesystem)
1478
1535
  log.debug("", exc_info=e)
@@ -1482,12 +1539,35 @@ def open(fh: BinaryIO, *args, **kwargs) -> Filesystem:
1482
1539
  raise FilesystemError(f"Failed to open filesystem for {fh}")
1483
1540
 
1484
1541
 
1542
+ def open_multi_volume(fhs: list[BinaryIO], *args, **kwargs) -> Filesystem:
1543
+ for filesystem in FILESYSTEMS:
1544
+ try:
1545
+ if not filesystem.__multi_volume__:
1546
+ continue
1547
+
1548
+ volumes = defaultdict(list)
1549
+ for fh in fhs:
1550
+ if not filesystem.detect(fh):
1551
+ continue
1552
+
1553
+ identifier = filesystem.detect_id(fh)
1554
+ volumes[identifier].append(fh)
1555
+
1556
+ for vols in volumes.values():
1557
+ yield filesystem(vols, *args, **kwargs)
1558
+
1559
+ except ImportError as e:
1560
+ log.info("Failed to import %s", filesystem)
1561
+ log.debug("", exc_info=e)
1562
+
1563
+
1485
1564
  register("ntfs", "NtfsFilesystem")
1486
1565
  register("extfs", "ExtFilesystem")
1487
1566
  register("xfs", "XfsFilesystem")
1488
1567
  register("fat", "FatFilesystem")
1489
1568
  register("ffs", "FfsFilesystem")
1490
1569
  register("vmfs", "VmfsFilesystem")
1570
+ register("btrfs", "BtrfsFilesystem")
1491
1571
  register("exfat", "ExfatFilesystem")
1492
1572
  register("squashfs", "SquashFSFilesystem")
1493
1573
  register("zip", "ZipFilesystem")
@@ -0,0 +1,180 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import BinaryIO, Iterator, Optional, Union
4
+
5
+ import dissect.btrfs as btrfs
6
+ from dissect.btrfs.c_btrfs import c_btrfs
7
+
8
+ from dissect.target.exceptions import (
9
+ FileNotFoundError,
10
+ FilesystemError,
11
+ IsADirectoryError,
12
+ NotADirectoryError,
13
+ NotASymlinkError,
14
+ )
15
+ from dissect.target.filesystem import Filesystem, FilesystemEntry
16
+ from dissect.target.helpers import fsutil
17
+
18
+
19
+ class BtrfsFilesystem(Filesystem):
20
+ __fstype__ = "btrfs"
21
+ __multi_volume__ = True
22
+
23
+ def __init__(self, fh: Union[BinaryIO, list[BinaryIO]], *args, **kwargs):
24
+ super().__init__(fh, *args, **kwargs)
25
+ self.btrfs = btrfs.Btrfs(fh)
26
+ self.subfs = self.open_subvolume()
27
+ self.subvolume = self.subfs.subvolume
28
+
29
+ @staticmethod
30
+ def _detect(fh: BinaryIO) -> bool:
31
+ fh.seek(c_btrfs.BTRFS_SUPER_INFO_OFFSET)
32
+ block = fh.read(4096)
33
+ magic = int.from_bytes(block[64:72], "little")
34
+
35
+ return magic == c_btrfs.BTRFS_MAGIC
36
+
37
+ @staticmethod
38
+ def _detect_id(fh: BinaryIO) -> Optional[bytes]:
39
+ # First field is csum, followed by fsid
40
+ fh.seek(c_btrfs.BTRFS_SUPER_INFO_OFFSET + c_btrfs.BTRFS_CSUM_SIZE)
41
+ return fh.read(c_btrfs.BTRFS_FSID_SIZE)
42
+
43
+ def iter_subfs(self) -> Iterator[BtrfsSubvolumeFilesystem]:
44
+ for subvol in self.btrfs.subvolumes():
45
+ if subvol.objectid == self.subfs.subvolume.objectid:
46
+ # Skip the default volume as it's already opened by the main filesystem
47
+ continue
48
+ yield self.open_subvolume(subvolid=subvol.objectid)
49
+
50
+ def open_subvolume(self, subvol: Optional[str] = None, subvolid: Optional[int] = None) -> BtrfsSubvolumeFilesystem:
51
+ return BtrfsSubvolumeFilesystem(self, subvol, subvolid)
52
+
53
+ def get(self, path: str) -> FilesystemEntry:
54
+ return self.subfs.get(path)
55
+
56
+
57
+ class BtrfsSubvolumeFilesystem(Filesystem):
58
+ __fstype__ = "btrfs"
59
+
60
+ def __init__(self, fs: BtrfsFilesystem, subvol: Optional[str] = None, subvolid: Optional[int] = None):
61
+ super().__init__(fs.volume, alt_separator=fs.alt_separator, case_sensitive=fs.case_sensitive)
62
+ if subvol is not None and subvolid is not None:
63
+ raise ValueError("Only one of subvol or subvolid is allowed")
64
+
65
+ self.fs = fs
66
+ self.btrfs = fs.btrfs
67
+ if subvol:
68
+ self.subvolume = self.btrfs.find_subvolume(subvol)
69
+ elif subvolid:
70
+ self.subvolume = self.btrfs.open_subvolume(subvolid)
71
+ else:
72
+ self.subvolume = self.btrfs.default_subvolume
73
+
74
+ def get(self, path: str) -> FilesystemEntry:
75
+ return BtrfsFilesystemEntry(self, path, self._get_node(path))
76
+
77
+ def _get_node(self, path: str, node: Optional[btrfs.INode] = None) -> btrfs.INode:
78
+ try:
79
+ return self.subvolume.get(path, node)
80
+ except btrfs.FileNotFoundError as e:
81
+ raise FileNotFoundError(path, cause=e)
82
+ except btrfs.NotADirectoryError as e:
83
+ raise NotADirectoryError(path, cause=e)
84
+ except btrfs.NotASymlinkError as e:
85
+ raise NotASymlinkError(path, cause=e)
86
+ except btrfs.Error as e:
87
+ raise FileNotFoundError(path, cause=e)
88
+
89
+
90
+ class BtrfsFilesystemEntry(FilesystemEntry):
91
+ fs: BtrfsFilesystem
92
+ entry: btrfs.INode
93
+
94
+ def get(self, path: str) -> FilesystemEntry:
95
+ entry_path = fsutil.join(self.path, path, alt_separator=self.fs.alt_separator)
96
+ entry = self.fs._get_node(path, self.entry)
97
+ return BtrfsFilesystemEntry(self.fs, entry_path, entry)
98
+
99
+ def open(self) -> BinaryIO:
100
+ if self.is_dir():
101
+ raise IsADirectoryError(self.path)
102
+ return self._resolve().entry.open()
103
+
104
+ def _iterdir(self) -> Iterator[btrfs.INode]:
105
+ if not self.is_dir():
106
+ raise NotADirectoryError(self.path)
107
+
108
+ if self.is_symlink():
109
+ for entry in self.readlink_ext().iterdir():
110
+ yield entry
111
+ else:
112
+ for name, entry in self.entry.iterdir():
113
+ if name in (".", ".."):
114
+ continue
115
+
116
+ yield name, entry
117
+
118
+ def iterdir(self) -> Iterator[str]:
119
+ for name, _ in self._iterdir():
120
+ yield name
121
+
122
+ def scandir(self) -> Iterator[FilesystemEntry]:
123
+ for name, entry in self._iterdir():
124
+ entry_path = fsutil.join(self.path, name, alt_separator=self.fs.alt_separator)
125
+ yield BtrfsFilesystemEntry(self.fs, entry_path, entry)
126
+
127
+ def is_dir(self, follow_symlinks: bool = True) -> bool:
128
+ try:
129
+ return self._resolve(follow_symlinks=follow_symlinks).entry.is_dir()
130
+ except FilesystemError:
131
+ return False
132
+
133
+ def is_file(self, follow_symlinks: bool = True) -> bool:
134
+ try:
135
+ return self._resolve(follow_symlinks=follow_symlinks).entry.is_file()
136
+ except FilesystemError:
137
+ return False
138
+
139
+ def is_symlink(self) -> bool:
140
+ return self.entry.is_symlink()
141
+
142
+ def readlink(self) -> str:
143
+ if not self.is_symlink():
144
+ raise NotASymlinkError()
145
+
146
+ return self.entry.link
147
+
148
+ def stat(self, follow_symlinks: bool = True) -> fsutil.stat_result:
149
+ return self._resolve(follow_symlinks=follow_symlinks).lstat()
150
+
151
+ def lstat(self) -> fsutil.stat_result:
152
+ entry = self.entry
153
+ node = self.entry.inode
154
+
155
+ # mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime
156
+ st_info = st_info = fsutil.stat_result(
157
+ [
158
+ entry.mode,
159
+ entry.inum,
160
+ 0,
161
+ node.nlink,
162
+ entry.uid,
163
+ entry.gid,
164
+ entry.size,
165
+ # timestamp() returns a float which will fill both the integer and float fields
166
+ entry.atime.timestamp(),
167
+ entry.mtime.timestamp(),
168
+ entry.ctime.timestamp(),
169
+ ]
170
+ )
171
+
172
+ # Set the nanosecond resolution separately
173
+ st_info.st_atime_ns = entry.atime_ns
174
+ st_info.st_mtime_ns = entry.mtime_ns
175
+ st_info.st_ctime_ns = entry.ctime_ns
176
+
177
+ # Btrfs has a birth time, called otime
178
+ st_info.st_birthtime = entry.otime.timestamp()
179
+
180
+ return st_info
@@ -4,7 +4,7 @@ import urllib.parse
4
4
  from datetime import datetime, timezone, tzinfo
5
5
  from enum import Enum
6
6
  from pathlib import Path
7
- from typing import BinaryIO, Iterator, Union
7
+ from typing import BinaryIO, Callable, Iterator, Optional, Union
8
8
 
9
9
  from dissect.util.ts import from_unix
10
10
 
@@ -17,7 +17,7 @@ class StrEnum(str, Enum):
17
17
  """Sortable and serializible string-based enum"""
18
18
 
19
19
 
20
- def list_to_frozen_set(function):
20
+ def list_to_frozen_set(function: Callable) -> Callable:
21
21
  def wrapper(*args):
22
22
  args = [frozenset(x) if isinstance(x, list) else x for x in args]
23
23
  return function(*args)
@@ -25,7 +25,7 @@ def list_to_frozen_set(function):
25
25
  return wrapper
26
26
 
27
27
 
28
- def parse_path_uri(path):
28
+ def parse_path_uri(path: Path) -> tuple[Optional[str], Optional[str], Optional[str]]:
29
29
  if path is None:
30
30
  return None, None, None
31
31
  parsed_path = urllib.parse.urlparse(str(path))
@@ -33,6 +33,17 @@ def parse_path_uri(path):
33
33
  return parsed_path.scheme, parsed_path.path, parsed_query
34
34
 
35
35
 
36
+ def parse_options_string(options: str) -> dict[str, Union[str, bool]]:
37
+ result = {}
38
+ for opt in options.split(","):
39
+ if "=" in opt:
40
+ key, _, value = opt.partition("=")
41
+ result[key] = value
42
+ else:
43
+ result[opt] = True
44
+ return result
45
+
46
+
36
47
  SLUG_RE = re.compile(r"[/\\ ]")
37
48
 
38
49
 
@@ -199,10 +199,9 @@ class SymantecPlugin(Plugin):
199
199
 
200
200
  def check_compatible(self) -> None:
201
201
  for log_file in self.LOGS:
202
- if self.target.fs.glob(log_file):
203
- break
204
- else:
205
- raise UnsupportedPluginError("No Symantec SEP logs found")
202
+ if list(self.target.fs.glob(log_file)):
203
+ return
204
+ raise UnsupportedPluginError("No Symantec SEP logs found")
206
205
 
207
206
  def _fw_cell(self, line: list, cell_id: int) -> str:
208
207
  return line[cell_id].decode("utf-8")
@@ -11,6 +11,7 @@ from flow.record.fieldtypes import posix_path
11
11
  from dissect.target.filesystem import Filesystem
12
12
  from dissect.target.helpers.fsutil import TargetPath
13
13
  from dissect.target.helpers.record import UnixUserRecord
14
+ from dissect.target.helpers.utils import parse_options_string
14
15
  from dissect.target.plugin import OperatingSystem, OSPlugin, arg, export
15
16
  from dissect.target.target import Target
16
17
 
@@ -177,33 +178,41 @@ class UnixPlugin(OSPlugin):
177
178
  def _add_mounts(self) -> None:
178
179
  fstab = self.target.fs.path("/etc/fstab")
179
180
 
180
- volumes_to_mount = [v for v in self.target.volumes if v.fs]
181
-
182
- for dev_id, volume_name, _, mount_point in parse_fstab(fstab, self.target.log):
183
- for volume in volumes_to_mount:
181
+ for dev_id, volume_name, mount_point, _, options in parse_fstab(fstab, self.target.log):
182
+ opts = parse_options_string(options)
183
+ subvol = opts.get("subvol", None)
184
+ subvolid = opts.get("subvolid", None)
185
+ for fs in self.target.filesystems:
184
186
  fs_id = None
187
+ fs_subvol = None
188
+ fs_subvolid = None
189
+ fs_volume_name = fs.volume.name if fs.volume and not isinstance(fs.volume, list) else None
185
190
  last_mount = None
186
191
 
187
192
  if dev_id:
188
- if volume.fs.__type__ == "xfs":
189
- fs_id = volume.fs.xfs.uuid
190
- elif volume.fs.__type__ == "ext":
191
- fs_id = volume.fs.extfs.uuid
192
- last_mount = volume.fs.extfs.last_mount
193
- elif volume.fs.__type__ == "fat":
194
- fs_id = volume.fs.fatfs.volume_id
193
+ if fs.__type__ == "xfs":
194
+ fs_id = fs.xfs.uuid
195
+ elif fs.__type__ == "ext":
196
+ fs_id = fs.extfs.uuid
197
+ last_mount = fs.extfs.last_mount
198
+ elif fs.__type__ == "btrfs":
199
+ fs_id = fs.btrfs.uuid
200
+ fs_subvol = fs.subvolume.path
201
+ fs_subvolid = fs.subvolume.objectid
202
+ elif fs.__type__ == "fat":
203
+ fs_id = fs.fatfs.volume_id
195
204
  # This normalizes fs_id to comply with libblkid generated UUIDs
196
205
  # This is needed because FAT filesystems don't have a real UUID,
197
206
  # but instead a volume_id which is not case-sensitive
198
207
  fs_id = fs_id[:4].upper() + "-" + fs_id[4:].upper()
199
208
 
200
209
  if (
201
- (fs_id and (fs_id == dev_id))
202
- or (volume.name and (volume.name == volume_name))
210
+ (fs_id and (fs_id == dev_id and (subvol == fs_subvol or subvolid == fs_subvolid)))
211
+ or (fs_volume_name and (fs_volume_name == volume_name))
203
212
  or (last_mount and (last_mount == mount_point))
204
213
  ):
205
- self.target.log.debug("Mounting %s at %s", volume, mount_point)
206
- self.target.fs.mount(mount_point, volume.fs)
214
+ self.target.log.debug("Mounting %s (%s) at %s", fs, fs.volume, mount_point)
215
+ self.target.fs.mount(mount_point, fs)
207
216
 
208
217
  def _parse_os_release(self, glob: Optional[str] = None) -> dict[str, str]:
209
218
  """Parse files containing Unix version information.
@@ -283,7 +292,7 @@ class UnixPlugin(OSPlugin):
283
292
  def parse_fstab(
284
293
  fstab: TargetPath,
285
294
  log: logging.Logger = log,
286
- ) -> Iterator[tuple[Union[uuid.UUID, str], str, str, str]]:
295
+ ) -> Iterator[tuple[Union[uuid.UUID, str], str, str, str, str]]:
287
296
  """Parse fstab file and return a generator that streams the details of entries,
288
297
  with unsupported FS types and block devices filtered away.
289
298
  """
@@ -310,7 +319,7 @@ def parse_fstab(
310
319
  if len(entry_parts) != 6:
311
320
  continue
312
321
 
313
- dev, mount_point, fs_type, _, _, _ = entry_parts
322
+ dev, mount_point, fs_type, options, _, _ = entry_parts
314
323
 
315
324
  if fs_type in SKIP_FS_TYPES:
316
325
  log.warning("Skipped FS type: %s, %s, %s", fs_type, dev, mount_point)
@@ -341,4 +350,4 @@ def parse_fstab(
341
350
  except ValueError:
342
351
  pass
343
352
 
344
- yield dev_id, volume_name, fs_type, mount_point
353
+ yield dev_id, volume_name, mount_point, fs_type, options
@@ -155,6 +155,7 @@ class Target:
155
155
  """Resolve all disks, volumes and filesystems and load an operating system on the current ``Target``."""
156
156
  self.disks.apply()
157
157
  self.volumes.apply()
158
+ self.filesystems.apply()
158
159
  self._init_os()
159
160
  self._applied = True
160
161
 
@@ -712,19 +713,12 @@ class DiskCollection(Collection[container.Container]):
712
713
 
713
714
 
714
715
  class VolumeCollection(Collection[volume.Volume]):
715
- def open(self, vol: volume.Volume) -> None:
716
- try:
717
- if not hasattr(vol, "fs") or vol.fs is None:
718
- vol.fs = filesystem.open(vol)
719
- self.target.log.debug("Opened filesystem: %s on %s", vol.fs, vol)
720
- self.target.filesystems.add(vol.fs)
721
- except FilesystemError as e:
722
- self.target.log.warning("Can't identify filesystem: %s", vol)
723
- self.target.log.debug("", exc_info=e)
724
-
725
716
  def apply(self) -> None:
726
717
  # We don't want later additions to modify the todo, so make a copy
727
718
  todo = self.entries[:]
719
+ fs_volumes = []
720
+ lvm_volumes = []
721
+ encrypted_volumes = []
728
722
 
729
723
  while todo:
730
724
  new_volumes = []
@@ -751,19 +745,19 @@ class VolumeCollection(Collection[volume.Volume]):
751
745
  if vol.offset == 0 and vol.vs and vol.vs.__type__ == "disk":
752
746
  # We are going to re-open a volume system on itself, bail out
753
747
  self.target.log.info("Found volume with offset 0, opening as raw volume instead")
754
- self.open(vol)
748
+ fs_volumes.append(vol)
755
749
  continue
756
750
 
757
751
  try:
758
752
  vs = volume.open(vol)
759
753
  except Exception:
760
754
  # If opening a volume system fails, there's likely none, so open as a filesystem instead
761
- self.open(vol)
755
+ fs_volumes.append(vol)
762
756
  continue
763
757
 
764
758
  if not len(vs.volumes):
765
759
  # We opened an empty volume system, discard
766
- self.open(vol)
760
+ fs_volumes.append(vol)
767
761
  continue
768
762
 
769
763
  self.entries.extend(vs.volumes)
@@ -786,20 +780,30 @@ class VolumeCollection(Collection[volume.Volume]):
786
780
 
787
781
  todo = new_volumes
788
782
 
789
- # ASDF - getting the correct starting system volume
790
- start_fs = None
791
- start_vol = None
792
- for idx, vol in enumerate(self.entries):
793
- if start_fs is None and (vol.name is None):
794
- start_fs = idx
783
+ mv_fs_volumes = []
784
+ for vol in fs_volumes:
785
+ try:
786
+ if getattr(vol, "fs", None) is None:
787
+ if filesystem.is_multi_volume_filesystem(vol):
788
+ mv_fs_volumes.append(vol)
789
+ else:
790
+ vol.fs = filesystem.open(vol)
791
+ self.target.log.debug("Opened filesystem: %s on %s", vol.fs, vol)
795
792
 
796
- if start_vol is None and start_fs is not None and (vol.name is not None and vol.fs is None):
797
- start_vol = idx
793
+ if getattr(vol, "fs", None) is not None:
794
+ self.target.filesystems.add(vol.fs)
795
+ except FilesystemError as e:
796
+ self.target.log.warning("Can't identify filesystem: %s", vol)
797
+ self.target.log.debug("", exc_info=e)
798
798
 
799
- if start_fs is not None and start_vol is not None and (vol.name is not None and vol.fs is None):
800
- rel_vol = idx - start_vol
801
- vol.fs = self.entries[start_fs + rel_vol].fs
799
+ for fs in filesystem.open_multi_volume(mv_fs_volumes):
800
+ self.target.filesystems.add(fs)
801
+ for vol in fs.volume:
802
+ vol.fs = fs
802
803
 
803
804
 
804
805
  class FilesystemCollection(Collection[filesystem.Filesystem]):
805
- pass
806
+ def apply(self) -> None:
807
+ for fs in self.entries:
808
+ for subfs in fs.iter_subfs():
809
+ self.add(subfs)
@@ -3,6 +3,7 @@ import logging
3
3
  from typing import Union
4
4
 
5
5
  from dissect.target import Target, filesystem
6
+ from dissect.target.helpers.utils import parse_options_string
6
7
  from dissect.target.tools.utils import (
7
8
  catch_sigpipe,
8
9
  configure_generic_arguments,
@@ -70,7 +71,7 @@ def main():
70
71
  vfs.mount(fname, fs)
71
72
 
72
73
  # This is kinda silly because fusepy will convert this back into string arguments
73
- options = _parse_options(args.options) if args.options else {}
74
+ options = parse_options_string(args.options) if args.options else {}
74
75
 
75
76
  options["nothreads"] = True
76
77
  options["allow_other"] = True
@@ -83,17 +84,6 @@ def main():
83
84
  parser.exit("FUSE error")
84
85
 
85
86
 
86
- def _parse_options(options: str) -> dict[str, Union[str, bool]]:
87
- result = {}
88
- for opt in options.split(","):
89
- if "=" in opt:
90
- key, _, value = opt.partition("=")
91
- result[key] = value
92
- else:
93
- result[opt] = True
94
- return result
95
-
96
-
97
87
  def _format_options(options: dict[str, Union[str, bool]]) -> str:
98
88
  return ",".join([key if value is True else f"{key}={value}" for key, value in options.items()])
99
89
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.14.dev8
3
+ Version: 3.14.dev10
4
4
  Summary: This module ties all other Dissect modules together, it provides a programming API and command line tools which allow easy access to various data sources inside disk images or file collections (a.k.a. targets)
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License: Affero General Public License v3
@@ -35,6 +35,7 @@ Requires-Dist: flow.record~=3.13.0
35
35
  Requires-Dist: structlog
36
36
  Provides-Extra: full
37
37
  Requires-Dist: asn1crypto; extra == "full"
38
+ Requires-Dist: dissect.btrfs<2.0.dev,>=1.0.dev; extra == "full"
38
39
  Requires-Dist: dissect.cim<4.0.dev,>=3.0.dev; extra == "full"
39
40
  Requires-Dist: dissect.clfs<2.0.dev,>=1.0.dev; extra == "full"
40
41
  Requires-Dist: dissect.esedb<4.0.dev,>=3.0.dev; extra == "full"
@@ -34,6 +34,7 @@ dissect/target/containers/vmdk.py
34
34
  dissect/target/data/autocompletion/target_bash_completion.sh
35
35
  dissect/target/filesystems/__init__.py
36
36
  dissect/target/filesystems/ad1.py
37
+ dissect/target/filesystems/btrfs.py
37
38
  dissect/target/filesystems/cb.py
38
39
  dissect/target/filesystems/config.py
39
40
  dissect/target/filesystems/dir.py
@@ -16,6 +16,7 @@ carbon-black-cloud-sdk-python~=1.4.3
16
16
 
17
17
  [full]
18
18
  asn1crypto
19
+ dissect.btrfs<2.0.dev,>=1.0.dev
19
20
  dissect.cim<4.0.dev,>=3.0.dev
20
21
  dissect.clfs<2.0.dev,>=1.0.dev
21
22
  dissect.esedb<4.0.dev,>=3.0.dev
@@ -47,6 +47,7 @@ repository = "https://github.com/fox-it/dissect.target"
47
47
  [project.optional-dependencies]
48
48
  full = [
49
49
  "asn1crypto",
50
+ "dissect.btrfs>=1.0.dev,<2.0.dev",
50
51
  "dissect.cim>=3.0.dev,<4.0.dev",
51
52
  "dissect.clfs>=1.0.dev,<2.0.dev",
52
53
  "dissect.esedb>=3.0.dev,<4.0.dev",