#!/usr/bin/env python3

#--------------------------------------------
# Admin Metric Script for 'filesystem' metric
#
# Copyright (c) 2020, 2022-2023 by Cisco Systems, Inc.
# All rights reserved.
#--------------------------------------------

import re
import os
import json
import subprocess
from datetime import datetime

platform_prefix = "/opt/cisco/calvados/bin/vrfch.sh CTRL_VRF"

def run_cmd(cmd):
   process = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE, shell=True)
   out, error = process.communicate()
   sprc = process.returncode
   if sprc is None or sprc != 0:
       if error:
          out = error
   return out.strip()

def fs_replace(media_str):
  flist = {
   'rootfs:'   : '/',
   'harddisk:' : '/misc/disk1',
   'log:'      : '/var/log',
   'config:'   : '/misc/config',
   'disk0:'    : '/misc/scratch',
   'install:'  : '/install_repo'
  }

  # Create a regular expression  from the flist keys
  regex = re.compile("(%s)" % "|".join(map(re.escape, flist.keys())))

  # For each match, look-up corresponding value in flist
  return regex.sub(lambda mo: flist[mo.string[mo.start():mo.end()]], media_str)

def get_fs_type(fs):
  if "rootfs:/" in fs:
     return "rootfs partition"
  if "rootfs:" in fs:
     return "rootfs"
  if "harddisk:" in fs:
     return "harddisk"
  if "log:" in fs:
     return "log"
  if "config:" in fs:
     return "flash"
  if "disk0:" in fs:
     return "flash-disk"
  if "install:" in fs:
     return "Install partition"
  if "apphost:" in fs:
     return "flash-disk"
  else:
     return "flash-disk"

if __name__ == "__main__":
    metric_name = os.path.basename(__file__)
    data_file = '/pkg/bin/health_check_metrics/admin_metrics/' + metric_name + '.json'
    cmd1 = platform_prefix + " /opt/cisco/calvados/bin/showmedia -l 0/RP0"
    cmd = "/pkg/bin/install_exec_sysadmin \"source /opt/cisco/calvados/bin/install-functions.sh ; %s\"" % (cmd1)
    out_str = run_cmd(cmd)
    media_str = []

    lines = out_str.split("\n")
    filesystem_metric = []
    fs_list = []
    filesystem_info = {}
    for i in lines:
      fs_info = {}
      if "Location" in i:
         node_name = i.split(':')[1]
         filesystem_info['node-name'] = node_name + "/ADMIN0"
      if '%' in i:
        media = i.split()[0]
        fs_info['prefixes'] = media
        fs_info['type'] = get_fs_type(media)
        cmd = "/pkg/bin/install_exec_sysadmin '/opt/cisco/calvados/bin/install-functions.py get_fs_info %s'" % (fs_replace(media))
        # Run cmd on sysadmin
        out = run_cmd(cmd)
        fs_info['flags'] = out.split()[0]
        fs_info['size'] = out.split()[1]
        fs_info['free'] = out.split()[2]
        fs_list.append(fs_info)
    filesystem_info['fs-mdata'] = fs_list
    filesystem_metric.append(filesystem_info)
    with open(data_file, 'w') as json_file:
        json.dump(filesystem_metric, json_file, sort_keys=True, indent=4)
