def Run(self, args): if platform.system() == "Windows": raise RuntimeError("os.statvfs not available on Windows") for path in args.path_list: try: fd = vfs.VFSOpen(rdf_paths.PathSpec(path=path, pathtype=args.pathtype), progress_callback=self.Progress) st = fd.StatFS() mount_point = fd.GetMountPoint() except (IOError, OSError) as e: self.SetStatus(rdf_flows.GrrStatus.ReturnedStatus.IOERROR, e) continue unix = rdf_client_fs.UnixVolume(mount_point=mount_point) # On linux pre 2.6 kernels don't have frsize, so we fall back to bsize. # The actual_available_allocation_units attribute is set to blocks # available to the unprivileged user, root may have some additional # reserved space. self.SendReply( rdf_client_fs.Volume( bytes_per_sector=(st.f_frsize or st.f_bsize), sectors_per_allocation_unit=1, total_allocation_units=st.f_blocks, actual_available_allocation_units=st.f_bavail, unixvolume=unix))
def Start(self): if "/opt" in self.args.path_list[0]: mnt = rdf_client_fs.UnixVolume(mount_point="/opt") self.SendReply( rdf_client_fs.Volume(unixvolume=mnt, bytes_per_sector=4096, sectors_per_allocation_unit=1, actual_available_allocation_units=10, total_allocation_units=100)) else: mnt = rdf_client_fs.UnixVolume(mount_point="/var") self.SendReply( rdf_client_fs.Volume(unixvolume=mnt, bytes_per_sector=1, sectors_per_allocation_unit=1, actual_available_allocation_units=784165, total_allocation_units=78416500))
class UnixVolumeClientMock(ListDirectoryClientMock): """A mock of client filesystem volumes.""" unix_local = rdf_client_fs.UnixVolume(mount_point="/usr") unix_home = rdf_client_fs.UnixVolume(mount_point="/") path_results = [ rdf_client_fs.Volume(unixvolume=unix_local, bytes_per_sector=4096, sectors_per_allocation_unit=1, actual_available_allocation_units=50, total_allocation_units=100), rdf_client_fs.Volume(unixvolume=unix_home, bytes_per_sector=4096, sectors_per_allocation_unit=1, actual_available_allocation_units=10, total_allocation_units=100) ] def StatFS(self, _): return self.path_results
def StatFSFromClient(args): """Call os.statvfs for a given list of paths. Args: args: An `rdf_client_action.StatFSRequest`. Yields: `rdf_client_fs.UnixVolume` instances. Raises: RuntimeError: if called on a Windows system. """ if platform.system() == "Windows": raise RuntimeError("os.statvfs not available on Windows") for path in args.path_list: try: fd = vfs.VFSOpen( rdf_paths.PathSpec(path=path, pathtype=args.pathtype)) st = fd.StatFS() mount_point = fd.GetMountPoint() except (IOError, OSError): continue unix = rdf_client_fs.UnixVolume(mount_point=mount_point) # On linux pre 2.6 kernels don't have frsize, so we fall back to bsize. # The actual_available_allocation_units attribute is set to blocks # available to the unprivileged user, root may have some additional # reserved space. yield rdf_client_fs.Volume( bytes_per_sector=(st.f_frsize or st.f_bsize), sectors_per_allocation_unit=1, total_allocation_units=st.f_blocks, actual_available_allocation_units=st.f_bavail, unixvolume=unix)