From 91ee9fc68860fac55a79f1c2dde7482531d2cddd Mon Sep 17 00:00:00 2001
From: Donald Buczek <buczek@molgen.mpg.de>
Date: Wed, 29 Nov 2023 10:12:25 +0100
Subject: [PATCH] libexec_crom: Add owlmayerMicroscopy_archiver

---
 .../prj_owlmayerMicroscopy_archiver.pl        | 76 +++++++++++++++++++
 1 file changed, 76 insertions(+)
 create mode 100755 libexec_cron/prj_owlmayerMicroscopy_archiver.pl

diff --git a/libexec_cron/prj_owlmayerMicroscopy_archiver.pl b/libexec_cron/prj_owlmayerMicroscopy_archiver.pl
new file mode 100755
index 0000000..b9c80e8
--- /dev/null
+++ b/libexec_cron/prj_owlmayerMicroscopy_archiver.pl
@@ -0,0 +1,76 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+
+sub lock_or_exit {
+    my ($lockfilename) = @_;
+    open our $LOCKFD , '>>', $lockfilename or die "$lockfilename: $!\n";
+    unless (flock $LOCKFD, 6) {  # LOCK_EX+LOCK_NB
+        $! != 11 and die "$!\n";
+        warn "already running\n";
+        exit;
+    }
+}
+
+sub scandir {
+    my ($dirname)=@_;
+    opendir my $dir, $dirname or die "$dirname: $!\n";
+    return sort grep !/^\./,readdir $dir;
+}
+
+sub warn0 {
+    warn @_;
+    return 0;
+}
+
+sub archive {
+    my ($id, $requestfile) = @_;
+    my $lpath = "/project/owlmayerMicroscopy/$id";
+    my $rpath = "/amd/grele/M/MG006/project/owlmayerMicroscopy/$id";
+    my ($dev1, $ino1) = lstat $lpath or return warn0("$lpath: $!\n");
+    -d _ or return warn0("$lpath: not a directory\n");
+    my ($dev2, $ino2) = lstat $rpath or return warn0("$rpath: $!\n");
+    unless ($dev1 == $dev2 && $ino1 == $ino2) {
+        return warn0("$rpath not the same as $lpath\n");
+    }
+
+    my $lf = "/project/owlmayerMicroscopy/$id.is-archived-on-tape.log";
+    my $lf1 = "/project/owlmayerMicroscopy/home/archive_logs/$id.is-archived-on-tape.log";
+    my $lf2 = "/project/owlmayerMicroscopy/$id/archive.log";
+    -e $lf1 and return warn0("$lf1: already exists\n");
+    -e $lf2 and return warn0("$lf2: already exists\n");
+
+    warn "archive $rpath\n";
+    system '/project/admin/tools/archived.pl', $rpath and return 0;
+
+    rename $lf, $lf1 or return warn0("failed to rename $lf to $lf1: $!\n");
+    link $lf1, $lf2 or return warn0("failed to link $lf1 to $lf2\n");
+
+    unlink("$lpath/$requestfile") or warn0("failed to remove $lpath/$requestfile\n");
+    return 1;
+}
+
+lock_or_exit("/run/lock/owlmayerMicroscopy-archive");
+chdir '/project/owlmayerMicroscopy' or die "/project/owlmayerMicroscopy: $!\n";
+
+umask 022;
+
+while (1) {
+    my $progress;
+    my $errors;
+    for my $id (scandir '.') {
+        -d $id or next;
+        for my $f (scandir $id) {
+            $f =~ /^archive_me\./ or next;
+            if(archive($id, $f)) {
+                $progress++;
+            } else {
+                $errors++;
+            }
+        }
+    }
+    unless ($progress) {
+        exit($errors ? 1 : 0);
+    }
+    sleep(5);
+}