[launchd-dev] SMJobBless() fails to replace outdated version

Thomas tclementdev at free.fr
Fri Jan 27 11:53:15 PST 2017


Hello James,

If I remember correctly, you need special keys in your tool and app info plist files with codesigning designated requirements. Did you verify that these designated requirements verify correctly against the actual tool and app you are using while testing?

Regards,
Thomas

> On 27 Jan 2017, at 20:31, James Foster <james.foster at gemtalksystems.com> wrote:
> 
> According to Damien Sorresso, BSD Engineering, Apple Inc. (see https://lists.macosforge.org/pipermail/launchd-dev/2010-October/000834.html <https://lists.macosforge.org/pipermail/launchd-dev/2010-October/000834.html>), "ServiceManagement will check the CFBundleVersion of the tool and, if it's the same ..., will not overwrite it."
> 
> I've updated my code to show the CFBundleVersion of the tool both before and after a "successful" invocation of SMJobBless(). Is there anything I can do to get this to work?
> 
> 2017-01-27 09:10... existing: 	<string>84</string>
> 2017-01-27 09:10... replacement: 	<string>E6</string>
> 2017-01-27 09:10... SMJobBless(com.GemTalk.GemStone.Helper,...) returned true...
> 2017-01-27 09:10... now found: 	<string>84</string>
> 
>> On Jan 25, 2017, at 4:48 PM, James Foster <james.foster at gemtalksystems.com <mailto:james.foster at gemtalksystems.com>> wrote:
>> 
>> I am attempting to replace a helper tool. Most of the time if I increment the version (of my application and of the helper tool) then the new tool will be installed. Sometimes it won't be installed and I have to delete the old one manually. The problem seems to occur about every dozen versions or so, and once it happens the replacement will not occur even if I change the version numbers again.
>> 
>> https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?language=objc <https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?language=objc> states "If the job is already installed, success is returned.” 
>> 
>> How does SMJobBless() determine that the job is already installed? What do I need to do, beyond creating an entirely new job name, to make it look different enough to replace?
>> 
>> Following is my code and console output (from macOS 10.12.2).
>> 
>> James Foster
>> 
>> 
>> CODE:
>> 
>> - (void)installHelperTool;
>> {
>>     OSStatus status = AuthorizationCreate(...);
>>     // handle errors
>>     
>>     NSLog(@"existing: %@", [self system:@"/usr/bin/otool -P "
>> 	"/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | "
>> 	"grep -A 1 VersionString | tail -1"]);
>>     NSLog(@"replacement: %@", [self system:@"/usr/bin/otool -P "
>> 	"GemStone.app/Contents/Library/LaunchServices/com.GemTalk.GemStone.Helper | "
>> 	  "grep -A 1 VersionString | tail -1"]);
>>     CFErrorRef cfError = nil;
>>     if (SMJobBless(kSMDomainSystemLaunchd, (__bridge CFStringRef)@kHelperIdentifier, authRef, &cfError)) {
>>         NSLog(@"SMJobBless(%s,...) returned true; attempting (%s).", kHelperIdentifier, kShortVersionString);
>> 	NSLog(@"now found: %@", [self system:@"/usr/bin/otool -P "
>> 		 "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | "
>> 		"grep -A 1 VersionString | tail -1"]);
>>     } else {
>>         AppError(@"Helper tool installation failed: %@", [(__bridge NSError*) cfError localizedDescription]);
>>     }
>> }
>> 
>> 
>> CONSOLE:
>> 
>> default	14:25:04.368568 -0800	authd	Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (13,0)
>> default	14:25:04.889238 -0800	kernel	AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted.
>> default	14:25:04.385444 -0800	GemStone	existing: 	<string>1.3.3.9</string>
>> default	14:25:04.900905 -0800	kernel	AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted.
>> default	14:25:04.397113 -0800	GemStone	replacement: 	<string>1.4.0</string>
>> default	14:25:04.398426 -0800	authd	Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/usr/libexec/smd' [251] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (3,0)
>> default	14:25:04.408694 -0800	GemStone	SMJobBless(com.GemTalk.GemStone.Helper,...) returned true; attempting (1.4.0).
>> default	14:25:04.923798 -0800	kernel	AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted.
>> default	14:25:04.419988 -0800	GemStone	now found: 	<string>1.3.3.9</string>
>> 
> 
> _______________________________________________
> launchd-dev mailing list
> launchd-dev at lists.macosforge.org
> https://lists.macosforge.org/mailman/listinfo/launchd-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/launchd-dev/attachments/20170127/5652732f/attachment-0001.html>


More information about the launchd-dev mailing list