bool HostInfoConfig::GetPartitionInfoFromSystemDevice()

in host/AzureRecoveryLib/config/HostInfoConfig.cpp [773:905]


bool HostInfoConfig::GetPartitionInfoFromSystemDevice(const std::string& mount_point,
                                                     partition_details& sys_part_info
                                                     ) const
{
    TRACE_FUNC_BEGIN;
    BOOST_ASSERT(m_bInitialized);

    bool bFound = false;

    if (boost::trim_copy(mount_point).empty())
    {
        TRACE_WARNING("Invalid argument: Empty mount point provided\n");

        TRACE_FUNC_END;

        return bFound;
    }

    disks_iter_t iterDisk = m_disks.begin();
    for (; iterDisk != m_disks.end() && !bFound; iterDisk++)
    {
        if (!iterDisk->Bootable)
            continue;
        
        partition_iter_t iterPartition = iterDisk->partitions.begin();
        for (; iterPartition != iterDisk->partitions.end() && !bFound;
               iterPartition++)
        {
            //
            // Verify mount point in LVs first, if not found then verify 
            // at partition level
            //
            partition_info_iter_t iterLV = iterPartition->logical_volumes.begin();
            for (; iterLV != iterPartition->logical_volumes.end();
                   iterLV++)
            {
                if (//iterLV->IsSystemVolume && // System device check happens at disk level
                    boost::iequals(mount_point, iterLV->MountPoint))
                {
                    bFound = true;

                    sys_part_info.DiskName = iterDisk->Name;
                    
                    sys_part_info.FsType = iterLV->FSType;
                    
                    sys_part_info.MountPoint = iterLV->MountPoint;
                    
                    sys_part_info.LvName = iterLV->Name;
                    
                    sys_part_info.VolType = PartitionLayout::LVM;
                                        
                    sys_part_info.Partition = 
                        iterPartition->info.Name.empty() ? 
                        iterDisk->Name : 
                        iterPartition->info.Name;

                    sys_part_info.VgName = iterLV->DiskGrp.empty() ?
                        ( iterPartition->info.DiskGrp.empty() ? 
                          iterDisk->DiskGrp : 
                          iterPartition->info.DiskGrp
                        ) :
                        iterLV->DiskGrp;

                    break;
                }
            }

            if ( !bFound &&
                 //iterPartition->info.IsSystemVolume && // System device check happens at disk level
                 boost::iequals(mount_point, iterPartition->info.MountPoint))
            {
                bFound = true;

                sys_part_info.DiskName = iterDisk->Name;
                
                sys_part_info.FsType = iterPartition->info.FSType;
                
                sys_part_info.MountPoint = iterPartition->info.MountPoint;
                
                sys_part_info.Partition = iterPartition->info.Name;
                
                sys_part_info.VolType = PartitionLayout::FS;
            }
        }

        if (!bFound &&
            boost::iequals(mount_point, iterDisk->MountPoint))
        {
            // The mount point is laid over entire disk.
            bFound = true;

            sys_part_info.DiskName = iterDisk->Name;

            sys_part_info.FsType = iterDisk->FSType;

            sys_part_info.MountPoint = iterDisk->MountPoint;

            sys_part_info.Partition = iterDisk->Name;

            sys_part_info.VolType = PartitionLayout::FS;
        }

    }

    //
    // Trace the found partitin info
    //
    if (bFound)
    {
        TRACE_INFO("Found the parition with mount-point: %s\n", mount_point.c_str());

        TRACE_INFO("Disk : %s\n", sys_part_info.DiskName.c_str());

        if (!sys_part_info.LvName.empty())
            TRACE_INFO("LV : %s\n", sys_part_info.LvName.c_str());

        if (!sys_part_info.VgName.empty())
            TRACE_INFO("VG : %s\n", sys_part_info.VgName.c_str());

        if (!sys_part_info.Partition.empty())
            TRACE_INFO("Partition : %s\n", sys_part_info.Partition.c_str());

        if (!sys_part_info.FsType.empty())
            TRACE_INFO("File System : %s\n", sys_part_info.FsType.c_str());
    }
    else
    {
        TRACE_WARNING("Partition not found with mount point: %s\n", mount_point.c_str());
    }

    TRACE_FUNC_END;
    return bFound;
}