code: def decrypt_csv_columns_automation(
      ip,
      port,
      encrypted_primary_key_path,
      encrypted_data_key_path,
      input_dir,
  ):
      from glob import glob
      import time
  
      print("[INFO] Column Decryption Start...")
      start = time.time()
      EXT = "*.csv"
      all_csv_files = [
          file
          for p, subdir, files in os.walk(input_dir)
          for file in glob(os.path.join(p, EXT))
      ]
      data_key = retrieve_data_key_plaintext(
          ip, port, encrypted_primary_key_path, encrypted_data_key_path
      )
      fernet = Fernet(data_key)
  
      for csv_file in all_csv_files:
          data = csv.reader(open(csv_file, "r"))
          csvWriter = csv.writer(
              open(csv_file + ".col_decrypted", "w", newline="\n")
          )
          next(data)
          for row in data:
              write_buffer = []
              for field in row:
                  plaintext = fernet.decrypt(
                      field.encode("ascii")
                  ).decode("utf-8")
                  write_buffer.append(plaintext)
              csvWriter.writerow(write_buffer)
          print(
              "[INFO] Decryption Finished. The Output Is "
              + csv_file
              + ".col_decrypted"
          )
  
      end = time.time()
      print(
          "[INFO] Total Elapsed Time For Columns Decryption: "
          + str(end - start)
          + " s"
      )
  
file_path: BigDL/python/ppml/src/bigdl/ppml/kms/ehsm/file_operator.py
imports: from key_manager import retrieve_data_key_plaintext
  from cryptography.fernet import Fernet
  import os, csv, io
label_desc: Use image node_id 8 for calling a global function with example usage: decrypt_csv_columns_automation(ip, port, encrypted_primary_key_path, encrypted_data_key_path, input_dir) without return types