aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rcynic/rpki-torrent.py30
1 files changed, 27 insertions, 3 deletions
diff --git a/rcynic/rpki-torrent.py b/rcynic/rpki-torrent.py
index 0fb4f657..2f6bc086 100644
--- a/rcynic/rpki-torrent.py
+++ b/rcynic/rpki-torrent.py
@@ -37,6 +37,7 @@ import ConfigParser
import stat
import time
import errno
+import fcntl
import transmissionrpc
@@ -119,15 +120,14 @@ def generator_main():
client.remove_torrents(z.torrent_name)
- unauthenticated_dir = cfg.get("rcynic", "unauthenticated")
download_dir = client.get_session().download_dir
torrent_dir = os.path.join(download_dir, z.torrent_name)
torrent_file = os.path.join(cfg.zip_dir, z.torrent_name + ".torrent")
- syslog.syslog("Synchronizing local data from %s to %s" % (unauthenticated_dir, torrent_dir))
+ syslog.syslog("Synchronizing local data from %s to %s" % (cfg.unauthenticated, torrent_dir))
subprocess.check_call((cfg.rsync_prog, "--archive", "--delete",
- os.path.normpath(unauthenticated_dir) + "/",
+ os.path.normpath(cfg.unauthenticated) + "/",
os.path.normpath(torrent_dir) + "/"))
syslog.syslog("Creating %s" % torrent_file)
@@ -249,6 +249,13 @@ def run_rcynic(client, z):
Run rcynic and any post-processing we might want.
"""
+ if cfg.lockfile is not None:
+ syslog.syslog("Acquiring lock %s" % cfg.lockfile)
+ lock = os.open(cfg.lockfile, os.O_WRONLY | os.O_CREAT, 0600)
+ fcntl.flock(lock, fcntl.LOCK_EX)
+ else:
+ lock = None
+
syslog.syslog("Checking manifest against disk")
download_dir = client.get_session().download_dir
@@ -278,6 +285,9 @@ def run_rcynic(client, z):
syslog.syslog("Running post-rcynic command: %s" % cmd)
subprocess.check_call(cmd, shell = True)
+ if lock is not None:
+ syslog.syslog("Releasing lock %s" % cfg.lockfile)
+ os.close(lock)
# See http://www.minstrel.org.uk/papers/sftp/ for details on how to
# set up safe upload-only SFTP directories on the server. In
@@ -601,6 +611,20 @@ class MyConfigParser(ConfigParser.RawConfigParser):
def sftp_private_key_file(self):
return self.get(self.rpki_torrent_section, "sftp_private_key_file")
+ @property
+ def lockfile(self):
+ try:
+ return self.get(self.rpki_torrent_section, "lockfile")
+ except ConfigParser.Error:
+ return None
+
+ @property
+ def unauthenticated(self):
+ try:
+ return self.get(self.rpki_torrent_section, "unauthenticated")
+ except ConfigParser.Error:
+ return self.get("rcynic", "unauthenticated")
+
def multioption_iter(self, name, getter = None):
if getter is None:
getter = self.get