# Copyright 2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

import os
import platform
import subprocess

from portage import _unicode_decode

def get_vm_info():

	vm_info = {}

	if platform.system() == 'Linux':
		try:
			proc = subprocess.Popen(["free"],
				stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
		except OSError:
			pass
		else:
			output = _unicode_decode(proc.communicate()[0])
			if proc.wait() == os.EX_OK:
				for line in output.splitlines():
					line = line.split()
					if len(line) < 2:
						continue
					if line[0] == "Mem:":
						try:
							vm_info["ram.total"] = int(line[1]) * 1024
						except ValueError:
							pass
						if len(line) > 3:
							try:
								vm_info["ram.free"] = int(line[3]) * 1024
							except ValueError:
								pass
					elif line[0] == "Swap:":
						try:
							vm_info["swap.total"] = int(line[1]) * 1024
						except ValueError:
							pass
						if len(line) > 3:
							try:
								vm_info["swap.free"] = int(line[3]) * 1024
							except ValueError:
								pass

	else:

		try:
			proc = subprocess.Popen(["sysctl", "-a"],
				stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
		except OSError:
			pass
		else:
			output = _unicode_decode(proc.communicate()[0])
			if proc.wait() == os.EX_OK:
				for line in output.splitlines():
					line = line.split(":", 1)
					if len(line) != 2:
						continue
					line[1] = line[1].strip()
					if line[0] == "hw.physmem":
						try:
							vm_info["ram.total"] = int(line[1])
						except ValueError:
							pass
					elif line[0] == "vm.swap_total":
						try:
							vm_info["swap.total"] = int(line[1])
						except ValueError:
							pass
					elif line[0] == "Free Memory Pages":
						if line[1][-1] == "K":
							try:
								vm_info["ram.free"] = int(line[1][:-1]) * 1024
							except ValueError:
								pass

	return vm_info
