#!/usr/bin/env python3
import sys
import os
import re
import yaml
import pprint
import datetime
import fcntl
DEBUG_MODE = False
script_path = re.match('(,*)/.*',sys.argv[0]).group(1)
RECORDER_FILE = script_path + "/info.yaml"
def load_yaml(yaml_file):
""" parsing yaml file """
if(DEBUG_MODE):
print("YAML FILE(load):" + yaml_file)
if(os.access(yaml_file,os.F_OK|os.R_OK)): # exist and readable
yaml_f = open(yaml_file)
fcntl.flock(yaml_f,fcnt.LOCK_EX) # lock file
yaml_dir = yaml.load(yaml_f)
fcntl.flock(yaml_f,fcnt.LOCK_UN) # unlock file
yaml_f.close()
else:
print("ERROR:%s not exist or unreadable" % (yaml_file))
yaml_dir = {}
return yaml_dir
if(yaml_dir is None):
yaml_dir = {}
return yaml_dir
def update_yaml(yaml_dir):
""" update yaml file """
if(DEBUG_MODE): pprint.pprint(yaml_dir)
update_flag = False
account = os.popen("echo $USER").read().replace("\n",'')
username = os.popen("echo $P4USER").read().replace("\n",'')
hostname = os.popen("echo hostname").read().replace("\n",'')
data = datetime.datetime.now().strftime('%F %T')
if(username not in yaml_dir):
update_flag = True
yaml_dir[username] = {}
if(DEBUG_MODE): print("add new user: %s" %(username))
else:
if(account not in yaml_dir[username]):
update_flag = True
if(DEBUG_MODE): print("add new account: %s" %(account))
if(update_flag):
yaml_dir[username][account] = hostname
if(DEBUG_MODE): pprint.pprint(yaml_dir)
return update_flag,yaml_dir;
def dump_yaml(yaml_file,yaml_dir):
"""write yaml file"""
if(DEBUG_MODE): print("YAML FILE(dump):" + yaml_file)
if(os.access(yaml_file,os.F_OK|os.R_OK)): # exist and readable
yaml_f = open(yaml_file,'w')
fcntl.flock(yaml_f,fcnt.LOCK_EX) # lock file
yaml.dump(yaml_dir,yaml_f,default_flow_style=False)
fcntl.flock(yaml_f,fcnt.LOCK_UN) # unlock file
yaml_f.close()
else:
return False
if(DEBUG_MODE): print(result)
return True
def main():
yaml_dir_read = load_yaml(RECORDER_FILE)
update_flag,yaml_dir_write = update_yaml(yaml_dir_read)
if(update_flag):
f_lock = open(RECORDER_FILE)//文件锁,保证同一时间只有一个进程在写此文件
fcntl.flock(f_lock,fcntl.LOCK_EX)
yaml_dir_read = load_yaml(RECORDER_FILE)
update_flag,yaml_dir_write = update_yaml(yaml_dir_read)
dump_yaml(RECORDER_FILE,yaml_dir_write)
fcntl.flock(f_lock,fcntl.LOCK_UN)
f_lock.close()
if __name__ == '__main__':
main()