-
Notifications
You must be signed in to change notification settings - Fork 180
/
ShellScriptAction.m
136 lines (103 loc) · 3.35 KB
/
ShellScriptAction.m
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//
// ShellScriptAction.m
// ControlPlane
//
// Created by David Symonds on 23/04/07.
//
#import "DSLogger.h"
#import "ShellScriptAction.h"
#import "NSString+ShellScriptHelper.h"
@interface ShellScriptAction (Private)
- (NSMutableArray *) interpreterFromFile: (NSString *) file;
- (NSString *) interpreterFromExtension: (NSString *) file;
@end
@implementation ShellScriptAction
- (id)init
{
if (!(self = [super init]))
return nil;
path = [[NSString alloc] init];
return self;
}
- (id)initWithDictionary:(NSDictionary *)dict
{
if (!(self = [super initWithDictionary:dict]))
return nil;
path = [[dict valueForKey:@"parameter"] copy];
return self;
}
- (void)dealloc
{
[path release];
[super dealloc];
}
- (NSMutableDictionary *)dictionary
{
NSMutableDictionary *dict = [super dictionary];
[dict setObject:[[path copy] autorelease] forKey:@"parameter"];
return dict;
}
- (NSString *)description
{
return [NSString stringWithFormat:NSLocalizedString(@"Running shell script '%@'.", @""), path];
}
- (BOOL)execute:(NSString **)errorString
{
NSString *interpreter = @"";
// Split on "|", add "--" to the start so that the shell won't try to parse arguments
NSMutableArray *args = [[[path componentsSeparatedByString:@"|"] mutableCopy] autorelease];
[args insertObject:@"--" atIndex:0];
NSString *scriptPath = [args objectAtIndex: 1];
// ControlPlane is going to attempt to peek inside the script to figure out
// what interpreter needs to be called
NSMutableArray *shebangArgs = [scriptPath interpreterFromFile];
if (shebangArgs && [shebangArgs count] > 0) {
// get interpreter
interpreter = [shebangArgs objectAtIndex: 0];
[shebangArgs removeObjectAtIndex: 0];
// and it's parameters
if (shebangArgs.count > 0) {
[shebangArgs addObjectsFromArray: args];
args = shebangArgs;
}
}
// backup routine to try using the file extension if it exists
if ([interpreter isEqualToString: @""]) {
interpreter = [scriptPath interpreterFromExtension];
}
// ensure that the discovered interpreter is valid and executable
if ([interpreter isEqualToString: @""] || ![NSFileManager.defaultManager isExecutableFileAtPath:interpreter]) {
// can't determine how to run the script
DSLog(@"Failed to execute '%@' because ControlPlane cannot determine how to do so. Please use '#!/bin/bash' or similar in the script or rename the script with a file extension", path);
*errorString = NSLocalizedString(@"Unable to determine interpreter for shell script!", @"");
return NO;
}
// seems like everything is in order, launch the task
NSTask *task = [NSTask launchedTaskWithLaunchPath:interpreter arguments:args];
[task waitUntilExit];
if (task.terminationStatus != 0) {
DSLog(@"Failed to execute '%@'", path);
*errorString = NSLocalizedString(@"Failed executing shell script!", @"");
return NO;
}
return YES;
}
+ (NSString *)helpText
{
return NSLocalizedString(@"The parameter for ShellScript actions is the full path of the "
"shell script, which will be executed with /bin/sh.", @"");
}
- (id)initWithFile:(NSString *)file
{
self = [super init];
[path release];
path = [file copy];
return self;
}
+ (NSString *) friendlyName {
return NSLocalizedString(@"Run Shell Script", @"");
}
+ (NSString *)menuCategory {
return NSLocalizedString(@"System", @"");
}
@end