-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathosarunner.pl
executable file
·94 lines (86 loc) · 2 KB
/
osarunner.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/perl -w
use strict;
use constant PORT => 21376;
use IO::Socket;
my $lockFile = "/tmp/.osarunner.pid";
my $arg = shift;
if (defined($arg) && ($arg eq '-v')) {
removeLockFile($lockFile);
runDaemon();
exit;
}
if (processRunning($lockFile)) {
# already running
exit;
} else {
# not running, start daemon
my $pid = fork();
if ($pid == 0) {
# child
runDaemon();
removeLockFile($lockFile);
} else {
# parent
createLockFile($lockFile, $pid);
}
}
exit;
sub runDaemon {
my $socket = new IO::Socket::INET(
'LocalPort' => PORT,
'Proto' => 'tcp',
'Listen' => 1,
'Reuse' => 1,
);
die "Unable to create socket: $!\n" if (! $socket);
while (my $connSock = $socket->accept()) {
my @data = <$connSock>;
my $script = join('', @data);
# try to compile for syntax check
local *PIPE;
unlink("/tmp/a.scpt");
open(PIPE, "| osacompile -o /tmp/a.scpt");
print PIPE $script;
close(PIPE);
if (-e "/tmp/a.scpt") {
# compiled okay, let's run it
unlink("/tmp/a.scpt");
open(PIPE, "| osascript");
print PIPE $script;
close(PIPE);
} else {
# script could not be compiled, ignore
}
close($connSock);
}
close($socket);
}
sub removeLockFile {
my $lockFile = shift;
unlink($lockFile);
}
sub createLockFile {
my $lockFile = shift;
my $pid = shift;
local *OUT;
open(OUT, ">$lockFile");
print OUT $pid, "\n";
close(OUT);
}
sub processRunning {
my $lockFile = shift;
local *IN;
if (-f $lockFile) {
open(IN, "<$lockFile");
my $pid = <IN>;
chomp($pid);
close(IN);
open(IN, "ps -p $pid |");
my @lines = <IN>;
close(IN);
my $psData = join('', @lines);
return ($psData =~ /\b${pid}\b/);
} else {
return 0;
}
}