/****************************************************************************
                system infomation collect & shared memory set class
                -----------------------------------------

    begin      : 2015/04/28
    copyright  : (C) 2005 Solbox Inc.
    author     : Dev Storage Team
    email      : huibong@solbox.com
    version    : 3.5

    CopyRight(C) 2005 Solbox Inc. All Rights reserved.
    Redistribution and use in source and binary forms, with or with out
    modification, are not permitted in outside of Solbox Inc.
*****************************************************************************/

#ifndef __SYSTEM_INFO_H__
#define __SYSTEM_INFO_H__

#include "FhsShm.h"
#include "StorageInfo.h"

#include <unistd.h>
#include <kvm.h>
#include <libgeom.h>

#include <string>


// System 정보를 추출하여.. 공유메모리에 저장을 담당하기 위한 class
class CSystemInfo
{
	public:

		// 생성자
		CSystemInfo( CFhsShm * pFhsShm );

		// 소멸자
		~CSystemInfo();

		// 초기화 함수
		bool Init();
		

	public:   // 시스템 정보 수집 관련 함수

		// hostname 정보 수집
		bool GetHostname();

		// load average 정보 수집
		bool GetLoadAverage();

		// total memory 정보 수집
		bool GetMemoryTotal();

		// free memory 정보 수집
		bool GetMemoryFree();

		// swap 정보 수집
		bool GetSwap();

		// mount 정보 수집 및 처리
		bool GetMount( const char * szRoot);

		// Disk 상태 정보 수집
		bool GetDiskStatus();
		
		// Network 상태 정보 수집
		bool GetNetworkStatus();

		// TCP session 상태 정보 수집
		bool GetTcpSession();



	private:  // 시스템 정보 수집 관련 멤버 변수

		// 공유메모리 interface 객체에 대한 포인터.
		// -  공유메모리에 Data Set, Get 을 담당
		CFhsShm * m_pFhsShm;

		// Kernel data access library 객체에 대한 포인터
		// - swap 정보 추출을 위해 사용.
		kvm_t * m_pKvm;

		// Disk 상태 정보 수집을 위한 멤버변수
		struct gmesh m_stDiskGmesh;      // gmp
		void * m_pDiskSnapshotPrev;      // sq
		void * m_pDiskSnapshotNow;       // sp

		struct timespec m_timeDiskPrev;  // tq
		struct timespec m_timeDiskNow;   // tp

		// Network 통계 정보 수집을 위한 멤버 변수
		struct timespec m_timeNetworkPrev;   // 최종 Network 통계 수집 시간.		

		uint64_t m_ulNetworkPacketIn;        // total network in packet count
		uint64_t m_ulNetworkPacketOut;       // total network out packet count
		uint64_t m_ulNetworkByteIn;          // total network in byte
		uint64_t m_ulNetworkByteOut;         // total network out byte

		// Storage mount 정보 추출 관련 처리를 수행할 class 객체
		CStorageInfo m_storageInfo;


	private:  // 처리 관련 내부 함수


};


#endif /* __SYSTEM_INFO_H__ */

