diff --git a/go_bindings/gotoc/avg.go b/go_bindings/gotoc/avg.go new file mode 100644 index 00000000..0a71fe48 --- /dev/null +++ b/go_bindings/gotoc/avg.go @@ -0,0 +1,29 @@ +package gotoc + +import ( + + + +) +/* + +#include "../../../../../Include/sigar.h" + + + +*/ +import "C" + +func Avg()C.sigar_loadavg_t{ + + var sigar *C.sigar_t=GetSigarHandle() + + var avg C.sigar_loadavg_t + + + C.sigar_loadavg_get(sigar, &avg) + + + return avg + +} \ No newline at end of file diff --git a/go_bindings/gotoc/cpu.go b/go_bindings/gotoc/cpu.go new file mode 100644 index 00000000..5b8269b7 --- /dev/null +++ b/go_bindings/gotoc/cpu.go @@ -0,0 +1,52 @@ +package gotoc + + +import ( + + + "unsafe" +) + + +//#include "../../../../../Include/sigar.h" +import "C" + + + + + + +func Cpu() (C.sigar_cpu_list_t,[]C.sigar_cpu_t){ + + + + var sigar *C.sigar_t=GetSigarHandle() + + var cpulists C.sigar_cpu_list_t + + C.sigar_cpu_list_get(sigar, &cpulists) + + var length int=int(cpulists.number) + + + usp:=GetGoSlice(length, unsafe.Pointer(cpulists.data)) + + var goCpu []C.sigar_cpu_t + goCpu = *(*[]C.sigar_cpu_t)(unsafe.Pointer(&usp)) + + + C.sigar_cpu_list_destroy(sigar, &cpulists) + + + + return cpulists, goCpu + + +} + + + + + + + diff --git a/go_bindings/gotoc/cpuInfo.go b/go_bindings/gotoc/cpuInfo.go new file mode 100644 index 00000000..54ea6ca1 --- /dev/null +++ b/go_bindings/gotoc/cpuInfo.go @@ -0,0 +1,68 @@ +package gotoc + +import ( + "fmt" + "unsafe" +) +/* + +#include "../../../../../Include/sigar.h" + + + +*/ +import "C" + +type CpuInfo struct{ + Vendor string + Model string + Mhz int + MhzMax int + MhzMin int + CacheSize uint + TotalSockets int + TotalCores int + CorePerSocket int +} + +func GetCpuInfo()(result []*CpuInfo, err error){ + + defer func() { + if r := recover() ; r != nil { + err = fmt.Errorf("Failed to rertieve cpu info due to: %v", err) + } + }() + var sigar *C.sigar_t=GetSigarHandle() + + var cpuInfoList C.sigar_cpu_info_list_t + + C.sigar_cpu_info_list_get(sigar, &cpuInfoList) + + var length int=int(cpuInfoList.number) + + cCpuInfo:=GetGoSlice(length, unsafe.Pointer(cpuInfoList.data)) + + var goCpuInfo []C.sigar_cpu_info_t + goCpuInfo= *(*[]C.sigar_cpu_info_t)(unsafe.Pointer(&cCpuInfo)) + + C.sigar_cpu_info_list_destroy(sigar,&cpuInfoList) + + result = make([]*CpuInfo, len(goCpuInfo)) + for i,sigarCpuinfo := range goCpuInfo { + + result[i] = &CpuInfo{ + Vendor : C.GoString(&sigarCpuinfo.vendor[0]), + Model : C.GoString(&sigarCpuinfo.model[0]), + Mhz : int(sigarCpuinfo.mhz), + MhzMax : int(sigarCpuinfo.mhz_max), + MhzMin : int(sigarCpuinfo.mhz_min), + CacheSize : uint(sigarCpuinfo.cache_size), + TotalSockets : int(sigarCpuinfo.total_sockets), + TotalCores : int(sigarCpuinfo.total_cores), + CorePerSocket : int(sigarCpuinfo.cores_per_socket), + } + } + + return result,nil + +} \ No newline at end of file diff --git a/go_bindings/gotoc/fileInfo.go b/go_bindings/gotoc/fileInfo.go new file mode 100644 index 00000000..db959e95 --- /dev/null +++ b/go_bindings/gotoc/fileInfo.go @@ -0,0 +1,45 @@ +package gotoc + + +import ( + + + "unsafe" +) +/* +#include "../../../../../Include/sigar.h" + + + +*/ +import "C" + + +func FileInfo() []C.sigar_file_system_t{ + + var sigar *C.sigar_t=GetSigarHandle() + var fileSystemList C.sigar_file_system_list_t + //C.fileInfo(sigar,&fileSystemList) + C.sigar_file_system_list_get(sigar, &fileSystemList); + + var length int=int(fileSystemList.number) + + + cFs:=GetGoSlice(length, unsafe.Pointer(fileSystemList.data)) + + var goFs []C.sigar_file_system_t + goFs = *(*[]C.sigar_file_system_t)(unsafe.Pointer(&cFs)) + + //fmt.Printf("%v\n", C.GoString(&goFs[1].dir_name[0])) + C.sigar_file_system_list_destroy(sigar, &fileSystemList); + + return goFs + + + +} + + + + + diff --git a/go_bindings/gotoc/handle.go b/go_bindings/gotoc/handle.go new file mode 100644 index 00000000..3fa60670 --- /dev/null +++ b/go_bindings/gotoc/handle.go @@ -0,0 +1,58 @@ +package gotoc + +import ( + + "fmt" + "reflect" + "unsafe" + +) + +/* +#include "../../../../../Include/sigar.h" + +*/ +import "C" + +var sigar *C.sigar_t=nil +func GetSigarHandle()*C.sigar_t{ + + if(sigar!=nil){ + return sigar + } + sigar=new (C.sigar_t) + ret:=C.sigar_open(&sigar) + if(ret!=C.SIGAR_OK){ + return nil + } + return sigar + +} + +func CloseSigarHandle(sigar *C.sigar_t) { + + if(sigar!=nil){ + C.sigar_close(sigar) + return + } + fmt.Println("Trying to close a nil handel, ignoring") +} + + +func GetGoSlice(number int, pointer unsafe.Pointer ) reflect.SliceHeader{ + var length int=int(number) + + + cObj := reflect.SliceHeader{ + Data: uintptr(pointer), + Len: length, + Cap: length, + } + + + + + return cObj + + +} \ No newline at end of file diff --git a/go_bindings/gotoc/main.go b/go_bindings/gotoc/main.go new file mode 100644 index 00000000..cf94faf0 --- /dev/null +++ b/go_bindings/gotoc/main.go @@ -0,0 +1,11 @@ +package gotoc + +import ( + +) + +func main(){ + + + NetInfo() +} \ No newline at end of file diff --git a/go_bindings/gotoc/mem.go b/go_bindings/gotoc/mem.go new file mode 100644 index 00000000..3c034703 --- /dev/null +++ b/go_bindings/gotoc/mem.go @@ -0,0 +1,48 @@ +package gotoc + + +import ( + + + +) +/* + +#include "../../../../../Include/sigar.h" + + + +*/ +import "C" + +type Info struct { + Free int64 +} + +type MemInfo struct { + Mem *Info + Swap *Info +} + +func GetMemInfo() (*MemInfo, error){ + + var sigar *C.sigar_t=GetSigarHandle() + var mem C.sigar_mem_t + var swap C.sigar_swap_t + + C.sigar_mem_get( sigar, &mem) + C.sigar_swap_get(sigar, &swap); + + return &MemInfo{ + Mem : &Info{ Free : int64(mem.free)}, + Swap : &Info{ Free : int64(swap.free)}, + },nil + + + +} + + + + + diff --git a/go_bindings/gotoc/netconfig.go b/go_bindings/gotoc/netconfig.go new file mode 100644 index 00000000..55103702 --- /dev/null +++ b/go_bindings/gotoc/netconfig.go @@ -0,0 +1,107 @@ +package gotoc + + +import ( + + "unsafe" + + +) +/* + +#include "../../../../../Include/sigar.h" +#include +#include +typedef unsigned char byte; + void translateNetConfig(sigar_t *sigar){ + + + + + sigar_net_interface_config_t config; + + + + + sigar_net_interface_config_get(sigar, "eth10", &config); + sigar_uint32_t a=config.address.addr.in; + + + char buf[180]; + unsigned char* ucp = (unsigned char *)&a; + sprintf(buf, "%d.%d.%d.%d", ucp[0] & 0xff, ucp[1] & 0xff, ucp[2] & 0xff, ucp[3] & 0xff); + printf("%s\n",buf); + + + + + + + } + + +*/ +import "C" + + +func GetNetConfig()(C.sigar_net_interface_config_t,[]C.sigar_net_interface_config_t,[]C.sigar_net_interface_stat_t){ + + var sigar *C.sigar_t=GetSigarHandle() + var netlistconf C.sigar_net_interface_list_t + var netconfPrimary C.sigar_net_interface_config_t + + C.sigar_net_interface_config_primary_get(sigar, &netconfPrimary) + + C.sigar_net_interface_list_get(sigar, &netlistconf) + + var length int=int(netlistconf.number) + + goInterfacesNames := ((*[1 << 30]*C.char)(unsafe.Pointer(netlistconf.data)))[:length] + + //cinteraces:=GetGoSlice(length, unsafe.Pointer(netlistconf.data)) + //goInterfacesNames := *(*[]C.char)(unsafe.Pointer(&cinteraces)) + + var netconf =make([]C.sigar_net_interface_config_t,length) + var netstat =make([]C.sigar_net_interface_stat_t,length) + + for i:=0;i +#include "../../../../../Include/sigar.h" +*/ +import "C" + +type sigar_file_system_usage_t struct { + UsedPct float64 + Total int64 + Free int64 + Used int64 + Avail int64 + Files int64 + FreeFiles int64 +} + +type FsUsage struct { + UsedPct float64 + Total int64 + Free int64 + Used int64 + Avail int64 + Files int64 + FreeFiles int64 +} + +func (this *FsUsage) String() string { return fmt.Sprintf("used: %v, total: %v, free: %v, used: %v, avail: %v, files: %v, freeFiles: %v", this.UsedPct, this.Total, this.Free, this.Used, this.Avail, this.Files, this.FreeFiles) } + +type DiskUsage struct { + Reads int64 + Writes int64 + WriteBytes int64 + ReadBytes int64 + Rtime int64 + Wtime int64 + Qtime int64 + Time int64 + SnapTime int64 + ServiceTime float64 + Queue float64 +} + +type FsUsageInfo struct { + Fs *FsUsage + Disk *DiskUsage +} + +func GetFsUsageInfo(dirName string, diskName string)(fsUsageInfo *FsUsageInfo,err error){ + + var sigar *C.sigar_t=GetSigarHandle() + //TODO: noticed that sigar_file_system_usage_t contains a sigar_disk_usage_t member, should there be two invocations? + fsUsage, err := _getFsUsage(dirName, sigar) + if err != nil { + return nil, err + } + + diskUsage, err := _getDiskUsage(diskName, sigar) ; + if err != nil { + return nil,err + } + + + return &FsUsageInfo {fsUsage, diskUsage}, err +} + + +func GetFsUsage(dirName string) (*FsUsage, error) { + return _getFsUsage(dirName, GetSigarHandle()) +} + +func _getFsUsage(dirName string, sigar *C.sigar_t) (out *FsUsage, err error) { + var fsusage C.sigar_file_system_usage_t + + dir:=C.CString(dirName) + + C.free(unsafe.Pointer(dir)) + + C.sigar_file_system_usage_get(sigar , dir, &fsusage) + + out = &FsUsage{ + float64(fsusage.use_percent), + int64(fsusage.total), + int64(fsusage.free), + int64(fsusage.used), + int64(fsusage.avail), + int64(fsusage.files), + int64(fsusage.free_files), + } + + fmt.Printf("Fs usage for dir %v is %v", dirName, out) + return out,nil +} + +func GetDiskUsage(diskName string) (*DiskUsage, error) { + return _getDiskUsage(diskName, GetSigarHandle()) +} + +func _getDiskUsage(diskName string, sigar *C.sigar_t) (*DiskUsage, error) { + var diskusage C.sigar_disk_usage_t + disk:=C.CString(diskName) + defer C.free(unsafe.Pointer(disk)) + C.sigar_disk_usage_get(sigar , disk, &diskusage) + return &DiskUsage { + int64(diskusage.reads), + int64(diskusage.writes), + int64(diskusage.write_bytes), + int64(diskusage.read_bytes), + int64(diskusage.rtime), + int64(diskusage.wtime), + int64(diskusage.qtime), + int64(diskusage.time), + int64(diskusage.snaptime), + float64(diskusage.service_time), + float64(diskusage.queue), + },nil +} \ No newline at end of file diff --git a/go_bindings/gotoc/utils.go b/go_bindings/gotoc/utils.go new file mode 100644 index 00000000..2e5e2807 --- /dev/null +++ b/go_bindings/gotoc/utils.go @@ -0,0 +1,20 @@ +package gotoc + +import ( + + "unsafe" +) + + +//#include +import "C" + + +func SigarStringToGoString(cstring *C.char) string{ + + var theString string = C.GoString(cstring) + + defer C.free(unsafe.Pointer(cstring)) + return theString + +} \ No newline at end of file