manageiq-smartstate 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +4 -0
- data/.rspec_ci +4 -0
- data/.travis.yml +15 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +202 -0
- data/README.md +45 -0
- data/Rakefile +23 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/MiqContainerGroup/MiqContainerGroup.rb +31 -0
- data/lib/MiqVm/MiqLocalVm.rb +50 -0
- data/lib/MiqVm/MiqRhevmVm.rb +179 -0
- data/lib/MiqVm/MiqVm.rb +355 -0
- data/lib/MiqVm/miq_azure_vm.rb +96 -0
- data/lib/MiqVm/miq_scvmm_vm.rb +38 -0
- data/lib/MiqVm/test/camcorder_fleece_test.rb +60 -0
- data/lib/MiqVm/test/localVm.rb +45 -0
- data/lib/MiqVm/test/partitionAlignmentCheck.rb +76 -0
- data/lib/MiqVm/test/remoteVm.rb +65 -0
- data/lib/MiqVm/test/rhevmNfsTest.rb +62 -0
- data/lib/MiqVm/test/rhevmNfsTest2.rb +66 -0
- data/lib/MiqVm/test/rhevmTest.rb +70 -0
- data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackCommon.rb +107 -0
- data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackImage.rb +67 -0
- data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackInstance.rb +182 -0
- data/lib/Scvmm/miq_hyperv_disk.rb +273 -0
- data/lib/Scvmm/miq_scvmm_parse_powershell.rb +75 -0
- data/lib/Scvmm/miq_scvmm_vm_ssa_info.rb +135 -0
- data/lib/Scvmm/test/miq_hyperv_disk_test.rb +33 -0
- data/lib/Scvmm/test/miq_scvmm_vm_ssa_info_test.rb +41 -0
- data/lib/VmLocalDiskAccess/test/localCfg.rb +97 -0
- data/lib/VolumeManager/LVM/logical_volume.rb +75 -0
- data/lib/VolumeManager/LVM/lv_segment.rb +43 -0
- data/lib/VolumeManager/LVM/lvm2disk.rb +158 -0
- data/lib/VolumeManager/LVM/parser.rb +138 -0
- data/lib/VolumeManager/LVM/physical_volume.rb +19 -0
- data/lib/VolumeManager/LVM/scanner.rb +156 -0
- data/lib/VolumeManager/LVM/thin/btree.rb +83 -0
- data/lib/VolumeManager/LVM/thin/constants.rb +86 -0
- data/lib/VolumeManager/LVM/thin/data_map.rb +44 -0
- data/lib/VolumeManager/LVM/thin/mapping_tree.rb +19 -0
- data/lib/VolumeManager/LVM/thin/space_maps.rb +58 -0
- data/lib/VolumeManager/LVM/thin/superblock.rb +136 -0
- data/lib/VolumeManager/LVM/thin.rb +6 -0
- data/lib/VolumeManager/LVM/volume_group.rb +97 -0
- data/lib/VolumeManager/LVM.rb +8 -0
- data/lib/VolumeManager/MiqLdm.rb +546 -0
- data/lib/VolumeManager/MiqLvm.rb +17 -0
- data/lib/VolumeManager/MiqNativeVolumeManager.rb +150 -0
- data/lib/VolumeManager/MiqVolumeManager.rb +277 -0
- data/lib/VolumeManager/VolMgrPlatformSupport.rb +18 -0
- data/lib/VolumeManager/VolMgrPlatformSupportLinux.rb +77 -0
- data/lib/VolumeManager/VolMgrPlatformSupportWin.rb +17 -0
- data/lib/VolumeManager/test/blockDevTest.rb +40 -0
- data/lib/VolumeManager/test/ldm.rb +97 -0
- data/lib/blackbox/VmBlackBox.rb +103 -0
- data/lib/blackbox/xmlStorage.rb +180 -0
- data/lib/db/MiqBdb/MiqBdb.rb +309 -0
- data/lib/db/MiqBdb/MiqBdbBtree.rb +219 -0
- data/lib/db/MiqBdb/MiqBdbHash.rb +199 -0
- data/lib/db/MiqBdb/MiqBdbPage.rb +159 -0
- data/lib/db/MiqBdb/MiqBdbUtil.rb +18 -0
- data/lib/db/MiqSqlite/MiqSqlite3.rb +330 -0
- data/lib/db/MiqSqlite/MiqSqlite3Cell.rb +167 -0
- data/lib/db/MiqSqlite/MiqSqlite3Page.rb +151 -0
- data/lib/db/MiqSqlite/MiqSqlite3Table.rb +124 -0
- data/lib/db/MiqSqlite/MiqSqlite3Util.rb +32 -0
- data/lib/disk/DiskProbe.rb +68 -0
- data/lib/disk/MiqDisk.rb +317 -0
- data/lib/disk/camcorder_test.rb +90 -0
- data/lib/disk/dos_mbr.img +0 -0
- data/lib/disk/modules/AzureBlobDisk.rb +101 -0
- data/lib/disk/modules/LocalDevMod.rb +47 -0
- data/lib/disk/modules/LocalDevProbe.rb +6 -0
- data/lib/disk/modules/MSCommon.rb +352 -0
- data/lib/disk/modules/MSVSDiffDisk.rb +91 -0
- data/lib/disk/modules/MSVSDiskProbe.rb +61 -0
- data/lib/disk/modules/MSVSDynamicDisk.rb +42 -0
- data/lib/disk/modules/MSVSFixedDisk.rb +45 -0
- data/lib/disk/modules/MiqLargeFile.rb +63 -0
- data/lib/disk/modules/MiqLargeFileWin32.rb +107 -0
- data/lib/disk/modules/QcowDisk.rb +692 -0
- data/lib/disk/modules/QcowDiskProbe.rb +34 -0
- data/lib/disk/modules/RawBlockIO.rb +116 -0
- data/lib/disk/modules/RawDisk.rb +45 -0
- data/lib/disk/modules/RawDiskProbe.rb +7 -0
- data/lib/disk/modules/RhevmDescriptor.rb +167 -0
- data/lib/disk/modules/RhevmDiskProbe.rb +52 -0
- data/lib/disk/modules/VMWareCowdDisk.rb +207 -0
- data/lib/disk/modules/VMWareDescriptor.rb +214 -0
- data/lib/disk/modules/VMWareDiskProbe.rb +74 -0
- data/lib/disk/modules/VMWareSparseDisk.rb +189 -0
- data/lib/disk/modules/VhdxDisk.rb +625 -0
- data/lib/disk/modules/VhdxDiskProbe.rb +46 -0
- data/lib/disk/modules/VixDiskMod.rb +54 -0
- data/lib/disk/modules/VixDiskProbe.rb +6 -0
- data/lib/disk/modules/miq_disk_cache.rb +135 -0
- data/lib/disk/modules/miq_dummy_disk.rb +41 -0
- data/lib/disk/modules/vhdx_bat_entry.rb +10 -0
- data/lib/disk/test.rb +66 -0
- data/lib/fs/MetakitFS/MetakitFS.rb +530 -0
- data/lib/fs/MetakitFS/test/Makefile +14 -0
- data/lib/fs/MetakitFS/test/MkCollectFiles.rb +165 -0
- data/lib/fs/MetakitFS/test/MkSelectFiles.rb +30 -0
- data/lib/fs/MetakitFS/test/collect_files.yaml +70 -0
- data/lib/fs/MetakitFS/test/init.rb +3 -0
- data/lib/fs/MetakitFS/test/mk2vmdk.rb +64 -0
- data/lib/fs/MetakitFS/test/mk4test.c +92 -0
- data/lib/fs/MetakitFS/test/mkFsTest.rb +113 -0
- data/lib/fs/MetakitFS/test/proto.rb +97 -0
- data/lib/fs/MiqFS/FsProbe.rb +39 -0
- data/lib/fs/MiqFS/MiqFS.rb +515 -0
- data/lib/fs/MiqFS/modules/AUFSProbe.rb +26 -0
- data/lib/fs/MiqFS/modules/Ext3.rb +305 -0
- data/lib/fs/MiqFS/modules/Ext3Probe.rb +25 -0
- data/lib/fs/MiqFS/modules/Ext4.rb +304 -0
- data/lib/fs/MiqFS/modules/Ext4Probe.rb +25 -0
- data/lib/fs/MiqFS/modules/Fat32.rb +318 -0
- data/lib/fs/MiqFS/modules/Fat32Probe.rb +30 -0
- data/lib/fs/MiqFS/modules/HFSProbe.rb +18 -0
- data/lib/fs/MiqFS/modules/Iso9660.rb +293 -0
- data/lib/fs/MiqFS/modules/Iso9660Probe.rb +18 -0
- data/lib/fs/MiqFS/modules/LocalFS.rb +105 -0
- data/lib/fs/MiqFS/modules/NTFS.rb +287 -0
- data/lib/fs/MiqFS/modules/NTFSProbe.rb +21 -0
- data/lib/fs/MiqFS/modules/NativeFS.rb +155 -0
- data/lib/fs/MiqFS/modules/ReFSProbe.rb +17 -0
- data/lib/fs/MiqFS/modules/RealFS.rb +79 -0
- data/lib/fs/MiqFS/modules/RealFSProbe.rb +6 -0
- data/lib/fs/MiqFS/modules/Reiser4Probe.rb +18 -0
- data/lib/fs/MiqFS/modules/ReiserFS.rb +315 -0
- data/lib/fs/MiqFS/modules/ReiserFSProbe.rb +42 -0
- data/lib/fs/MiqFS/modules/UnionFSProbe.rb +18 -0
- data/lib/fs/MiqFS/modules/WebDAV.rb +127 -0
- data/lib/fs/MiqFS/modules/WebDAVFile.rb +68 -0
- data/lib/fs/MiqFS/modules/XFS.rb +300 -0
- data/lib/fs/MiqFS/modules/XFSProbe.rb +26 -0
- data/lib/fs/MiqFS/modules/ZFSProbe.rb +18 -0
- data/lib/fs/MiqFS/test.rb +59 -0
- data/lib/fs/MiqFsUtil.rb +383 -0
- data/lib/fs/MiqMountManager.rb +209 -0
- data/lib/fs/MiqNativeMountManager.rb +101 -0
- data/lib/fs/MountManagerProbe.rb +29 -0
- data/lib/fs/ReiserFS/block.rb +209 -0
- data/lib/fs/ReiserFS/directory.rb +136 -0
- data/lib/fs/ReiserFS/directory_entry.rb +140 -0
- data/lib/fs/ReiserFS/file_data.rb +111 -0
- data/lib/fs/ReiserFS/superblock.rb +140 -0
- data/lib/fs/ReiserFS/utils.rb +95 -0
- data/lib/fs/VimDatastoreFS/VimDatastoreFS.rb +192 -0
- data/lib/fs/ext3/alloc_bitmap.rb +38 -0
- data/lib/fs/ext3/block_pointers_path.rb +130 -0
- data/lib/fs/ext3/directory.rb +51 -0
- data/lib/fs/ext3/directory_entry.rb +67 -0
- data/lib/fs/ext3/ex_attrib_header.rb +14 -0
- data/lib/fs/ext3/ex_attrib_name.rb +23 -0
- data/lib/fs/ext3/file_data.rb +130 -0
- data/lib/fs/ext3/group_descriptor_entry.rb +65 -0
- data/lib/fs/ext3/group_descriptor_table.rb +54 -0
- data/lib/fs/ext3/hash_tree_entry.rb +18 -0
- data/lib/fs/ext3/hash_tree_header.rb +15 -0
- data/lib/fs/ext3/inode.rb +228 -0
- data/lib/fs/ext3/posix_acl_entry.rb +29 -0
- data/lib/fs/ext3/posix_acl_header.rb +11 -0
- data/lib/fs/ext3/superblock.rb +406 -0
- data/lib/fs/ext3/test/tc_Ext3BlockPointersPath.rb +74 -0
- data/lib/fs/ext4/alloc_bitmap.rb +38 -0
- data/lib/fs/ext4/directory.rb +87 -0
- data/lib/fs/ext4/directory_entry.rb +77 -0
- data/lib/fs/ext4/ex_attrib_header.rb +14 -0
- data/lib/fs/ext4/ex_attrib_name.rb +23 -0
- data/lib/fs/ext4/extent.rb +35 -0
- data/lib/fs/ext4/extent_header.rb +40 -0
- data/lib/fs/ext4/extent_index.rb +33 -0
- data/lib/fs/ext4/group_descriptor_entry.rb +69 -0
- data/lib/fs/ext4/group_descriptor_table.rb +54 -0
- data/lib/fs/ext4/hash_tree_entry.rb +58 -0
- data/lib/fs/ext4/hash_tree_header.rb +35 -0
- data/lib/fs/ext4/inode.rb +465 -0
- data/lib/fs/ext4/posix_acl_entry.rb +29 -0
- data/lib/fs/ext4/posix_acl_header.rb +11 -0
- data/lib/fs/ext4/superblock.rb +412 -0
- data/lib/fs/fat32/boot_sect.rb +379 -0
- data/lib/fs/fat32/directory.rb +222 -0
- data/lib/fs/fat32/directory_entry.rb +540 -0
- data/lib/fs/fat32/file_data.rb +128 -0
- data/lib/fs/iso9660/boot_sector.rb +170 -0
- data/lib/fs/iso9660/directory.rb +90 -0
- data/lib/fs/iso9660/directory_entry.rb +147 -0
- data/lib/fs/iso9660/file_data.rb +78 -0
- data/lib/fs/iso9660/rock_ridge.rb +329 -0
- data/lib/fs/iso9660/util.rb +57 -0
- data/lib/fs/modules/LinuxMount.rb +300 -0
- data/lib/fs/modules/LinuxMountProbe.rb +29 -0
- data/lib/fs/modules/WinMount.rb +97 -0
- data/lib/fs/modules/WinMountProbe.rb +24 -0
- data/lib/fs/ntfs/attrib_attribute_list.rb +131 -0
- data/lib/fs/ntfs/attrib_bitmap.rb +26 -0
- data/lib/fs/ntfs/attrib_data.rb +74 -0
- data/lib/fs/ntfs/attrib_file_name.rb +110 -0
- data/lib/fs/ntfs/attrib_header.rb +194 -0
- data/lib/fs/ntfs/attrib_index_allocation.rb +19 -0
- data/lib/fs/ntfs/attrib_index_root.rb +247 -0
- data/lib/fs/ntfs/attrib_object_id.rb +40 -0
- data/lib/fs/ntfs/attrib_standard_information.rb +107 -0
- data/lib/fs/ntfs/attrib_type.rb +49 -0
- data/lib/fs/ntfs/attrib_volume_information.rb +53 -0
- data/lib/fs/ntfs/attrib_volume_name.rb +31 -0
- data/lib/fs/ntfs/boot_sect.rb +253 -0
- data/lib/fs/ntfs/data_run.rb +358 -0
- data/lib/fs/ntfs/directory_index_node.rb +114 -0
- data/lib/fs/ntfs/index_node_header.rb +69 -0
- data/lib/fs/ntfs/index_record_header.rb +85 -0
- data/lib/fs/ntfs/mft_entry.rb +288 -0
- data/lib/fs/ntfs/utils.rb +43 -0
- data/lib/fs/test/camcorder_fs_test.rb +108 -0
- data/lib/fs/test/collect_files_direct.yaml +22 -0
- data/lib/fs/test/collect_files_in.yaml +24 -0
- data/lib/fs/test/collect_files_in_nc.yaml +22 -0
- data/lib/fs/test/collect_files_out.yaml +6 -0
- data/lib/fs/test/collect_files_rm.yaml +6 -0
- data/lib/fs/test/copyTest.rb +126 -0
- data/lib/fs/test/fsTest.rb +87 -0
- data/lib/fs/test/updateTest.rb +184 -0
- data/lib/fs/xfs/allocation_group.rb +160 -0
- data/lib/fs/xfs/bmap_btree_block.rb +125 -0
- data/lib/fs/xfs/bmap_btree_record.rb +80 -0
- data/lib/fs/xfs/bmap_btree_root_node.rb +72 -0
- data/lib/fs/xfs/directory.rb +133 -0
- data/lib/fs/xfs/directory2_data_header.rb +27 -0
- data/lib/fs/xfs/directory3_data_header.rb +34 -0
- data/lib/fs/xfs/directory_block_tail.rb +22 -0
- data/lib/fs/xfs/directory_data_header.rb +46 -0
- data/lib/fs/xfs/directory_entry.rb +106 -0
- data/lib/fs/xfs/inode.rb +532 -0
- data/lib/fs/xfs/inode_map.rb +100 -0
- data/lib/fs/xfs/short_form_directory_entry.rb +91 -0
- data/lib/fs/xfs/short_form_header.rb +44 -0
- data/lib/fs/xfs/superblock.rb +556 -0
- data/lib/lib/tasks/azure.rake +52 -0
- data/lib/manageiq/smartstate/version.rb +5 -0
- data/lib/manageiq/smartstate.rb +7 -0
- data/lib/manageiq-smartstate.rb +1 -0
- data/lib/metadata/MIQExtract/MIQExtract.rb +297 -0
- data/lib/metadata/MIQExtract/test/extractTest.rb +41 -0
- data/lib/metadata/MIQExtract/test/full_extract_test.rb +68 -0
- data/lib/metadata/ScanProfile/HostScanItem.rb +4 -0
- data/lib/metadata/ScanProfile/HostScanProfile.rb +4 -0
- data/lib/metadata/ScanProfile/HostScanProfiles.rb +41 -0
- data/lib/metadata/ScanProfile/ScanItemBase.rb +63 -0
- data/lib/metadata/ScanProfile/ScanProfileBase.rb +51 -0
- data/lib/metadata/ScanProfile/ScanProfilesBase.rb +60 -0
- data/lib/metadata/ScanProfile/VmScanItem.rb +4 -0
- data/lib/metadata/ScanProfile/VmScanProfile.rb +4 -0
- data/lib/metadata/ScanProfile/VmScanProfiles.rb +38 -0
- data/lib/metadata/ScanProfile/modules/HostScanItemFile.rb +51 -0
- data/lib/metadata/ScanProfile/modules/HostScanItemNteventlog.rb +84 -0
- data/lib/metadata/ScanProfile/modules/VmScanItemFile.rb +39 -0
- data/lib/metadata/ScanProfile/modules/VmScanItemNteventlog.rb +34 -0
- data/lib/metadata/ScanProfile/modules/VmScanItemRegistry.rb +64 -0
- data/lib/metadata/VMMount/VMMount.rb +81 -0
- data/lib/metadata/VMMount/VMPlatformMount.rb +18 -0
- data/lib/metadata/VMMount/VMPlatformMountLinux.rb +75 -0
- data/lib/metadata/VMMount/VMPlatformMountWin.rb +13 -0
- data/lib/metadata/VmConfig/GetNativeCfg.rb +45 -0
- data/lib/metadata/VmConfig/VmConfig.rb +947 -0
- data/lib/metadata/VmConfig/cfgConfig.rb +45 -0
- data/lib/metadata/VmConfig/ovfConfig.rb +99 -0
- data/lib/metadata/VmConfig/test/GetVMwareCfgTest.rb +40 -0
- data/lib/metadata/VmConfig/vmcConfig.rb +116 -0
- data/lib/metadata/VmConfig/vmtxConfig.rb +4 -0
- data/lib/metadata/VmConfig/vmxConfig.rb +162 -0
- data/lib/metadata/VmConfig/xmlConfig.rb +79 -0
- data/lib/metadata/VmConfig/xmlMsHyperVConfig.rb +41 -0
- data/lib/metadata/linux/InitProcHash.rb +632 -0
- data/lib/metadata/linux/LinuxInitProcs.rb +142 -0
- data/lib/metadata/linux/LinuxOSInfo.rb +237 -0
- data/lib/metadata/linux/LinuxPackages.rb +209 -0
- data/lib/metadata/linux/LinuxSystemd.rb +130 -0
- data/lib/metadata/linux/LinuxUsers.rb +289 -0
- data/lib/metadata/linux/LinuxUtils.rb +197 -0
- data/lib/metadata/linux/MiqConaryPackages.rb +41 -0
- data/lib/metadata/linux/MiqRpmPackages.rb +160 -0
- data/lib/metadata/linux/test/Name +0 -0
- data/lib/metadata/linux/test/Packages +0 -0
- data/lib/metadata/linux/test/rpoTest.rb +5 -0
- data/lib/metadata/linux/test/tc_LinuxUtils.rb +4157 -0
- data/lib/metadata/util/event_log_filter.rb +61 -0
- data/lib/metadata/util/md5deep.rb +280 -0
- data/lib/metadata/util/win32/Win32Accounts.rb +764 -0
- data/lib/metadata/util/win32/Win32EventLog.rb +743 -0
- data/lib/metadata/util/win32/Win32Services.rb +86 -0
- data/lib/metadata/util/win32/Win32Software.rb +326 -0
- data/lib/metadata/util/win32/Win32System.rb +333 -0
- data/lib/metadata/util/win32/boot_info_win.rb +59 -0
- data/lib/metadata/util/win32/fleece_hives.rb +220 -0
- data/lib/metadata/util/win32/ms-registry.rb +650 -0
- data/lib/metadata/util/win32/peheader.rb +868 -0
- data/lib/metadata/util/win32/remote-registry.rb +142 -0
- data/lib/metadata/util/win32/system_path_win.rb +103 -0
- data/lib/metadata/util/win32/versioninfo.rb +17 -0
- data/manageiq-smartstate.gemspec +35 -0
- metadata +486 -0
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'binary_struct'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
require 'fs/ReiserFS/block'
|
5
|
+
require 'fs/ReiserFS/utils'
|
6
|
+
|
7
|
+
require 'rufus/lru'
|
8
|
+
|
9
|
+
module ReiserFS
|
10
|
+
SUPERBLOCK = BinaryStruct.new([
|
11
|
+
'V', 'num_blocks', # The number of blocks in the partition
|
12
|
+
'V', 'num_free_blocks', # The number of free blocks in the partition
|
13
|
+
'V', 'root_block', # The block number of the block containing the root node
|
14
|
+
'V', 'journal_block', # The block number of the block containing the first journal node
|
15
|
+
'V', 'journal_device', # Journal device number
|
16
|
+
'V', 'journal_original_size', # Original journal size
|
17
|
+
'V', 'journal_trans_max', # The maximum number of blocks in a transaction
|
18
|
+
'V', 'journal_magic', # Journal magic number
|
19
|
+
'V', 'journal_max_batch', # The maximum number of blocks in a transaction
|
20
|
+
'V', 'journal_max_commit_age', # Time in seconds of how old an asynchronous commit can be
|
21
|
+
'V', 'journal_max_trans_age', # Time in seconds of how old a transaction can be
|
22
|
+
'v', 'block_size', # Block size
|
23
|
+
'v', 'oid_max_size', # The maximum size of the object id array
|
24
|
+
'v', 'oid_current_size', # The current size of the object id array
|
25
|
+
'v', 'state', # State of the partition: valid (1) or error (2)
|
26
|
+
'a12', 'magic', # Magic String
|
27
|
+
'V', 'hash_code', # The hash function that is being used to sort names in a directory
|
28
|
+
'v', 'tree_height', # The current height of the disk tree
|
29
|
+
'v', 'bitmap_number', # The amount of bitmap blocks needed to address each block of the file system
|
30
|
+
'v', 'version', # The reiserfs version number
|
31
|
+
'a2', 'reserved', #
|
32
|
+
'V', 'inode_generation', # Number of the current inode generation
|
33
|
+
])
|
34
|
+
SUPERBLOCK_SIZE = SUPERBLOCK.size
|
35
|
+
SUPERBLOCK_OFFSET = 64 * 1024
|
36
|
+
|
37
|
+
class Superblock
|
38
|
+
# Default cache sizes.
|
39
|
+
DEF_LEAF_NODE_CACHE_SIZE = 50
|
40
|
+
|
41
|
+
attr_reader :rootBlock, :blockSize, :treeHeight, :bitmapNumber, :nblocksInBitmap
|
42
|
+
|
43
|
+
def initialize(stream)
|
44
|
+
raise "Nil stream" if stream.nil?
|
45
|
+
@stream = stream
|
46
|
+
|
47
|
+
# Seek, read & decode the superblock structure
|
48
|
+
@stream.seek(SUPERBLOCK_OFFSET)
|
49
|
+
@sb = SUPERBLOCK.decode(@stream.read(SUPERBLOCK_SIZE))
|
50
|
+
|
51
|
+
# Grab some quick facts & make sure there's nothing wrong. Tight qualification.
|
52
|
+
raise "Invalid Magic String: #{@sb['magic']}" unless isMagic?(@sb['magic'])
|
53
|
+
|
54
|
+
@totalBlocks = @sb['num_blocks']
|
55
|
+
@freeBlocks = @sb['num_free_blocks']
|
56
|
+
@rootBlock = @sb['root_block']
|
57
|
+
@treeHeight = @sb['tree_height']
|
58
|
+
@bitmapNumber = @sb['bitmap_number']
|
59
|
+
@version = @sb['version']
|
60
|
+
@state = @sb['state']
|
61
|
+
@blockSize = @sb['block_size']
|
62
|
+
@nblocksInBitmap = 8 * @blockSize
|
63
|
+
@oidMaxSize = @sb['oid_max_size']
|
64
|
+
@oidCurrentSize = @sb['oid_current_size']
|
65
|
+
@superBlock = SUPERBLOCK_OFFSET / @blockSize
|
66
|
+
|
67
|
+
@leaf_nodes = LruHash.new(DEF_LEAF_NODE_CACHE_SIZE)
|
68
|
+
end
|
69
|
+
|
70
|
+
def getBitmapBlock(bitmapNum)
|
71
|
+
if bitmapNum == 0
|
72
|
+
blockNum = @superBlock + 1
|
73
|
+
else
|
74
|
+
blockNum = bitmapNum * @nblocksInBitmap
|
75
|
+
end
|
76
|
+
|
77
|
+
readBlockRaw(blockNum)
|
78
|
+
end
|
79
|
+
|
80
|
+
def blockUsed?(blockNum)
|
81
|
+
bitmapNum = blockNum / @nblocksInBitmap
|
82
|
+
raise "Block out of Range" if bitmapNum >= @bitmapNumber
|
83
|
+
|
84
|
+
bitmapBlock = getBitmapBlock(bitmapNum)
|
85
|
+
bitmapOffset = blockNum % @nblocksInBitmap
|
86
|
+
bitmapByte = bitmapOffset / 8
|
87
|
+
bitmapByteOffset = bitmapOffset % 8
|
88
|
+
bits = bitmapBlock[bitmapByte, 1].unpack('B8')[0]
|
89
|
+
|
90
|
+
(bits[bitmapByteOffset, 1] == "1")
|
91
|
+
end
|
92
|
+
|
93
|
+
def readBlockRaw(blockNum)
|
94
|
+
raise "ReiserFS::SuperBlock >> blockNum is nil" if blockNum.nil?
|
95
|
+
|
96
|
+
@stream.seek(blockNum * @blockSize)
|
97
|
+
@stream.read(@blockSize)
|
98
|
+
end
|
99
|
+
|
100
|
+
def readBlock(blockNum)
|
101
|
+
# return nil if !blockUsed?(blockNum)
|
102
|
+
data = readBlockRaw(blockNum)
|
103
|
+
Block.new(data, blockNum)
|
104
|
+
end
|
105
|
+
|
106
|
+
def getLeafNodes(key)
|
107
|
+
key_s = Utils.dumpKey(key)
|
108
|
+
return @leaf_nodes[key_s] if @leaf_nodes.key?(key_s)
|
109
|
+
|
110
|
+
blocks = []
|
111
|
+
leaves = []
|
112
|
+
blocks << readBlock(@rootBlock)
|
113
|
+
blocks.each do |block|
|
114
|
+
next if block.nil?
|
115
|
+
|
116
|
+
if block.isLeaf?
|
117
|
+
leaves << block
|
118
|
+
next
|
119
|
+
end
|
120
|
+
|
121
|
+
block.findPointers(key).each do |pointer|
|
122
|
+
blocks << readBlock(pointer['block_number'])
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
@leaf_nodes[key_s] = leaves
|
127
|
+
end
|
128
|
+
|
129
|
+
# Returns free space on file system in bytes.
|
130
|
+
def freeBytes
|
131
|
+
@freeBlocks * @blockSize
|
132
|
+
end
|
133
|
+
|
134
|
+
private
|
135
|
+
|
136
|
+
def isMagic?(magic)
|
137
|
+
["ReIsErFs", "ReIsEr2Fs", "ReIsEr3Fs"].include?(magic.strip)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module ReiserFS
|
2
|
+
class Utils
|
3
|
+
def self.dumpKey(key, label = nil)
|
4
|
+
"#{label}:\t\{#{key['directory_id']},#{key['object_id']},#{key['offset']},#{key['type']}\}"
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.typeIsStat?(t)
|
8
|
+
t == 0
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.typeIsDirectory?(t)
|
12
|
+
return true if t == 500
|
13
|
+
return true if t == 3
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.typeIsDirect?(t)
|
18
|
+
return true if t == -1
|
19
|
+
false
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.typeIsIndirect?(t)
|
23
|
+
return true if t == -2
|
24
|
+
false
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.type2text(t)
|
28
|
+
case t
|
29
|
+
when -1
|
30
|
+
return 'direct'
|
31
|
+
when -2
|
32
|
+
return 'indirect'
|
33
|
+
when 0
|
34
|
+
return 'stat'
|
35
|
+
when 500
|
36
|
+
return 'directory'
|
37
|
+
when 555
|
38
|
+
return 'any'
|
39
|
+
else
|
40
|
+
raise "Unrecognized Type #{t}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.type2integer(t)
|
45
|
+
case t
|
46
|
+
when 0x20000000, 0xFFFFFFFF
|
47
|
+
return -1
|
48
|
+
|
49
|
+
when 0x10000000, 0xFFFFFFFE
|
50
|
+
return -2
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
t
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.getKeyDirectoryID(k)
|
58
|
+
k['directory_id']
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.getKeyObjectID(k)
|
62
|
+
k['object_id']
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.getKeyOffset(k)
|
66
|
+
k['offset']
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.getKeyType(k)
|
70
|
+
k['type']
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.compareKeys(a, b, fuzzy = true)
|
74
|
+
# Compare directory IDs
|
75
|
+
return (-1) if a['directory_id'] < b['directory_id']
|
76
|
+
return (+1) if a['directory_id'] > b['directory_id']
|
77
|
+
|
78
|
+
# Compare Object IDs
|
79
|
+
return (-1) if a['object_id'] < b['object_id']
|
80
|
+
return (+1) if a['object_id'] > b['object_id']
|
81
|
+
|
82
|
+
if fuzzy == false
|
83
|
+
# Compare Offsets
|
84
|
+
return (-1) if a['offset'] < b['offset']
|
85
|
+
return (+1) if a['offset'] > b['offset']
|
86
|
+
|
87
|
+
# Compare Types
|
88
|
+
return (-1) if a['type'] < b['type']
|
89
|
+
return (+1) if a['type'] > b['type']
|
90
|
+
end
|
91
|
+
|
92
|
+
0
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,192 @@
|
|
1
|
+
module VimDatastoreFS
|
2
|
+
def fs_init
|
3
|
+
# raise "Object dobj (#{dobj.class.to_s}) is not a MiqVimDataStore object" if !@dobj.kind_of? MiqVimDataStore
|
4
|
+
|
5
|
+
@fsType = "VimDatastoreFS"
|
6
|
+
@fsId = @dobj.name
|
7
|
+
@volName = @dobj.name
|
8
|
+
|
9
|
+
@rootStr = "[#{@dobj.name}]"
|
10
|
+
@dsHash = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def fs_dirEntries(p)
|
14
|
+
raise "Directory: #{p} does not exist" unless (fi = getFileInfo(p))
|
15
|
+
raise "#{p} is not a directory" unless fi["fileType"] =~ /.*FolderFileInfo/
|
16
|
+
(fi["dirEntries"])
|
17
|
+
end
|
18
|
+
|
19
|
+
def fs_fileExists?(p)
|
20
|
+
(getFileInfo(p).nil?)
|
21
|
+
end
|
22
|
+
|
23
|
+
def fs_fileFile?(p)
|
24
|
+
return false unless (fi = getFileInfo(p))
|
25
|
+
(fi["fileType"] != "FolderFileInfo")
|
26
|
+
end
|
27
|
+
|
28
|
+
def fs_fileDirectory?(p)
|
29
|
+
return false unless (fi = getFileInfo(p))
|
30
|
+
(fi["fileType"] =~ /.*FolderFileInfo/)
|
31
|
+
end
|
32
|
+
|
33
|
+
def fs_fileSize(p)
|
34
|
+
raise "File: #{p} does not exist" unless (fi = getFileInfo(p))
|
35
|
+
(fi["fileSize"])
|
36
|
+
end
|
37
|
+
|
38
|
+
# def fs_fileAtime(p)
|
39
|
+
# File.atime(p)
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# def fs_fileCtime(p)
|
43
|
+
# File.ctime(p)
|
44
|
+
# end
|
45
|
+
|
46
|
+
def fs_fileMtime(p)
|
47
|
+
raise "File: #{p} does not exist" unless (fi = getFileInfo(p))
|
48
|
+
(fi["modification"])
|
49
|
+
end
|
50
|
+
|
51
|
+
# def fs_fileSize_obj(fobj)
|
52
|
+
# fs_fileSize(fobj.filePath)
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
# def fs_fileAtime_obj(fobj)
|
56
|
+
# fobj.atime
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# def fs_fileCtime_obj(fobj)
|
60
|
+
# fobj.ctime
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# def fs_fileMtime_obj(fobj)
|
64
|
+
# fobj.mtime
|
65
|
+
# end
|
66
|
+
|
67
|
+
# def fs_fileOpen(p, mode="r")
|
68
|
+
# fread = fwrite = fcreate = ftruncate = fappend = false
|
69
|
+
# mode.delete!("b")
|
70
|
+
#
|
71
|
+
# case mode[0,1]
|
72
|
+
# when "r"
|
73
|
+
# fread = true
|
74
|
+
# fwrite = true if mode[-1,1] == "+"
|
75
|
+
# when "w"
|
76
|
+
# fwrite = true
|
77
|
+
# fcreate = true
|
78
|
+
# ftruncate = true
|
79
|
+
# fread = true if mode[-1,1] == "+"
|
80
|
+
# when "a"
|
81
|
+
# fwrite = true
|
82
|
+
# fcreate = true
|
83
|
+
# fappend = true
|
84
|
+
# fread = true if mode[-1,1] == "+"
|
85
|
+
# else
|
86
|
+
# raise "Unrecognized open mode: #{mode}"
|
87
|
+
# end
|
88
|
+
#
|
89
|
+
# fileRow = nil
|
90
|
+
# fi = getFileIndex(p)
|
91
|
+
#
|
92
|
+
# if fi < 0
|
93
|
+
# #
|
94
|
+
# # Should we create the file? If not, fail.
|
95
|
+
# #
|
96
|
+
# raise "#{p}: No such file" if !fcreate
|
97
|
+
#
|
98
|
+
# #
|
99
|
+
# # Create the file if it doesn't exist.
|
100
|
+
# #
|
101
|
+
# fileRow = create(p, TYPE_FILE)
|
102
|
+
# else
|
103
|
+
# fileRow = @vFentry[fi]
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
# fpos = 0
|
107
|
+
# fsize = @pSize.get(fileRow)
|
108
|
+
# if ftruncate && fsize != 0
|
109
|
+
# @pSize.set fileRow, 0
|
110
|
+
# @pData.set fileRow, Metakit::Bytes.new("", 0)
|
111
|
+
# elsif fappend
|
112
|
+
# fpos = fsize
|
113
|
+
# end
|
114
|
+
#
|
115
|
+
# return(MkFile.new(p, fileRow, fpos, fread, fwrite))
|
116
|
+
# end # def fs_fileOpen
|
117
|
+
|
118
|
+
# def fs_fileSeek(fobj, offset, whence)
|
119
|
+
# seekPos = 0
|
120
|
+
# case whence
|
121
|
+
# when IO::SEEK_CUR
|
122
|
+
# seekPos = filePos + amt
|
123
|
+
# when IO::SEEK_END
|
124
|
+
# seekPos = fs_fileSize_obj(fobj) + amt
|
125
|
+
# when IO::SEEK_SET
|
126
|
+
# seekPos = amt
|
127
|
+
# else
|
128
|
+
# raise "Invalid whence value: #{whence}"
|
129
|
+
# end
|
130
|
+
# raise "Invalid seek position: #{seekPos}" if seekPos < 0 || seekPos > fs_fileSize_obj(fobj)
|
131
|
+
#
|
132
|
+
# fobj.filePos = seekPos
|
133
|
+
# end
|
134
|
+
|
135
|
+
# def fs_fileRead(fobj, len)
|
136
|
+
# dataRef = @pData.ref(fobj.fileRow)
|
137
|
+
# rb = dataRef.access(fobj.filePos, len)
|
138
|
+
# fobj.filePos += rb.size
|
139
|
+
# return(rb.contents)
|
140
|
+
# end
|
141
|
+
|
142
|
+
# def fs_fileClose(fobj)
|
143
|
+
# return
|
144
|
+
# end
|
145
|
+
|
146
|
+
def dsPath(p)
|
147
|
+
return(p) if p[0, 1] == "["
|
148
|
+
(path2key(normalizePath(p)))
|
149
|
+
end
|
150
|
+
|
151
|
+
def fileInfo(p)
|
152
|
+
(dsHash[dsPath(p)])
|
153
|
+
end
|
154
|
+
|
155
|
+
def reset
|
156
|
+
@dsHash = nil
|
157
|
+
end
|
158
|
+
|
159
|
+
private
|
160
|
+
|
161
|
+
def path2key(p)
|
162
|
+
return(@rootStr) if p == "/"
|
163
|
+
(@rootStr + " " + p[1..-1])
|
164
|
+
end
|
165
|
+
|
166
|
+
def dsHash
|
167
|
+
return(@dsHash) if @dsHash
|
168
|
+
@dsHash = @dobj.dsHash(true)
|
169
|
+
(@dsHash)
|
170
|
+
end
|
171
|
+
|
172
|
+
def method_missing(methodId)
|
173
|
+
raise "#{self.class}: #{methodId.id2name} is not supported"
|
174
|
+
end
|
175
|
+
|
176
|
+
def getFileInfo(p)
|
177
|
+
k = path2key(p)
|
178
|
+
(dsHash[k])
|
179
|
+
end
|
180
|
+
|
181
|
+
# class DsFile
|
182
|
+
# attr_accessor :filePath, :fileRow, :filePos, :fileRead, :fileWrite
|
183
|
+
#
|
184
|
+
# def initialize(path, fileRow, fpos, fread, fwrite)
|
185
|
+
# @filePath = path
|
186
|
+
# @fileRow = fileRow
|
187
|
+
# @filePos = fpos
|
188
|
+
# @fileRead = fread
|
189
|
+
# @fileWrite = fwrite
|
190
|
+
# end
|
191
|
+
# end # class MkFile
|
192
|
+
end # module VimDatastoreFS
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Ext3
|
2
|
+
class AllocBitmap
|
3
|
+
def initialize(data)
|
4
|
+
raise "Ext3::AllocBitmap.initialize: Nil data" if data.nil?
|
5
|
+
@data = data
|
6
|
+
end
|
7
|
+
|
8
|
+
def isAllocated?(number)
|
9
|
+
getStatus(number)
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](number)
|
13
|
+
getStatus(number)
|
14
|
+
end
|
15
|
+
|
16
|
+
def dump
|
17
|
+
@data.hex_dump
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def getStatus(number)
|
23
|
+
byte, mask = index(number)
|
24
|
+
@data[byte] & mask == mask
|
25
|
+
end
|
26
|
+
|
27
|
+
def index(number)
|
28
|
+
byte, bit = number.divmod(8)
|
29
|
+
if byte > @data.size - 1
|
30
|
+
msg = "AllocBitmap#index: "
|
31
|
+
msg += "byte index #{byte} is out of range for data[0:#{@data.size - 1}]"
|
32
|
+
raise msg
|
33
|
+
end
|
34
|
+
mask = 128 >> bit
|
35
|
+
return byte, mask
|
36
|
+
end
|
37
|
+
end # class
|
38
|
+
end # module
|
@@ -0,0 +1,130 @@
|
|
1
|
+
module Ext3
|
2
|
+
class BlockPointersPath
|
3
|
+
DIRECT_SIZE = 12
|
4
|
+
SINGLE_INDIRECT_INDEX = 12
|
5
|
+
DOUBLE_INDIRECT_INDEX = 13
|
6
|
+
TRIPLE_INDIRECT_INDEX = 14
|
7
|
+
|
8
|
+
INDEX_TYPES = [:direct, :single_indirect, :double_indirect, :triple_indirect]
|
9
|
+
|
10
|
+
attr_reader :num_indirects, :path, :path_index, :block
|
11
|
+
|
12
|
+
def initialize(num_indirects, block = 0)
|
13
|
+
@num_indirects = num_indirects
|
14
|
+
@single_indirect_size = @num_indirects
|
15
|
+
@double_indirect_size = @num_indirects**2
|
16
|
+
@triple_indirect_size = @num_indirects**3
|
17
|
+
|
18
|
+
@single_indirect_base_size = DIRECT_SIZE
|
19
|
+
@double_indirect_base_size = DIRECT_SIZE + @single_indirect_size
|
20
|
+
@triple_indirect_base_size = DIRECT_SIZE + @single_indirect_size + @double_indirect_size
|
21
|
+
|
22
|
+
self.block = block
|
23
|
+
end
|
24
|
+
|
25
|
+
def direct_index; @path[0]; end
|
26
|
+
|
27
|
+
def single_indirect_index; @path[1]; end
|
28
|
+
|
29
|
+
def double_indirect_index; @path[2]; end
|
30
|
+
|
31
|
+
def triple_indirect_index; @path[3]; end
|
32
|
+
|
33
|
+
def index_type; INDEX_TYPES[@path_index]; end
|
34
|
+
|
35
|
+
def direct?; @path_index == 0; end
|
36
|
+
|
37
|
+
def single_indirect?; @path_index == 1; end
|
38
|
+
|
39
|
+
def double_indirect?; @path_index == 2; end
|
40
|
+
|
41
|
+
def triple_indirect?; @path_index == 3; end
|
42
|
+
|
43
|
+
def block=(value)
|
44
|
+
block_to_path(value)
|
45
|
+
@block = value
|
46
|
+
end
|
47
|
+
|
48
|
+
def succ!
|
49
|
+
succ_index(@path_index)
|
50
|
+
@block += 1
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_s
|
55
|
+
@path.inspect
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_a
|
59
|
+
@path.dup
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
|
64
|
+
def succ_index(index)
|
65
|
+
val = (@path[index] += 1)
|
66
|
+
if index == 0
|
67
|
+
raise RangeError if val > TRIPLE_INDIRECT_INDEX
|
68
|
+
|
69
|
+
if val >= SINGLE_INDIRECT_INDEX
|
70
|
+
@path_index += 1
|
71
|
+
@path[@path_index] = 0
|
72
|
+
end
|
73
|
+
elsif val == @num_indirects
|
74
|
+
@path[index] = 0
|
75
|
+
succ_index(index - 1)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def block_to_path(block)
|
80
|
+
raise ArgumentError, "block must be greater than or equal to 0" if block < 0
|
81
|
+
@path = [nil, nil, nil, nil]
|
82
|
+
|
83
|
+
if block < DIRECT_SIZE
|
84
|
+
@path[0] = block
|
85
|
+
@path_index = 0
|
86
|
+
return
|
87
|
+
end
|
88
|
+
block -= DIRECT_SIZE
|
89
|
+
|
90
|
+
if block < @single_indirect_size
|
91
|
+
@path[0] = SINGLE_INDIRECT_INDEX
|
92
|
+
@path[1] = block
|
93
|
+
@path_index = 1
|
94
|
+
return
|
95
|
+
end
|
96
|
+
block -= @single_indirect_size
|
97
|
+
|
98
|
+
if block < @double_indirect_size
|
99
|
+
@path[0] = DOUBLE_INDIRECT_INDEX
|
100
|
+
@path[1], @path[2] = block.divmod(@single_indirect_size)
|
101
|
+
@path_index = 2
|
102
|
+
return
|
103
|
+
end
|
104
|
+
block -= @double_indirect_size
|
105
|
+
|
106
|
+
if block < @triple_indirect_size
|
107
|
+
@path[0] = TRIPLE_INDIRECT_INDEX
|
108
|
+
@path[1], block = block.divmod(@double_indirect_size)
|
109
|
+
@path[2], @path[3] = block.divmod(@single_indirect_size)
|
110
|
+
@path_index = 3
|
111
|
+
return
|
112
|
+
end
|
113
|
+
|
114
|
+
raise ArgumentError, "block outside valid range"
|
115
|
+
end
|
116
|
+
|
117
|
+
def path_to_block
|
118
|
+
case @path_index
|
119
|
+
when 0
|
120
|
+
direct_index
|
121
|
+
when 1
|
122
|
+
@single_indirect_base_size + single_indirect_index
|
123
|
+
when 2
|
124
|
+
@double_indirect_base_size + (single_indirect_index * @single_indirect_size) + double_indirect_index
|
125
|
+
when 3
|
126
|
+
@triple_indirect_base_size + (single_indirect_index * @double_indirect_size) + (double_indirect_index * @single_indirect_size) + triple_indirect_index
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'fs/ext3/file_data'
|
2
|
+
require 'fs/ext3/directory_entry'
|
3
|
+
|
4
|
+
module Ext3
|
5
|
+
class Directory
|
6
|
+
ROOT_DIRECTORY = 2
|
7
|
+
|
8
|
+
def initialize(sb, inodeNum = ROOT_DIRECTORY)
|
9
|
+
raise "Ext3::Directory.initialize: Nil superblock" if sb.nil?
|
10
|
+
raise "Ext3::Directory.initialize: Nil inode number" if inodeNum.nil?
|
11
|
+
@sb = sb; @inodeNum = inodeNum
|
12
|
+
@inodeObj = sb.getInode(inodeNum)
|
13
|
+
@data = FileData.new(@inodeObj, @sb).read
|
14
|
+
end
|
15
|
+
|
16
|
+
def globNames
|
17
|
+
@ent_names ||= globEntries.keys.compact.sort
|
18
|
+
end
|
19
|
+
|
20
|
+
def findEntry(name, type = nil)
|
21
|
+
return nil unless globEntries.key?(name)
|
22
|
+
|
23
|
+
newEnt = @sb.isNewDirEnt?
|
24
|
+
globEntries[name].each do |ent|
|
25
|
+
ent.fileType = @sb.getInode(ent.inode).fileModeToFileType unless newEnt
|
26
|
+
return ent if ent.fileType == type || type.nil?
|
27
|
+
end
|
28
|
+
nil
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def globEntries
|
34
|
+
return @ents_by_name unless @ents_by_name.nil?
|
35
|
+
|
36
|
+
@ents_by_name = {}; p = 0
|
37
|
+
return @ents_by_name if @data.nil?
|
38
|
+
newEnt = @sb.isNewDirEnt?
|
39
|
+
loop do
|
40
|
+
break if p > @data.length - 4
|
41
|
+
break if @data[p, 4].nil?
|
42
|
+
de = DirectoryEntry.new(@data[p..-1], newEnt)
|
43
|
+
raise "Ext3::Directory.globEntries: DirectoryEntry length cannot be 0" if de.len == 0
|
44
|
+
@ents_by_name[de.name] ||= []
|
45
|
+
@ents_by_name[de.name] << de
|
46
|
+
p += de.len
|
47
|
+
end
|
48
|
+
@ents_by_name
|
49
|
+
end
|
50
|
+
end # class
|
51
|
+
end # module
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'binary_struct'
|
2
|
+
|
3
|
+
module Ext3
|
4
|
+
# ////////////////////////////////////////////////////////////////////////////
|
5
|
+
# // Data definitions.
|
6
|
+
|
7
|
+
DIR_ENTRY_ORIGINAL = BinaryStruct.new([
|
8
|
+
'L', 'inode_val', # Inode address of metadata.
|
9
|
+
'S', 'entry_len', # Length of entry.
|
10
|
+
'S', 'name_len', # Length of name.
|
11
|
+
])
|
12
|
+
# Here follows the name in ASCII.
|
13
|
+
SIZEOF_DIR_ENTRY_ORIGINAL = DIR_ENTRY_ORIGINAL.size
|
14
|
+
|
15
|
+
DIR_ENTRY_NEW = BinaryStruct.new([
|
16
|
+
'L', 'inode_val', # Inode address of metadata.
|
17
|
+
'S', 'entry_len', # Length of entry.
|
18
|
+
'C', 'name_len', # Length of name.
|
19
|
+
'C', 'file_type', # Type of file (see FT_ below).
|
20
|
+
])
|
21
|
+
# Here follows the name in ASCII.
|
22
|
+
SIZEOF_DIR_ENTRY_NEW = DIR_ENTRY_NEW.size
|
23
|
+
|
24
|
+
class DirectoryEntry
|
25
|
+
FT_UNKNOWN = 0
|
26
|
+
FT_FILE = 1
|
27
|
+
FT_DIRECTORY = 2
|
28
|
+
FT_CHAR = 3
|
29
|
+
FT_BLOCK = 4
|
30
|
+
FT_FIFO = 5
|
31
|
+
FT_SOCKET = 6
|
32
|
+
FT_SYM_LNK = 7
|
33
|
+
|
34
|
+
attr_reader :inode, :len, :name
|
35
|
+
attr_accessor :fileType
|
36
|
+
|
37
|
+
def initialize(data, new_entry = true)
|
38
|
+
raise "Ext3::DirectoryEntry.initialize: Nil directory entry data" if data.nil?
|
39
|
+
@isNew = new_entry
|
40
|
+
# Both entries are same size.
|
41
|
+
siz = SIZEOF_DIR_ENTRY_NEW
|
42
|
+
@de = @isNew ? DIR_ENTRY_NEW.decode(data[0..siz]) : DIR_ENTRY_ORIGINAL.decode(data[0..siz])
|
43
|
+
# If there's a name get it.
|
44
|
+
@name = data[siz, @de['name_len']] if @de['name_len'] != 0
|
45
|
+
@inode = @de['inode_val']
|
46
|
+
@len = @de['entry_len']
|
47
|
+
@fileType = @de['file_type'] if @isNew
|
48
|
+
end
|
49
|
+
|
50
|
+
def isDir?
|
51
|
+
@fileType == FT_DIRECTORY
|
52
|
+
end
|
53
|
+
|
54
|
+
def isSymLink?
|
55
|
+
@fileType == FT_SYM_LNK
|
56
|
+
end
|
57
|
+
|
58
|
+
def dump
|
59
|
+
out = "\#<#{self.class}:0x#{'%08x' % object_id}>\n"
|
60
|
+
out += "Inode : #{inode}\n"
|
61
|
+
out += "Len : #{len}\n"
|
62
|
+
out += "Name len: 0x#{'%04x' % @de['name_len']}\n"
|
63
|
+
out += "Type : #{fileType}\n" if @isNew
|
64
|
+
out += "Name : #{name}\n"
|
65
|
+
end
|
66
|
+
end # class
|
67
|
+
end # module
|