manageiq-smartstate 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (305) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +4 -0
  4. data/.rspec_ci +4 -0
  5. data/.travis.yml +15 -0
  6. data/Gemfile +9 -0
  7. data/LICENSE.txt +202 -0
  8. data/README.md +45 -0
  9. data/Rakefile +23 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/lib/MiqContainerGroup/MiqContainerGroup.rb +31 -0
  13. data/lib/MiqVm/MiqLocalVm.rb +50 -0
  14. data/lib/MiqVm/MiqRhevmVm.rb +179 -0
  15. data/lib/MiqVm/MiqVm.rb +355 -0
  16. data/lib/MiqVm/miq_azure_vm.rb +96 -0
  17. data/lib/MiqVm/miq_scvmm_vm.rb +38 -0
  18. data/lib/MiqVm/test/camcorder_fleece_test.rb +60 -0
  19. data/lib/MiqVm/test/localVm.rb +45 -0
  20. data/lib/MiqVm/test/partitionAlignmentCheck.rb +76 -0
  21. data/lib/MiqVm/test/remoteVm.rb +65 -0
  22. data/lib/MiqVm/test/rhevmNfsTest.rb +62 -0
  23. data/lib/MiqVm/test/rhevmNfsTest2.rb +66 -0
  24. data/lib/MiqVm/test/rhevmTest.rb +70 -0
  25. data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackCommon.rb +107 -0
  26. data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackImage.rb +67 -0
  27. data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackInstance.rb +182 -0
  28. data/lib/Scvmm/miq_hyperv_disk.rb +273 -0
  29. data/lib/Scvmm/miq_scvmm_parse_powershell.rb +75 -0
  30. data/lib/Scvmm/miq_scvmm_vm_ssa_info.rb +135 -0
  31. data/lib/Scvmm/test/miq_hyperv_disk_test.rb +33 -0
  32. data/lib/Scvmm/test/miq_scvmm_vm_ssa_info_test.rb +41 -0
  33. data/lib/VmLocalDiskAccess/test/localCfg.rb +97 -0
  34. data/lib/VolumeManager/LVM/logical_volume.rb +75 -0
  35. data/lib/VolumeManager/LVM/lv_segment.rb +43 -0
  36. data/lib/VolumeManager/LVM/lvm2disk.rb +158 -0
  37. data/lib/VolumeManager/LVM/parser.rb +138 -0
  38. data/lib/VolumeManager/LVM/physical_volume.rb +19 -0
  39. data/lib/VolumeManager/LVM/scanner.rb +156 -0
  40. data/lib/VolumeManager/LVM/thin/btree.rb +83 -0
  41. data/lib/VolumeManager/LVM/thin/constants.rb +86 -0
  42. data/lib/VolumeManager/LVM/thin/data_map.rb +44 -0
  43. data/lib/VolumeManager/LVM/thin/mapping_tree.rb +19 -0
  44. data/lib/VolumeManager/LVM/thin/space_maps.rb +58 -0
  45. data/lib/VolumeManager/LVM/thin/superblock.rb +136 -0
  46. data/lib/VolumeManager/LVM/thin.rb +6 -0
  47. data/lib/VolumeManager/LVM/volume_group.rb +97 -0
  48. data/lib/VolumeManager/LVM.rb +8 -0
  49. data/lib/VolumeManager/MiqLdm.rb +546 -0
  50. data/lib/VolumeManager/MiqLvm.rb +17 -0
  51. data/lib/VolumeManager/MiqNativeVolumeManager.rb +150 -0
  52. data/lib/VolumeManager/MiqVolumeManager.rb +277 -0
  53. data/lib/VolumeManager/VolMgrPlatformSupport.rb +18 -0
  54. data/lib/VolumeManager/VolMgrPlatformSupportLinux.rb +77 -0
  55. data/lib/VolumeManager/VolMgrPlatformSupportWin.rb +17 -0
  56. data/lib/VolumeManager/test/blockDevTest.rb +40 -0
  57. data/lib/VolumeManager/test/ldm.rb +97 -0
  58. data/lib/blackbox/VmBlackBox.rb +103 -0
  59. data/lib/blackbox/xmlStorage.rb +180 -0
  60. data/lib/db/MiqBdb/MiqBdb.rb +309 -0
  61. data/lib/db/MiqBdb/MiqBdbBtree.rb +219 -0
  62. data/lib/db/MiqBdb/MiqBdbHash.rb +199 -0
  63. data/lib/db/MiqBdb/MiqBdbPage.rb +159 -0
  64. data/lib/db/MiqBdb/MiqBdbUtil.rb +18 -0
  65. data/lib/db/MiqSqlite/MiqSqlite3.rb +330 -0
  66. data/lib/db/MiqSqlite/MiqSqlite3Cell.rb +167 -0
  67. data/lib/db/MiqSqlite/MiqSqlite3Page.rb +151 -0
  68. data/lib/db/MiqSqlite/MiqSqlite3Table.rb +124 -0
  69. data/lib/db/MiqSqlite/MiqSqlite3Util.rb +32 -0
  70. data/lib/disk/DiskProbe.rb +68 -0
  71. data/lib/disk/MiqDisk.rb +317 -0
  72. data/lib/disk/camcorder_test.rb +90 -0
  73. data/lib/disk/dos_mbr.img +0 -0
  74. data/lib/disk/modules/AzureBlobDisk.rb +101 -0
  75. data/lib/disk/modules/LocalDevMod.rb +47 -0
  76. data/lib/disk/modules/LocalDevProbe.rb +6 -0
  77. data/lib/disk/modules/MSCommon.rb +352 -0
  78. data/lib/disk/modules/MSVSDiffDisk.rb +91 -0
  79. data/lib/disk/modules/MSVSDiskProbe.rb +61 -0
  80. data/lib/disk/modules/MSVSDynamicDisk.rb +42 -0
  81. data/lib/disk/modules/MSVSFixedDisk.rb +45 -0
  82. data/lib/disk/modules/MiqLargeFile.rb +63 -0
  83. data/lib/disk/modules/MiqLargeFileWin32.rb +107 -0
  84. data/lib/disk/modules/QcowDisk.rb +692 -0
  85. data/lib/disk/modules/QcowDiskProbe.rb +34 -0
  86. data/lib/disk/modules/RawBlockIO.rb +116 -0
  87. data/lib/disk/modules/RawDisk.rb +45 -0
  88. data/lib/disk/modules/RawDiskProbe.rb +7 -0
  89. data/lib/disk/modules/RhevmDescriptor.rb +167 -0
  90. data/lib/disk/modules/RhevmDiskProbe.rb +52 -0
  91. data/lib/disk/modules/VMWareCowdDisk.rb +207 -0
  92. data/lib/disk/modules/VMWareDescriptor.rb +214 -0
  93. data/lib/disk/modules/VMWareDiskProbe.rb +74 -0
  94. data/lib/disk/modules/VMWareSparseDisk.rb +189 -0
  95. data/lib/disk/modules/VhdxDisk.rb +625 -0
  96. data/lib/disk/modules/VhdxDiskProbe.rb +46 -0
  97. data/lib/disk/modules/VixDiskMod.rb +54 -0
  98. data/lib/disk/modules/VixDiskProbe.rb +6 -0
  99. data/lib/disk/modules/miq_disk_cache.rb +135 -0
  100. data/lib/disk/modules/miq_dummy_disk.rb +41 -0
  101. data/lib/disk/modules/vhdx_bat_entry.rb +10 -0
  102. data/lib/disk/test.rb +66 -0
  103. data/lib/fs/MetakitFS/MetakitFS.rb +530 -0
  104. data/lib/fs/MetakitFS/test/Makefile +14 -0
  105. data/lib/fs/MetakitFS/test/MkCollectFiles.rb +165 -0
  106. data/lib/fs/MetakitFS/test/MkSelectFiles.rb +30 -0
  107. data/lib/fs/MetakitFS/test/collect_files.yaml +70 -0
  108. data/lib/fs/MetakitFS/test/init.rb +3 -0
  109. data/lib/fs/MetakitFS/test/mk2vmdk.rb +64 -0
  110. data/lib/fs/MetakitFS/test/mk4test.c +92 -0
  111. data/lib/fs/MetakitFS/test/mkFsTest.rb +113 -0
  112. data/lib/fs/MetakitFS/test/proto.rb +97 -0
  113. data/lib/fs/MiqFS/FsProbe.rb +39 -0
  114. data/lib/fs/MiqFS/MiqFS.rb +515 -0
  115. data/lib/fs/MiqFS/modules/AUFSProbe.rb +26 -0
  116. data/lib/fs/MiqFS/modules/Ext3.rb +305 -0
  117. data/lib/fs/MiqFS/modules/Ext3Probe.rb +25 -0
  118. data/lib/fs/MiqFS/modules/Ext4.rb +304 -0
  119. data/lib/fs/MiqFS/modules/Ext4Probe.rb +25 -0
  120. data/lib/fs/MiqFS/modules/Fat32.rb +318 -0
  121. data/lib/fs/MiqFS/modules/Fat32Probe.rb +30 -0
  122. data/lib/fs/MiqFS/modules/HFSProbe.rb +18 -0
  123. data/lib/fs/MiqFS/modules/Iso9660.rb +293 -0
  124. data/lib/fs/MiqFS/modules/Iso9660Probe.rb +18 -0
  125. data/lib/fs/MiqFS/modules/LocalFS.rb +105 -0
  126. data/lib/fs/MiqFS/modules/NTFS.rb +287 -0
  127. data/lib/fs/MiqFS/modules/NTFSProbe.rb +21 -0
  128. data/lib/fs/MiqFS/modules/NativeFS.rb +155 -0
  129. data/lib/fs/MiqFS/modules/ReFSProbe.rb +17 -0
  130. data/lib/fs/MiqFS/modules/RealFS.rb +79 -0
  131. data/lib/fs/MiqFS/modules/RealFSProbe.rb +6 -0
  132. data/lib/fs/MiqFS/modules/Reiser4Probe.rb +18 -0
  133. data/lib/fs/MiqFS/modules/ReiserFS.rb +315 -0
  134. data/lib/fs/MiqFS/modules/ReiserFSProbe.rb +42 -0
  135. data/lib/fs/MiqFS/modules/UnionFSProbe.rb +18 -0
  136. data/lib/fs/MiqFS/modules/WebDAV.rb +127 -0
  137. data/lib/fs/MiqFS/modules/WebDAVFile.rb +68 -0
  138. data/lib/fs/MiqFS/modules/XFS.rb +300 -0
  139. data/lib/fs/MiqFS/modules/XFSProbe.rb +26 -0
  140. data/lib/fs/MiqFS/modules/ZFSProbe.rb +18 -0
  141. data/lib/fs/MiqFS/test.rb +59 -0
  142. data/lib/fs/MiqFsUtil.rb +383 -0
  143. data/lib/fs/MiqMountManager.rb +209 -0
  144. data/lib/fs/MiqNativeMountManager.rb +101 -0
  145. data/lib/fs/MountManagerProbe.rb +29 -0
  146. data/lib/fs/ReiserFS/block.rb +209 -0
  147. data/lib/fs/ReiserFS/directory.rb +136 -0
  148. data/lib/fs/ReiserFS/directory_entry.rb +140 -0
  149. data/lib/fs/ReiserFS/file_data.rb +111 -0
  150. data/lib/fs/ReiserFS/superblock.rb +140 -0
  151. data/lib/fs/ReiserFS/utils.rb +95 -0
  152. data/lib/fs/VimDatastoreFS/VimDatastoreFS.rb +192 -0
  153. data/lib/fs/ext3/alloc_bitmap.rb +38 -0
  154. data/lib/fs/ext3/block_pointers_path.rb +130 -0
  155. data/lib/fs/ext3/directory.rb +51 -0
  156. data/lib/fs/ext3/directory_entry.rb +67 -0
  157. data/lib/fs/ext3/ex_attrib_header.rb +14 -0
  158. data/lib/fs/ext3/ex_attrib_name.rb +23 -0
  159. data/lib/fs/ext3/file_data.rb +130 -0
  160. data/lib/fs/ext3/group_descriptor_entry.rb +65 -0
  161. data/lib/fs/ext3/group_descriptor_table.rb +54 -0
  162. data/lib/fs/ext3/hash_tree_entry.rb +18 -0
  163. data/lib/fs/ext3/hash_tree_header.rb +15 -0
  164. data/lib/fs/ext3/inode.rb +228 -0
  165. data/lib/fs/ext3/posix_acl_entry.rb +29 -0
  166. data/lib/fs/ext3/posix_acl_header.rb +11 -0
  167. data/lib/fs/ext3/superblock.rb +406 -0
  168. data/lib/fs/ext3/test/tc_Ext3BlockPointersPath.rb +74 -0
  169. data/lib/fs/ext4/alloc_bitmap.rb +38 -0
  170. data/lib/fs/ext4/directory.rb +87 -0
  171. data/lib/fs/ext4/directory_entry.rb +77 -0
  172. data/lib/fs/ext4/ex_attrib_header.rb +14 -0
  173. data/lib/fs/ext4/ex_attrib_name.rb +23 -0
  174. data/lib/fs/ext4/extent.rb +35 -0
  175. data/lib/fs/ext4/extent_header.rb +40 -0
  176. data/lib/fs/ext4/extent_index.rb +33 -0
  177. data/lib/fs/ext4/group_descriptor_entry.rb +69 -0
  178. data/lib/fs/ext4/group_descriptor_table.rb +54 -0
  179. data/lib/fs/ext4/hash_tree_entry.rb +58 -0
  180. data/lib/fs/ext4/hash_tree_header.rb +35 -0
  181. data/lib/fs/ext4/inode.rb +465 -0
  182. data/lib/fs/ext4/posix_acl_entry.rb +29 -0
  183. data/lib/fs/ext4/posix_acl_header.rb +11 -0
  184. data/lib/fs/ext4/superblock.rb +412 -0
  185. data/lib/fs/fat32/boot_sect.rb +379 -0
  186. data/lib/fs/fat32/directory.rb +222 -0
  187. data/lib/fs/fat32/directory_entry.rb +540 -0
  188. data/lib/fs/fat32/file_data.rb +128 -0
  189. data/lib/fs/iso9660/boot_sector.rb +170 -0
  190. data/lib/fs/iso9660/directory.rb +90 -0
  191. data/lib/fs/iso9660/directory_entry.rb +147 -0
  192. data/lib/fs/iso9660/file_data.rb +78 -0
  193. data/lib/fs/iso9660/rock_ridge.rb +329 -0
  194. data/lib/fs/iso9660/util.rb +57 -0
  195. data/lib/fs/modules/LinuxMount.rb +300 -0
  196. data/lib/fs/modules/LinuxMountProbe.rb +29 -0
  197. data/lib/fs/modules/WinMount.rb +97 -0
  198. data/lib/fs/modules/WinMountProbe.rb +24 -0
  199. data/lib/fs/ntfs/attrib_attribute_list.rb +131 -0
  200. data/lib/fs/ntfs/attrib_bitmap.rb +26 -0
  201. data/lib/fs/ntfs/attrib_data.rb +74 -0
  202. data/lib/fs/ntfs/attrib_file_name.rb +110 -0
  203. data/lib/fs/ntfs/attrib_header.rb +194 -0
  204. data/lib/fs/ntfs/attrib_index_allocation.rb +19 -0
  205. data/lib/fs/ntfs/attrib_index_root.rb +247 -0
  206. data/lib/fs/ntfs/attrib_object_id.rb +40 -0
  207. data/lib/fs/ntfs/attrib_standard_information.rb +107 -0
  208. data/lib/fs/ntfs/attrib_type.rb +49 -0
  209. data/lib/fs/ntfs/attrib_volume_information.rb +53 -0
  210. data/lib/fs/ntfs/attrib_volume_name.rb +31 -0
  211. data/lib/fs/ntfs/boot_sect.rb +253 -0
  212. data/lib/fs/ntfs/data_run.rb +358 -0
  213. data/lib/fs/ntfs/directory_index_node.rb +114 -0
  214. data/lib/fs/ntfs/index_node_header.rb +69 -0
  215. data/lib/fs/ntfs/index_record_header.rb +85 -0
  216. data/lib/fs/ntfs/mft_entry.rb +288 -0
  217. data/lib/fs/ntfs/utils.rb +43 -0
  218. data/lib/fs/test/camcorder_fs_test.rb +108 -0
  219. data/lib/fs/test/collect_files_direct.yaml +22 -0
  220. data/lib/fs/test/collect_files_in.yaml +24 -0
  221. data/lib/fs/test/collect_files_in_nc.yaml +22 -0
  222. data/lib/fs/test/collect_files_out.yaml +6 -0
  223. data/lib/fs/test/collect_files_rm.yaml +6 -0
  224. data/lib/fs/test/copyTest.rb +126 -0
  225. data/lib/fs/test/fsTest.rb +87 -0
  226. data/lib/fs/test/updateTest.rb +184 -0
  227. data/lib/fs/xfs/allocation_group.rb +160 -0
  228. data/lib/fs/xfs/bmap_btree_block.rb +125 -0
  229. data/lib/fs/xfs/bmap_btree_record.rb +80 -0
  230. data/lib/fs/xfs/bmap_btree_root_node.rb +72 -0
  231. data/lib/fs/xfs/directory.rb +133 -0
  232. data/lib/fs/xfs/directory2_data_header.rb +27 -0
  233. data/lib/fs/xfs/directory3_data_header.rb +34 -0
  234. data/lib/fs/xfs/directory_block_tail.rb +22 -0
  235. data/lib/fs/xfs/directory_data_header.rb +46 -0
  236. data/lib/fs/xfs/directory_entry.rb +106 -0
  237. data/lib/fs/xfs/inode.rb +532 -0
  238. data/lib/fs/xfs/inode_map.rb +100 -0
  239. data/lib/fs/xfs/short_form_directory_entry.rb +91 -0
  240. data/lib/fs/xfs/short_form_header.rb +44 -0
  241. data/lib/fs/xfs/superblock.rb +556 -0
  242. data/lib/lib/tasks/azure.rake +52 -0
  243. data/lib/manageiq/smartstate/version.rb +5 -0
  244. data/lib/manageiq/smartstate.rb +7 -0
  245. data/lib/manageiq-smartstate.rb +1 -0
  246. data/lib/metadata/MIQExtract/MIQExtract.rb +297 -0
  247. data/lib/metadata/MIQExtract/test/extractTest.rb +41 -0
  248. data/lib/metadata/MIQExtract/test/full_extract_test.rb +68 -0
  249. data/lib/metadata/ScanProfile/HostScanItem.rb +4 -0
  250. data/lib/metadata/ScanProfile/HostScanProfile.rb +4 -0
  251. data/lib/metadata/ScanProfile/HostScanProfiles.rb +41 -0
  252. data/lib/metadata/ScanProfile/ScanItemBase.rb +63 -0
  253. data/lib/metadata/ScanProfile/ScanProfileBase.rb +51 -0
  254. data/lib/metadata/ScanProfile/ScanProfilesBase.rb +60 -0
  255. data/lib/metadata/ScanProfile/VmScanItem.rb +4 -0
  256. data/lib/metadata/ScanProfile/VmScanProfile.rb +4 -0
  257. data/lib/metadata/ScanProfile/VmScanProfiles.rb +38 -0
  258. data/lib/metadata/ScanProfile/modules/HostScanItemFile.rb +51 -0
  259. data/lib/metadata/ScanProfile/modules/HostScanItemNteventlog.rb +84 -0
  260. data/lib/metadata/ScanProfile/modules/VmScanItemFile.rb +39 -0
  261. data/lib/metadata/ScanProfile/modules/VmScanItemNteventlog.rb +34 -0
  262. data/lib/metadata/ScanProfile/modules/VmScanItemRegistry.rb +64 -0
  263. data/lib/metadata/VMMount/VMMount.rb +81 -0
  264. data/lib/metadata/VMMount/VMPlatformMount.rb +18 -0
  265. data/lib/metadata/VMMount/VMPlatformMountLinux.rb +75 -0
  266. data/lib/metadata/VMMount/VMPlatformMountWin.rb +13 -0
  267. data/lib/metadata/VmConfig/GetNativeCfg.rb +45 -0
  268. data/lib/metadata/VmConfig/VmConfig.rb +947 -0
  269. data/lib/metadata/VmConfig/cfgConfig.rb +45 -0
  270. data/lib/metadata/VmConfig/ovfConfig.rb +99 -0
  271. data/lib/metadata/VmConfig/test/GetVMwareCfgTest.rb +40 -0
  272. data/lib/metadata/VmConfig/vmcConfig.rb +116 -0
  273. data/lib/metadata/VmConfig/vmtxConfig.rb +4 -0
  274. data/lib/metadata/VmConfig/vmxConfig.rb +162 -0
  275. data/lib/metadata/VmConfig/xmlConfig.rb +79 -0
  276. data/lib/metadata/VmConfig/xmlMsHyperVConfig.rb +41 -0
  277. data/lib/metadata/linux/InitProcHash.rb +632 -0
  278. data/lib/metadata/linux/LinuxInitProcs.rb +142 -0
  279. data/lib/metadata/linux/LinuxOSInfo.rb +237 -0
  280. data/lib/metadata/linux/LinuxPackages.rb +209 -0
  281. data/lib/metadata/linux/LinuxSystemd.rb +130 -0
  282. data/lib/metadata/linux/LinuxUsers.rb +289 -0
  283. data/lib/metadata/linux/LinuxUtils.rb +197 -0
  284. data/lib/metadata/linux/MiqConaryPackages.rb +41 -0
  285. data/lib/metadata/linux/MiqRpmPackages.rb +160 -0
  286. data/lib/metadata/linux/test/Name +0 -0
  287. data/lib/metadata/linux/test/Packages +0 -0
  288. data/lib/metadata/linux/test/rpoTest.rb +5 -0
  289. data/lib/metadata/linux/test/tc_LinuxUtils.rb +4157 -0
  290. data/lib/metadata/util/event_log_filter.rb +61 -0
  291. data/lib/metadata/util/md5deep.rb +280 -0
  292. data/lib/metadata/util/win32/Win32Accounts.rb +764 -0
  293. data/lib/metadata/util/win32/Win32EventLog.rb +743 -0
  294. data/lib/metadata/util/win32/Win32Services.rb +86 -0
  295. data/lib/metadata/util/win32/Win32Software.rb +326 -0
  296. data/lib/metadata/util/win32/Win32System.rb +333 -0
  297. data/lib/metadata/util/win32/boot_info_win.rb +59 -0
  298. data/lib/metadata/util/win32/fleece_hives.rb +220 -0
  299. data/lib/metadata/util/win32/ms-registry.rb +650 -0
  300. data/lib/metadata/util/win32/peheader.rb +868 -0
  301. data/lib/metadata/util/win32/remote-registry.rb +142 -0
  302. data/lib/metadata/util/win32/system_path_win.rb +103 -0
  303. data/lib/metadata/util/win32/versioninfo.rb +17 -0
  304. data/manageiq-smartstate.gemspec +35 -0
  305. metadata +486 -0
@@ -0,0 +1,556 @@
1
+ # encoding: US-ASCII
2
+
3
+ require 'binary_struct'
4
+ require 'util/miq-uuid'
5
+ require 'stringio'
6
+ require 'memory_buffer'
7
+ require 'fs/xfs/allocation_group'
8
+ require 'fs/xfs/inode_map'
9
+ require 'fs/xfs/inode'
10
+
11
+ require 'rufus/lru'
12
+
13
+ module XFS
14
+ # ////////////////////////////////////////////////////////////////////////////
15
+ # // Data definitions. Linux 2.6.2 from Fedora Core 6.
16
+
17
+ SUPERBLOCK = BinaryStruct.new([
18
+ 'L>', 'magic_num', # magic number of the filesystem
19
+ 'L>', 'block_size', # size of a basic unit of space allocation in bytes
20
+ 'Q>', 'data_blocks', # total Number of blocks available for data and metadata
21
+ 'Q>', 'realtime_blocks', # number of blocks on the real-time disk device
22
+ 'Q>', 'realtime_extents', # Number of extents on the real-time disk device
23
+ 'a16', 'uuid', # UUID for the filesystem
24
+ 'Q>', 'log_start', # first block for the journal log if internal (0 if external)
25
+ 'Q>', 'root_inode_num', # root inode number for the filesystem
26
+ 'Q>', 'bitmap_inode_num', # bitmap inode number for real-time extents
27
+ 'Q>', 'summary_inode_num', # summary inode number for real-time bitmap
28
+ 'L>', 'realtime_ext_size', # real-time extent size in blocks
29
+ 'L>', 'ag_blocks', # size of each allocation group in blocks
30
+ 'L>', 'ag_count', # number of allocation groups in the filesystem
31
+ 'L>', 'bitmap_blocks', # number of real-time bitmap blocks
32
+ 'L>', 'log_blocks', # number of blocks for the journaling log
33
+ 'S>', 'version_number', # Filesystem version number
34
+ 'S>', 'sector_size', # underlying disk sector size in bytes
35
+ 'S>', 'inode_size', # size of the inode in bytes
36
+ 'S>', 'inodes_per_blk', # number of inodes per block
37
+ 'a12', 'fs_name', # name for the filesystem
38
+ 'C', 'block_size_log', # log base 2 of block_size
39
+ 'C', 'sector_size_log', # log base 2 of sector_size
40
+ 'C', 'inode_size_log', # log base 2 of inode_size
41
+ 'C', 'inodes_per_blk_log', # log base 2 of inodes_per_blk
42
+ 'C', 'ag_blocks_log', # log base 2 of ag_blocks (rounded up)
43
+ 'C', 'rt_ext_size_log', # log base 2 of realtime_ext_size
44
+ 'C', 'in_progress', # flag specifying that the filesystem is being created
45
+ 'C', 'inode_max_pct', # maximum percentage of filesystem space that can be used for inodes
46
+ 'Q>', 'inode_count', # global count for number of inodes allocated on the filesystem
47
+ 'Q>', 'inode_free_count', # global count of free inodes on the filesystem.
48
+ 'Q>', 'free_data_blocks', # global count of free data blocks on the filesystem
49
+ 'Q>', 'free_rt_extents', # global count of free real-time extents on the filesystem
50
+ 'Q>', 'user_quota_ino', # inode number for user quotas
51
+ 'Q>', 'group_quota_ino', # inode number for group quotas
52
+ 'S>', 'quota_flags', # quota flags
53
+ 'C', 'misc_flags', # miscellaneous flags
54
+ 'C', 'shared_vers_no', # shared version number
55
+ 'L>', 'inode_alignment', # inode chunk alignment in blocks
56
+ 'L>', 'stripe_unit', # underlying stripe or raid unit in blocks
57
+ 'L>', 'stripe_width', # underlying stripe or raid width in blocks
58
+ 'C', 'dir_block_log', # log base 2 multiplier that determines the
59
+ # granularity of directory block allocations in fsblocks
60
+ 'C', 'log_sect_size_log', # log base 2 of the log subvolume's sector size
61
+ 'S>', 'log_sector_size', # the log's sector size in bytes if the filesystem uses an external log device
62
+ 'L>', 'log_stripe_unit_sz', # the log device's stripe or raid unit size.
63
+ 'L>', 'features_2', # add'l version flags if XFS_SUPERBLOCK_VERSION_MOREBITSBIT is set in version_number
64
+ # version 5 superblock fields start here
65
+ 'L>', 'features_compat',
66
+ 'L>', 'features_ro_compat',
67
+ 'L>', 'features_incompat',
68
+ 'L>', 'features_log_incompat',
69
+ 'L>', 'superblock_crc', # superblock crc
70
+ 'L>', 'padding',
71
+ 'Q>', 'proj_quota_ino', # inode number for project quotas
72
+ 'q>', 'last_write_seq', # last write sequence
73
+ ])
74
+
75
+ SUPERBLOCK_SIZE = 512
76
+
77
+ # ////////////////////////////////////////////////////////////////////////////
78
+ # // Class.
79
+
80
+ class Superblock
81
+ #
82
+ # Block I/O parameterization. A basic block (BB) is the lowest size of
83
+ # filesystem allocation, and must equal 512. Length units given to bio
84
+ # routines are in BB's.
85
+ #
86
+ BBSHIFT = 9
87
+ BBSIZE = 1 << BBSHIFT
88
+ XFS_INODE_BIG_CLUSTER_SIZE = 8192
89
+ XFS_NBBY = 8 # number of bits in a byte
90
+ XFS_INODES_PER_CHUNK = XFS_NBBY * 8
91
+ XFS_DINODE_MIN_LOG = 8
92
+ XFS_DINODE_MIN_SIZE = 1 << XFS_DINODE_MIN_LOG
93
+ DEF_BLOCK_CACHE_SIZE = 500
94
+ DEF_CLUSTER_CACHE_SIZE = 500
95
+ DEF_INODE_CACHE_SIZE = 500
96
+ DEF_AG_CACHE_SIZE = 10
97
+ XFS_SUPERBLOCK_MAGIC = 0x58465342
98
+ XFS_SUPERBLOCK_VERSION_1 = 1 # 5.3, 6.0.1, 6.1 */
99
+ XFS_SUPERBLOCK_VERSION_2 = 2 # 6.2 - attributes */
100
+ XFS_SUPERBLOCK_VERSION_3 = 3 # 6.2 - new inode version */
101
+ XFS_SUPERBLOCK_VERSION_4 = 4 # 6.2+ - bitmask version */
102
+ XFS_SUPERBLOCK_VERSION_5 = 5 # CRC enabled filesystem */
103
+ XFS_SUPERBLOCK_VERSION_NUMBITS = 0x000f
104
+ XFS_SUPERBLOCK_VERSION_ALLFBITS = 0xfff0
105
+ XFS_SUPERBLOCK_VERSION_SASHFBITS = 0xf000
106
+ XFS_SUPERBLOCK_VERSION_REALFBITS = 0x0ff0
107
+ XFS_SUPERBLOCK_VERSION_ATTRBIT = 0x0010
108
+ XFS_SUPERBLOCK_VERSION_NLINKBIT = 0x0020
109
+ XFS_SUPERBLOCK_VERSION_QUOTABIT = 0x0040
110
+ XFS_SUPERBLOCK_VERSION_ALIGNBIT = 0x0080
111
+ XFS_SUPERBLOCK_VERSION_DALIGNBIT = 0x0100
112
+ XFS_SUPERBLOCK_VERSION_SHAREDBIT = 0x0200
113
+ XFS_SUPERBLOCK_VERSION_LOGV2BIT = 0x0400
114
+ XFS_SUPERBLOCK_VERSION_SECTORBIT = 0x0800
115
+ XFS_SUPERBLOCK_VERSION_EXTFLGBIT = 0x1000
116
+ XFS_SUPERBLOCK_VERSION_DIRV2BIT = 0x2000
117
+ XFS_SUPERBLOCK_VERSION_BORGBIT = 0x4000 # ASCII only case-insens. */
118
+ XFS_SUPERBLOCK_VERSION_MOREBITSBIT = 0x8000
119
+
120
+ XFS_SUPERBLOCK_VERSION_OKSASHFBITS = XFS_SUPERBLOCK_VERSION_EXTFLGBIT | XFS_SUPERBLOCK_VERSION_DIRV2BIT | XFS_SUPERBLOCK_VERSION_BORGBIT
121
+
122
+ XFS_SUPERBLOCK_VERSION_OKREALFBITS = XFS_SUPERBLOCK_VERSION_ATTRBIT | XFS_SUPERBLOCK_VERSION_NLINKBIT | XFS_SUPERBLOCK_VERSION_QUOTABIT | XFS_SUPERBLOCK_VERSION_ALIGNBIT | XFS_SUPERBLOCK_VERSION_DALIGNBIT | XFS_SUPERBLOCK_VERSION_SHAREDBIT | XFS_SUPERBLOCK_VERSION_LOGV2BIT | XFS_SUPERBLOCK_VERSION_SECTORBIT | XFS_SUPERBLOCK_VERSION_MOREBITSBIT
123
+
124
+ XFS_SUPERBLOCK_VERSION_OKREALBITS = XFS_SUPERBLOCK_VERSION_NUMBITS | XFS_SUPERBLOCK_VERSION_OKREALFBITS |
125
+ XFS_SUPERBLOCK_VERSION_OKSASHFBITS
126
+
127
+ #
128
+ # There are two words to hold XFS "feature" bits: the original
129
+ # word, version_number, and features2. Whenever a bit is set in
130
+ # features2, the feature bit XFS_SUPERBLOCK_VERSION_MOREBITSBIT must be set.
131
+ #
132
+ # These defines represent bits in sb_features2.
133
+ #
134
+ XFS_SUPERBLOCK_VERSION2_REALFBITS = 0x00ffffff # Mask: features */
135
+ XFS_SUPERBLOCK_VERSION2_RESERVED1BIT = 0x00000001
136
+ XFS_SUPERBLOCK_VERSION2_LAZYSBCOUNTBIT = 0x00000002 # Superblk counters */
137
+ XFS_SUPERBLOCK_VERSION2_RESERVED4BIT = 0x00000004
138
+ XFS_SUPERBLOCK_VERSION2_ATTR2BIT = 0x00000008 # Inline attr rework */
139
+ XFS_SUPERBLOCK_VERSION2_PARENTBIT = 0x00000010 # parent pointers */
140
+ XFS_SUPERBLOCK_VERSION2_PROJID32BIT = 0x00000080 # 32 bit project id */
141
+ XFS_SUPERBLOCK_VERSION2_CRCBIT = 0x00000100 # metadata CRCs */
142
+ XFS_SUPERBLOCK_VERSION2_FTYPE = 0x00000200 # inode type in dir */
143
+
144
+ XFS_SUPERBLOCK_VERSION2_OKREALFBITS = XFS_SUPERBLOCK_VERSION2_LAZYSBCOUNTBIT |
145
+ XFS_SUPERBLOCK_VERSION2_ATTR2BIT | XFS_SUPERBLOCK_VERSION2_PROJID32BIT | XFS_SUPERBLOCK_VERSION2_FTYPE
146
+ XFS_SUPERBLOCK_VERSION2_OKSASHFBITS = 0
147
+ XFS_SUPERBLOCK_VERSION2_OKREALBITS = XFS_SUPERBLOCK_VERSION2_OKREALFBITS | XFS_SUPERBLOCK_VERSION2_OKSASHFBITS
148
+
149
+ XFS_SB_FEAT_INCOMPAT_FTYPE = 1
150
+
151
+ # /////////////////////////////////////////////////////////////////////////
152
+ # // initialize
153
+ attr_reader :groups_count, :filesystem_id, :stream, :block_count, :inode_count, :volume_name
154
+ attr_reader :sector_size, :block_size, :root_inode, :inode_size, :sb
155
+ attr_reader :ialloc_inos, :ialloc_blks, :agno, :agino, :agbno, :allocation_group_count
156
+
157
+ def validate_sb(agno)
158
+ # Grab some quick facts & make sure there's nothing wrong. Tight qualification.
159
+ if @sb['magic_num'] != XFS_SUPERBLOCK_MAGIC
160
+ raise "XFS::Superblock.initialize: Invalid magic number=[#{@sb['magic_num']}] in AG #{agno}"
161
+ end
162
+ unless good_version?
163
+ $log.warn "XFS::Superblock.initialize: Bad Superblock version # #{@sb['version_number']} in AG #{agno}"
164
+ $log.warn "Attempting to access filesystem"
165
+ end
166
+ if agno == 0 && @sb['in_progress'] != 0
167
+ $log.warn "XFS::Superblock.initialize: mkfs not completed successfully. Attempting to access filesystem"
168
+ end
169
+ end
170
+
171
+ def initialize(stream, agno = 0)
172
+ raise "XFS::Superblock.initialize: Nil stream" if stream.nil?
173
+ @stream = stream
174
+
175
+ #
176
+ # Seek, read & decode the superblock structure
177
+ # TODO: FIGURE OUT OFFSET OF SUPERBLOCK for the specified AG number.
178
+ # TODO: @stream.seek(SUPERBLOCK_OFFSET)
179
+ #
180
+ @sb = SUPERBLOCK.decode(@stream.read(SUPERBLOCK_SIZE))
181
+ validate_sb(agno)
182
+
183
+ @block_size = @sb['block_size']
184
+
185
+ @block_cache = LruHash.new(DEF_BLOCK_CACHE_SIZE)
186
+ @cluster_cache = LruHash.new(DEF_CLUSTER_CACHE_SIZE)
187
+ @inode_cache = LruHash.new(DEF_INODE_CACHE_SIZE)
188
+ @allocation_group_cache = LruHash.new(DEF_AG_CACHE_SIZE)
189
+
190
+ # expose for testing.
191
+ @block_count = @sb['data_blocks']
192
+ @inode_count = @sb['inode_count']
193
+ @inode_size = @sb['inode_size']
194
+ @root_inode = @sb['root_inode_num']
195
+
196
+ # Inode file size members can't be trusted, so use sector count instead.
197
+ # MiqDisk exposes block_size, which for our purposes is sector_size.
198
+ @sector_size = @stream.blockSize
199
+
200
+ # Preprocess some members.
201
+ @sb['fs_name'].delete!("\000")
202
+ @allocation_group_count = @sb['ag_count']
203
+ @allocation_group_blocks = @sb['ag_blocks']
204
+ @groups_count, @last_group_blocks = @sb['data_blocks'].divmod(@allocation_group_blocks)
205
+ @groups_count += 1 if @last_group_blocks > 0
206
+ @filesystem_id = UUIDTools::UUID.parse_raw(@sb['uuid'])
207
+ @volume_name = @sb['fs_name']
208
+ @ialloc_inos = (@sb['inodes_per_blk']..XFS_INODES_PER_CHUNK).max
209
+ @ialloc_blks = @ialloc_inos >> @sb['inodes_per_blk_log']
210
+ end
211
+
212
+ # ////////////////////////////////////////////////////////////////////////////
213
+ # // Class helpers & accessors.
214
+
215
+ def b_to_bb(bytes)
216
+ (bytes + BBSIZE - 1) >> BBSHIFT
217
+ end
218
+
219
+ def b_to_bbt(bytes)
220
+ bytes >> BBSHIFT
221
+ end
222
+
223
+ def bb_to_b(bbs)
224
+ bbs << BBSHIFT
225
+ end
226
+
227
+ def sb_version_num
228
+ @sb['version_number'] & XFS_SUPERBLOCK_VERSION_NUMBITS
229
+ end
230
+
231
+ def incompatible_feature?(feature)
232
+ (@sb['features_incompat'] & feature) != 0
233
+ end
234
+
235
+ def version_has_more_bits?
236
+ version_has_crc? || (@sb['version_number'] & XFS_SUPERBLOCK_VERSION_MOREBITSBIT != 0)
237
+ end
238
+
239
+ def version_has_ftype?
240
+ (version_has_crc? && incompatible_feature?(XFS_SB_FEAT_INCOMPAT_FTYPE)) ||
241
+ (version_has_more_bits? && ((@sb['features_2'] & XFS_SUPERBLOCK_VERSION2_FTYPE) != 0))
242
+ end
243
+
244
+ def version_has_crc?
245
+ sb_version_num == XFS_SUPERBLOCK_VERSION_5
246
+ end
247
+
248
+ def fragment_size
249
+ 1024 << @sb['fragment_size']
250
+ end
251
+
252
+ def inode_size
253
+ @sb['inode_size']
254
+ end
255
+
256
+ def free_bytes
257
+ @sb['free_data_blocks'] * @block_size
258
+ end
259
+
260
+ def ino_mask(k)
261
+ ((1 << k) - 1) & 0xffffffff
262
+ end
263
+
264
+ def mask32lo(n)
265
+ (((1 << n) & 0xffffffff) - 1) & 0xffffffff
266
+ end
267
+
268
+ def fsb_to_b(fsbno)
269
+ fsbno << @sb['block_size_log']
270
+ end
271
+
272
+ def fsb_to_bb(fsbno)
273
+ fsbno << (@sb['block_size_log'] - BBSHIFT)
274
+ end
275
+
276
+ def fsb_to_agno(fsbno)
277
+ fsbno >> @sb['ag_blocks_log']
278
+ end
279
+
280
+ def fsb_to_agbno(fsbno)
281
+ fsbno & mask32lo(@sb['ag_blocks_log'])
282
+ end
283
+
284
+ def fsb_to_daddr(fsbno)
285
+ agb_to_daddr(fsb_to_agno(fsbno), fsb_to_agbno(fsbno))
286
+ end
287
+
288
+ def fss_to_bb(sectno)
289
+ sectno << (@sb['sector_size_log'] - BBSHIFT)
290
+ end
291
+
292
+ def b_to_fsbt(byte)
293
+ byte >> @sb['block_size_log']
294
+ end
295
+
296
+ def ino_to_agno(inode)
297
+ inode >> ino_agino_bits
298
+ end
299
+
300
+ def ino_to_agino(inode)
301
+ inode & ino_mask(ino_agino_bits)
302
+ end
303
+
304
+ def ino_to_agbno(inode)
305
+ inode >> ino_offset_bits & ino_mask(ino_agbno_bits)
306
+ end
307
+
308
+ def ino_to_offset(inode)
309
+ inode & ino_mask(ino_offset_bits)
310
+ end
311
+
312
+ def agb_to_fsb(agno, agbno)
313
+ agno << @sb['ag_blocks_log'] | agbno
314
+ end
315
+
316
+ def agbno_to_real_block(agno, agbno)
317
+ agno * @allocation_group_blocks + agbno
318
+ end
319
+
320
+ def agb_to_daddr(agno, agbno)
321
+ fsb_to_bb(agno * @allocation_group_blocks + agbno)
322
+ end
323
+
324
+ def agf_daddr
325
+ 1 << (@sb['sector_size_log'] - BBSHIFT)
326
+ end
327
+
328
+ def agi_daddr
329
+ 2 << (@sb['sector_size_log'] - BBSHIFT)
330
+ end
331
+
332
+ def agfl_daddr
333
+ 3 << (@sb['sector_size_log'] - BBSHIFT)
334
+ end
335
+
336
+ def ag_daddr(agno, d)
337
+ agb_to_daddr(agno, 0) + d
338
+ end
339
+
340
+ def ino_to_fsb(inode)
341
+ agb_to_fsb(ino_to_agno(inode), ino_to_agbno(inode))
342
+ end
343
+
344
+ def agino_to_ino(agno, inode)
345
+ agno << ino_agino_bits | inode
346
+ end
347
+
348
+ def agino_to_agbno(inode)
349
+ inode >> ino_offset_bits
350
+ end
351
+
352
+ def agino_to_offset(inode)
353
+ inode & ino_mask(ino_offset_bits)
354
+ end
355
+
356
+ def ino_offset_bits
357
+ @sb['inodes_per_blk_log']
358
+ end
359
+
360
+ def ino_agbno_bits
361
+ @sb['ag_blocks_log']
362
+ end
363
+
364
+ def ino_agino_bits
365
+ @sb['inodes_per_blk_log'] + @sb['ag_blocks_log']
366
+ end
367
+
368
+ def offbno_to_agino(block, offset)
369
+ (block << @sb['inodes_per_blk_log']) | offset
370
+ end
371
+
372
+ def version_has_align?
373
+ (sb_version_num == XFS_SUPERBLOCK_VERSION_5) ||
374
+ ((sb_version_num >= XFS_SUPERBLOCK_VERSION_4) &&
375
+ ((@sb['version_number'] & XFS_SUPERBLOCK_VERSION_ALIGNBIT) != 0))
376
+ end
377
+
378
+ def inode_align_mask
379
+ if version_has_align? &&
380
+ @sb['inode_alignment'] >> b_to_fsbt(XFS_INODE_BIG_CLUSTER_SIZE)
381
+ return @sb['inode_alignment']
382
+ else
383
+ return 0
384
+ end
385
+ end
386
+
387
+ def good_version_4?(sb)
388
+ if (sb['version_number'] & ~XFS_SUPERBLOCK_VERSION_OKREALBITS) ||
389
+ ((sb['version_number'] & XFS_SUPERBLOCK_VERSION_MOREBITSBIT) &&
390
+ (sb['features_2'] & ~XFS_SUPERBLOCK_VERSION2_OKREALBITS))
391
+ return 0
392
+ end
393
+ return 0 if sb['shared_vers_no'] > XFS_SB_MAX_SHARED_VN
394
+ 1
395
+ end
396
+
397
+ def good_version?
398
+ #
399
+ # We always support version 1-3
400
+ #
401
+ if sb_version_num >= XFS_SUPERBLOCK_VERSION_1 &&
402
+ sb_version_num <= XFS_SUPERBLOCK_VERSION_3
403
+ return 1
404
+ end
405
+ #
406
+ # We support version 4 if all feature bits are supported
407
+ #
408
+ if sb_version_num == XFS_SUPERBLOCK_VERSION_4
409
+ return good_version_4?(@sb)
410
+ end
411
+ return 1 if sb_version_num == XFS_SUPERBLOCK_VERSION_5
412
+ end
413
+
414
+ def inode_cluster_size
415
+ cluster_size = XFS_INODE_BIG_CLUSTER_SIZE
416
+ if version_has_crc?
417
+ new_size = cluster_size
418
+ new_size *= inode_size / XFS_DINODE_MIN_SIZE
419
+ if @sb['inode_alignment'] >= b_to_fsbt(new_size)
420
+ cluster_size = new_size
421
+ end
422
+ end
423
+ cluster_size
424
+ end
425
+
426
+ def icluster_size_fsb
427
+ cluster_size = inode_cluster_size
428
+ return 1 if @block_size > cluster_size
429
+ cluster_size >> @sb['block_size_log']
430
+ end
431
+
432
+ def get_ag(agno)
433
+ unless @allocation_group_cache.key?(agno)
434
+ blk_num = ag_daddr(agno, agf_daddr)
435
+ @stream.seek(fsb_to_b(blk_num))
436
+ @allocation_group_cache[agno] = AllocationGroup.new(@stream, agno, @sb)
437
+ end
438
+ @allocation_group_cache[agno]
439
+ end
440
+
441
+ def get_agi(agno)
442
+ get_ag(agno).agi
443
+ end
444
+
445
+ def get_agf(agno)
446
+ get_ag(agno).agf
447
+ end
448
+
449
+ def get_agblock(agno)
450
+ get_ag(agno).agblock
451
+ end
452
+
453
+ def inode_btree_record
454
+ InodeBtreeRecord.new(cursor)
455
+ end
456
+
457
+ def get_inode(inode)
458
+ unless @inode_cache.key?(inode)
459
+ inode_map = InodeMap.new(inode, self)
460
+ if icluster_size_fsb == 1
461
+ buf = get_block(inode_map.inode_blkno)
462
+ else
463
+ buf = get_cluster(inode_map.inode_blkno)
464
+ end
465
+ @inode_cache[inode] = Inode.new(buf, inode_map.inode_boffset, self, inode)
466
+ end
467
+
468
+ @inode_cache[inode]
469
+ end
470
+
471
+ def get_cluster(block)
472
+ raise "XFS::Superblock.get_cluster: block is nil" if block.nil?
473
+ @cluster_cache[block] = MemoryBuffer.create(@block_size * icluster_size_fsb) if block == 0
474
+ unless @cluster_cache.key?(block)
475
+ @stream.seek(fsb_to_b(block))
476
+ @cluster_cache[block] = @stream.read(@block_size * icluster_size_fsb)
477
+ end
478
+ @cluster_cache[block]
479
+ end
480
+
481
+ def get_block(block)
482
+ raise "XFS::Superblock.get_block: block is nil" if block.nil?
483
+ @block_cache[block] = MemoryBuffer.create(@block_size) if block == 0
484
+ unless @block_cache.key?(block)
485
+ @stream.seek(fsb_to_b(block))
486
+ @block_cache[block] = @stream.read(@block_size)
487
+ end
488
+ @block_cache[block]
489
+ end
490
+
491
+ # ////////////////////////////////////////////////////////////////////////////
492
+ # // Utility functions.
493
+
494
+ def got_bit?(field, bit)
495
+ field & bit == bit
496
+ end
497
+
498
+ # Dump object.
499
+ def dump
500
+ out = "\#<#{self.class}:0x#{format('%08x', object_id)}>\n"
501
+ out << "Magic number : #{format('%0x', @sb['magic_num'])}\n"
502
+ out << "Block size : #{@sb['block_size']} (#{@block_size} bytes)\n"
503
+ out << "Number of blocks : #{@sb['data_blocks']}\n"
504
+ out << "Real-time blocks : #{@sb['realtime_blocks']}\n"
505
+ out << "Real-time extents : #{@sb['realtime_extents']}\n"
506
+ out << "UUID : #{@filesystem_id}\n"
507
+ out << "Journal Log Start block : #{@sb['log_start']}\n"
508
+ out << "Root Inode # : #{@sb['root_inode_num']}\n"
509
+ out << "RealTime Bitmap Inode# : #{@sb['bitmap_inode_num']}\n"
510
+ out << "RealTime Summary Inode# : #{@sb['summary_inode_num']}\n"
511
+ out << "RT Extent Size (Blocks) : #{@sb['realtime_ext_size']}\n"
512
+ out << "Alloc Group Size : #{@sb['ag_blocks']}\n"
513
+ out << "# of Alloc Groups : #{@sb['ag_count']}\n"
514
+ out << "# of RT Bitmap Blocks : #{@sb['bitmap_blocks']}\n"
515
+ out << "# of Journal Log Blocks : #{@sb['log_blocks']}\n"
516
+ out << "Filesystem Version # : #{sb_version_num}\n"
517
+ out << "Disk Sector Size : #{@sb['sector_size']} bytes\n"
518
+ out << "Inode Size : #{@sb['inode_size']} bytes\n"
519
+ out << "Inodes Per Block : #{@sb['inodes_per_blk']}\n"
520
+ out << "Filesystem Name : #{@sb['fs_name']}\n"
521
+ out << "Log Base2 of Block size : #{@sb['block_size_log']}\n"
522
+ out << "Log Base2 of Sector size : #{@sb['sector_size_log']}\n"
523
+ out << "Log Base2 of Inode size : #{@sb['inode_size_log']}\n"
524
+ out << "Log Base2 of Inodes/Blk : #{@sb['inodes_per_blk_log']}\n"
525
+ out << "Log Base2 AllocGrp size : #{@sb['ag_blocks_log']}\n"
526
+ out << "Log Base2 RT Extent sz : #{@sb['rt_ext_size_log']}\n"
527
+ out << "In Progress Flag : #{@sb['in_progress']}\n"
528
+ out << "Inode Space Max Percent : #{@sb['inode_max_pct']}\n"
529
+ out << "Inodes Allocated on FS : #{@sb['inode_count']}\n"
530
+ out << "Free Inodes on FS : #{@sb['inode_free_count']}\n"
531
+ out << "Free Data Blocks on FS : #{@sb['free_data_blocks']}\n"
532
+ out << "Free RT Extents on FS : #{@sb['free_rt_extents']}\n"
533
+ out << "Inode # for User Quotas : #{@sb['user_quota_ino']}\n"
534
+ out << "Inode # for Grp Quotas : #{@sb['group_quota_ino']}\n"
535
+ out << "Quota Flags : #{@sb['quota_flags']}\n"
536
+ out << "Miscellaneous Flags : #{@sb['misc_flags']}\n"
537
+ out << "Shared Version # : #{@sb['shared_vers_no']}\n"
538
+ out << "Inode Chunk Alignment : #{@sb['inode_alignment']}\n"
539
+ out << "Stripe or Raid Unit : #{@sb['stripe_unit']}\n"
540
+ out << "Stripe or Raid Width : #{@sb['stripe_width']}\n"
541
+ out << "Log Base2 Dir Block : #{@sb['dir_block_log']}\n"
542
+ out << "Log Base2 Log Sect Size : #{@sb['log_sect_size_log']}\n"
543
+ out << "External Log Sect Size : #{@sb['log_sector_size']}\n"
544
+ out << "Log Device Stripe Size : #{@sb['log_stripe_unit_sz']}\n"
545
+ out << "Additional Version Flgs : #{@sb['features_2']}\n"
546
+ out << "Compat Features : #{@sb['features_compat']}\n"
547
+ out << "R/O Compat Features : #{@sb['features_ro_compat']}\n"
548
+ out << "Incompat Features : #{@sb['features_incompat']}\n"
549
+ out << "Log Incompat Features : #{@sb['features_log_incompat']}\n"
550
+ out << "Superblock CRC : #{@sb['superblock_crc']}\n"
551
+ out << "Inode # Project Quotas : #{@sb['proj_quota_ino']}\n"
552
+ out << "Last Write Sequence : #{@sb['last_write_seq']}\n"
553
+ out
554
+ end
555
+ end # class Superblock
556
+ end # module XFS
@@ -0,0 +1,52 @@
1
+ require 'rake'
2
+
3
+ # Tasks for regenerating cassettes and running tests for the Azure
4
+ # solid state stuff. You should run these while in the gems/pending
5
+ # subdirectory.
6
+ #
7
+ # The tasks that regenerate cassettes assume that you have cloned the
8
+ # gems-pending-config project to your $HOME/Dev directory.
9
+
10
+ namespace 'azure' do
11
+ namespace 'record' do
12
+ env_dir = File.join(Dir.home, 'Dev', 'gems-pending-config')
13
+
14
+ desc 'Recreate the Azure blob disk cassettes'
15
+ task :disk do
16
+ yaml_dir = File.join(Rake.original_dir, 'spec/recordings/disk/modules/azure_blob_disk_spec')
17
+ Dir["#{yaml_dir}/*.yml"].each { |f| FileUtils.rm_rf(f) }
18
+ sh "TEST_ENV_DIR=#{env_dir} bundle exec rspec spec/disk/modules/azure_blob_disk_spec.rb"
19
+ end
20
+
21
+ desc 'Recreate the Azure VM image cassettes'
22
+ task :vm_image do
23
+ yaml_dir = File.join(Rake.original_dir, 'spec/recordings/miq_vm/miq_azure_vm_image_spec')
24
+ Dir["#{yaml_dir}/*.yml"].each { |f| FileUtils.rm_rf(f) }
25
+ sh "TEST_ENV_DIR=#{env_dir} bundle exec rspec spec/miq_vm/miq_azure_vm_image_spec.rb"
26
+ end
27
+
28
+ desc 'Recreate the Azure VM instance cassettes'
29
+ task :vm_instance do
30
+ yaml_dir = File.join(Rake.original_dir, 'spec/recordings/miq_vm/miq_azure_vm_instance_spec')
31
+ Dir["#{yaml_dir}/*.yml"].each { |f| FileUtils.rm_rf(f) }
32
+ sh "TEST_ENV_DIR=#{env_dir} bundle exec rspec spec/miq_vm/miq_azure_vm_instance_spec.rb"
33
+ end
34
+ end
35
+
36
+ namespace 'spec' do
37
+ desc 'Run blob disk specs without regenerating cassettes'
38
+ task 'disk' do
39
+ sh "bundle exec rspec spec/disk/modules/azure_blob_disk_spec.rb"
40
+ end
41
+
42
+ desc 'Run VM image specs without regenerating cassettes'
43
+ task 'vm_image' do
44
+ sh "bundle exec rspec spec/miq_vm/miq_azure_vm_image_spec.rb"
45
+ end
46
+
47
+ desc 'Run VM instance specs without regenerating cassettes'
48
+ task 'vm_instance' do
49
+ sh "bundle exec rspec spec/miq_vm/miq_azure_vm_instance_spec.rb"
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,5 @@
1
+ module ManageIQ
2
+ module Smartstate
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ require "manageiq/smartstate/version"
2
+
3
+ module ManageIQ
4
+ module Smartstate
5
+ # Your code goes here...
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ require 'manageiq/smartstate'