plaetzchen
plaetzchen

Reputation: 767

Mac OS X: Execute scripts with hooks from an application

Im building an cocoa app that monitors something™ and I am planning to have some hooks for users. So I want to enable the user to put a script (Bash, Ruby, Python you name it) with a specified name (let's say after_event) into the Application Support directory and that script gets executed after a certain event in my code. Ideally I could pass some variables to the script so the script knows what happened.

Any ideas on this?

So problem one is: How do I get the path of the Application Support "the SDK way"? problem two is: How do I execute script with variables like THAT_APPEND="foo"?

Thanks, Philip

Upvotes: 0

Views: 394

Answers (2)

plaetzchen
plaetzchen

Reputation: 767

Because sharing is caring here is the method that executes the scripts:

-(void) runScript:(NSString*)scriptName withVariables:(NSDictionary *)variables
{
NSString *appSupportPath = [NSFileManager defaultManager] applicationSupportDirectory];

        NSArray *arguments;
        NSString* newpath = [NSString stringWithFormat:@"%@/%@",appSupportPath, scriptName];
        if ([[NSFileManager defaultManager]fileExistsAtPath:newpath]){
            NSTask *task = [[NSTask alloc] init];
            [task setLaunchPath: newpath];

            NSLog(@"Executing hook: %@",newpath);
            arguments = [NSArray arrayWithObjects:newpath, nil];
            [task setArguments: arguments];

            [task setEnvironment:variables];

            NSPipe *pipe;
            pipe = [NSPipe pipe];
            [task setStandardOutput: pipe];

            NSFileHandle *file;
            file = [pipe fileHandleForReading];

            [task launch];

            NSData *data;
            data = [file readDataToEndOfFile];

            NSString *string;
            string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
            NSLog (@"script returned:\n%@", string);
        }

}

}

UPDATE: I updated the code to be more generic. Now NSTask will tell the kernel to execute the script directly so your user can not online use Bash scripts but also python, perl, php whatever she likes. The only thing she needs to use is a Shebang in that file.

The NSFileManager Category can be found here.

Upvotes: 1

Mike Lischke
Mike Lischke

Reputation: 53502

Look for NSTask documentation. There's an environment member you can manipulate. Also adding command line parameters in a form -name = value should be trivial.

Upvotes: 0

Related Questions