From 86b6aad19f3796402dbc2f6e90a47081e8b309a0 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Wed, 6 Jan 2010 12:34:22 -0500 Subject: add semaphore utilities to ec2init module --- ec2init/__init__.py | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/ec2init/__init__.py b/ec2init/__init__.py index 60a87275..77f96760 100644 --- a/ec2init/__init__.py +++ b/ec2init/__init__.py @@ -22,8 +22,12 @@ from configobj import ConfigObj import boto.utils import cPickle +import sys +import os.path +import errno datadir = '/var/lib/cloud/data' +semdir = '/var/lib/cloud/sem' cachedir = datadir + '/cache' user_data = datadir + '/user-data.txt' user_data_raw = datadir + '/user-data.raw' @@ -93,4 +97,47 @@ def decomp_str(str): # preprocess the user data (include / uncompress) def preprocess_user_data(ud): - return(decomp_str(ud)) + return(decomp_str(ud)) + +def sem_getpath(name,freq): + # TODO: freqtok must represent "once-per-instance" somehow + freqtok = freq + return("%s/%s.%s" % (semdir,name,freqtok)) + +def sem_has_run(name,freq): + semfile = sem_getpath(name,freq) + if os.path.exists(semfile): + return True + return False + +def sem_acquire(name,freq): + from time import time + semfile = sem_getpath(name,freq) + + try: + os.makedirs(os.path.dirname(semfile)) + except OSError as e: + if e.errno != errno.EEXIST: + raise e + + if os.path.exists(semfile): + return False + + # race condition + try: + f = open(semfile,"w") + f.write(str(time())) + f.close() + except: + return(False) + return(True) + +def sem_clear(name,freq): + semfile = sem_getpath(name,freq) + try: + os.unlink(semfile) + except OSError as e: + if e.errno != errno.ENOENT: + return False + + return True -- cgit v1.2.3