#!/usr/bin/env python3

# -----------------------------------------------------------
# pmem - Show system memory                                 |
# Created by q3aql (q3aql@duck.com)                         |
# Licensed by GPL v2.0                                      |
# Last update: 29-10-2022                                   |
# Compatible with Python 3.x                                |
# -----------------------------------------------------------
version="0.1"

# Import python-modules
import psutil
import os
import sys

# Check if your system use Python 3.x
if sys.version_info<(3,0):
  print ("")
  print (" You need python 3.x to run this program.")
  print ("")
  exit()

# Check system 
if os.name == "posix":
  os.chdir(os.environ["HOME"])
elif os.name == "nt":
  print("")
  print(" Error: Only Linux and *BSD systems are supported")
  print("")
  exit()

print('')
print(' List of processes (Mem + Name)')
print(' ==============================')
print('')

numprocess=0
for process in psutil.process_iter():
  numprocess = numprocess + 1
  Name = process.name() # Name of the process
  ID = process.pid # ID of the process
  readmemprocess = psutil.Process(ID)
  sysmemprocess = readmemprocess.memory_info()[0]
  ID = str(ID)
  if sysmemprocess > 1024:
    sysmemprocess = sysmemprocess / 1024
    sysmemprocess = round(sysmemprocess, 2)
    showmemprocess = str(sysmemprocess)
    showmemprocess = showmemprocess + ' KiB'
  if sysmemprocess > 1024:
    sysmemprocess = sysmemprocess / 1024
    sysmemprocess = round(sysmemprocess, 2)
    showmemprocess = str(sysmemprocess)
    showmemprocess = showmemprocess + ' MiB'
  if sysmemprocess > 1024:
    sysmemprocess = sysmemprocess / 1024
    sysmemprocess = round(sysmemprocess, 2)
    showmemprocess = str(sysmemprocess)
    showmemprocess = showmemprocess + ' GiB'
  print ('  ' + showmemprocess + '     ' + Name + ' (PID: ' + ID + ')')

# Read file /proc/meminfo and create variables
memfile = open('/proc/meminfo', 'r')
memread = memfile.read()
memsplit = memread.split()

# Memory variables
memtotal = memsplit[1]
memavailable = memsplit[7]

# Convert and calcule memory
memtotal = int(memtotal)
memavailable = int(memavailable)
memactive = memtotal - memavailable
if memsplit[2] == "kB":
  memtotal = memtotal / 1024 / 1024
  memavailable = memavailable / 1024 / 1024
  memactive = memactive / 1024 / 1024
elif memsplit[2] == "B":
  memtotal = memtotal / 1024 / 1024 / 1024
  memavailable = memavailable / 1024 / 1024 / 1024
  memactive = memactive / 1024 / 1024 / 1024

# Show memory output
memactive = round(memactive, 2)
memactive = str(memactive)
memavailable = round(memavailable, 2)
memavailable = str(memavailable)
memtotal = round(memtotal, 2)
memtotal = str(memtotal)
print('')
print(' ============================================')
print(' ' + memactive + ' GiB / ' + memtotal + ' GiB = ' + memavailable + " GiB Available")
print('')
print(' ==========================')
print(" Total running process", numprocess)
print('')
