I have been trying to come up with a headless solution for transferring images from an eyefi card to my mac. The software from the vendor is decent, but it will only transfer images if there is a user logged into the computer. I want to use eye-fi cards in an office environment and want to configure it so that the images always are transferred from the card to my mac mini server running Mavericks Server.

So, I found this reference to a python application that does this and runs on synology devices. http://thijs.elenbaas.net/2013/03/installing-an-eye-fi-server-on-a-synology-nas/

I don't know anything about python except that OSX has it build in. So I downloaded the software from thijs.elenbaas.net/files/eyefiserver.tar.gz

and configured it on my mac. It appears to basically be a script called S99EyeFiServer.sh that runs a python app called eyefiserver.py

I had to make a few changes to the S99EyeFiServer.sh script to point it to the correct directories, primarily based on where the whole thing is installed on my mac AND the default pythonpath which on mac is different than on synology.

Bottom line, is I put the eyefi server files into a shared folder and modified the script with the file locations as such: PIDFILE=/Users/Shared/eyefi/eyefiserver/eyefiserver.pid DSTPATH=/Users/Shared/eyefi/eyefiserver PYTHONPATH=/usr/bin

Now, If i go to terminal and do S99EyeFiServer.sh restart or S99EyeFiServer.sh start. In process viewer, I can see a new process start called "Python" and voila the card will start transferring images. So, I at least know that this thing can work on the mac.

Great.

However, this still doesn't solve my problem. I need this thing to always run. It does not have any gui or require any interaction, so you ought to be able to run it as a global daemon, right?

So, I fire up launchcontrol and make a .plist for this global daemon

Label com.eyefi.load ProgramArguments /Users/Shared/eyefi/eyefiserver/rc.d/S99EyeFiServer.sh restart RunAtLoad

I load this, goto job, click start. nothing. no errors. python app doesn't start. no images.

Is it because I'm trying to run it in a shared folder? So i copied everything into usr/local/eyefiserver, reconfigure the paths and try again. Again, I can start it from the command line and it will work. I reconfigure the launch daemon to point it to the script again. Nothing.

I then tried playing with user:group settings in launchcontrol, trying to run it as one of my users, either either the setup in the usr/local folder or in the shared folder. Still nothing. tried a variety of other user:group settings. still nothing.

Any advice on making this work?

  • Could you dump out the launchd plist? I'd probably run this as a system daemon and make sure it had sockets and keep_alive set. You are using the 'LaunchControl` app to configure? – Tony Williams Jan 22 '14 at 6:08
up vote 1 down vote accepted

Don't point launchd to the init.d script but to the program the script executes. It is important that the program does not 'daemonize' (makes itself a background process) itself. This is launchd's job.

Put this in your ProgramArguments key and you should be fine:

<key>ProgramArguments</key>
<array>
    <string>/Users/Shared/eyefi/eyefiserver/bin/eyefiserver.py</string>
    <string>/Users/Shared/eyefi/eyefiserver/etc/eyefiserver.conf</string>
    <string>/Users/Shared/eyefi/eyefiserver/var/eyefiserver.log</string>
</array>

Ok, I've tried this again on a fresh install of everything and have it working. Here are the details

Step 1. In OSX Server, turn on Python in Websites

Step 2. Install the eyefi software. They put the software on the card, so you just need to look for it there and run the installer.

Step 3. Using the eye-fi helper software, setup the preferences for card as you like and add the wifi network you need. You need to do this on the computer that you will be using as the eyefi server because it stores the local hostname of the computer on the card. You also specify the directory here that you want photos and videos to be uploaded to (not 100% sure that you need to do this). I turned off cloud uploads and directaccess, but did turn on neverending memory on the card so that images will autodelete from the card.

Then, turn off the eyefi helper app and tell it not to load with startup.

Step 4. Find the upload key for your eyefi card by going to ~/Libary/Eye-Fi/Settings.xml. Open it with Xcode if you can, much easier to find things. You are looking for something like this:

long string of about 30 letters and numbers

You can also find the MAC address for the card in that file which is nice to have, especially if you use MAC addresses to restrict access to your wifi network(s).

Step 5. Then, you need to download the eyefi server software from:http://thijs.elenbaas.net/files/eyefiserver.tar.gz

I put it into Applications.

Step 6. Then, you have modify install.sh before running it.

Install.sh:

SRCPATH=/Applications/eyefiserver/eyefiserver

DSTPATH=/Applications/eyefiserver/eyefiserver

PYTHONPATH=/usr/bin

RCDPATH=/Applications/eyefiserver/rc.d

S99EyeFiServer.sh:

PYTHONPATH=/usr/bin

if you put your eyefiserver in a different directory, you will need to change these paramaters.

Step 7. Run install.sh from terminal. It will ask you for your Upload key (the long 30 digit number) and the directory you want to save files to. I made mine a folder called “Pictures” that I shared in OSX Server.

install.sh may spit out some errors, BUT if you’ve got the important stuff right, it will say the eyefi server has started and you are in business.

At this point, your OSX Server is running an eyefi server. Try taking a few pictures with your camera. In a minute or two, they ought to show up in your designated folder.

However, you want this to be running headless, without a logged in user.

Step 8. Setup a global daemon to autostart the eyefi server whenever you boot the computer. You start by making a .plist. I called mine com.eyefi.load.

Here it is:

<?xml version="1.0" encoding="UTF-8”?

 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd”> 

<plist version="1.0”> 

<dict> 

    <key>Label</key>

    <string>com.eyefi.load</string>

    <key>ProgramArguments</key> <array> 

        <string>/Applications/eyefiserver/eyefiserver/bin/eyefiserver.py</string>           <string>/Applications/eyefiserver/eyefiserver/etc/eyefiserver.conf</string>             <string>/Applications/eyefiserver/eyefiserver/var/eyefiserver.log</string> 

     </array> 

    <key>RunAtLoad</key> 

    <true/> 

if you put your eyefiserver in a different directory, you will need to change these paramaters.

chown this file to root:wheel

Step 9. Load the global daemon. I used LaunchControl, but you can also do this via command line.

Step 10. Start taking pictures!

Issues: The date/time stamping is way off. For me, they are stamped 8 hours behind when the picture was taken. I am in PST, which is GMT-8. I had my Nikon d3100 set to be in the Pacific Time Zone. If I change it to be in GMT, then the time stamping works out. I’m not sure what the implications are of having the camera set in the wrong time zone. I am not sure how else this could be fixed.

  • You have posted two answers now for this, which one is correct? – nohillside Aug 3 '14 at 15:03
  • The one that starts with "Ok, I've tried this again on a fresh install of everything and have it working." – ajm_from_sea Aug 3 '14 at 15:05

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.