[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6 Recipes

Note to Self: This section ideally should only give examples without really explaining the options, constraints etc. in depth - that should be done in the previous section on “Using ASynK” where the complete documentation for every flag in the system will be documented, and will the authoritative single reference for such things. This will entail some reorg of the doc content and much additional content as well...

The easiest way to get used to AsynK is to look at some examples. This chapter contains some of the simplest use cases. You can refer to section Using ASynK, for detailed documentation on each flag, legal and illegal options, etc.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.1 Basic Usage: using the default sync profiles

$ ./asynk.py --op=sync [--dry-run] [--log=debug]

ASynK comes with two default profiles to help you get a quick feel for the sync features.

When you run the above mentioned command on a windows box a default profile called defolbb kicks in and contacts in your ~/.bbdb file are bi-directionally synced to your default Outlook folder.

On any non-windows platform, your ~/.bbdb is merely “synched” to another BBDB file in /tmp/asynk.bbdb. The default profile that kicks in is defbbbb

Note: In earlier versions the default profiles helped you sync easily to your Google account, but due to some changes that Google made to its authentication flow, a simple no-frills sync is no longer possible. Setting up Google sync is covered elsewhere in this documentation.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2 Explore Folders and Create Synk Profile

  1. Determine the PIMDBs you want to sync - i.e. select two from bb, gc, and ol
  2. Determine the Message Stores you want to sync - remember that for Google, a message store is an account with login credentials, for Outlook it maps to an Outlook MessageStore (IDs are obtained from a --op=list-folders command shown below), and for BBDB it is a file - specified by a filename. The Stores are specified with the --store=<storeid, storeid> option.
  3. List the folders you have in your Message Stores to identify the folders that actually contain the Items you want to synchronize.
    Cardassia:Gout sriramkarra$ python asynk.py --op=list-folders --db gc --store karra.etc < login.auth
    [18:08:08.216     INFO] Debug logging to file: /Users/sriramkarra/stuff/code/python/Gout/logs/asynk_logs.2012-05-09.18-08-08.216602
    [18:08:08.572     INFO] Logging into Google...
    [18:08:10.603     INFO] Listing all folders in PIMDB gc...
    [18:08:11.797     INFO]   0: Contacts Name: System Group: My Contacts ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/6
    [18:08:11.797     INFO]   1: Contacts Name: System Group: Friends     ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/d
    [18:08:11.797     INFO]   2: Contacts Name: System Group: Family      ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/e
    [18:08:11.797     INFO]   3: Contacts Name: System Group: Coworkers   ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/f
    [18:08:11.797     INFO]   4: Contacts Name: TestBB                    ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/2fae451c0fe771d5
    [18:08:11.797     INFO]   5: Contacts Name: Gout                      ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/41baff770f898d85
    [18:08:11.798     INFO]   6: Contacts Name: Starred in Android        ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/5254f4a808c5e7d8
    [18:08:11.798     INFO] Listing all folders in PIMDB gc...done
    

    The output should be self explanatory. The group ID is the full URI in the last column of output. A few things to note:

    1. For a google sync profile operation, if a –store option is skipped, the user is prompted for a username and password from stdin. If a –store option is given on the command line, it is used as the login name and only the password is prompted for.
    2. In the above example, we have stored the password (in plain text) in a file called “login.auth” and piping it to ASynK.
    Cardassia:Gout sriramkarra$ ./asynk.py --op=list-folders --db bb --store test/bbdb.utah.ver7
    [18:27:07.147     INFO] Debug logging to file: /Users/sriramkarra/stuff/code/python/Gout/logs/asynk_logs.2012-05-09.18-27-07.147160
    [18:27:07.149     INFO] Parsing BBDB file /Users/sriramkarra/stuff/code/python/Gout/test/bbdb.utah.ver7...
    [18:27:07.396     INFO] Successfully parsed 338 entries.
    [18:27:07.396     INFO] Listing all folders in PIMDB bb...
    [18:27:07.396     INFO]   1: Contacts.	Name: default;	GID: default;	
    [18:27:07.396     INFO] Listing all folders in PIMDB bb...done
    

    Here we passed the relative path of a BBDB file to list-folders. Recall that for BBBD the message store is the full BBDB file. In this instance the store is a typical BBDB database file where no contacts have the folder notes field, hence all of them are put in the “default” folder. Note how the name and ID of the folder are the same.

    TODO: Insert a sample Outlook list-folders
    
  4. Optionally you would like to create a folder in one of the Message Stores to hold your synchronized contacts. While you can create new folders in the native UI of Google Contacts or Outlook and use them with ASynK, we just provide a convenience option of creating one from the command line.
    Cardassia:Gout sriramkarra$ ./asynk.py --op create-folder --name 'Demo' --db gc --store karra.etc@gmail.com < login.auth
    [22:30:00.827     INFO] Debug logging to file: /Users/sriramkarra/stuff/code/python/Gout/logs/asynk_logs.2012-05-12.22-30-00.827089
    [22:30:00.829     INFO] Logging into Google...
    [22:30:02.871     INFO] Successfully created group. ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/6c2034580ea2ac15
    
    Cardassia:Gout sriramkarra$ ./asynk.py --op=list-folders --db gc --store karra.etc < login.auth
    [22:30:08.870     INFO] Debug logging to file: /Users/sriramkarra/stuff/code/python/Gout/logs/asynk_logs.2012-05-12.22-30-08.870610
    [22:30:08.872     INFO] Logging into Google...
    [22:30:09.899     INFO] Listing all folders in PIMDB gc...
    [22:30:10.331     INFO]   0: Contacts Name: System Group: My Contacts ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/6
    [22:30:10.332     INFO]   1: Contacts Name: System Group: Friends     ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/d
    [22:30:10.332     INFO]   2: Contacts Name: System Group: Family      ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/e
    [22:30:10.332     INFO]   3: Contacts Name: System Group: Coworkers   ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/f
    [22:30:10.332     INFO]   4: Contacts Name: TestBB                    ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/2fae451c0fe771d5
    [22:30:10.332     INFO]   5: Contacts Name: Gout                      ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/41baff770f898d85
    [22:30:10.333     INFO]   6: Contacts Name: Starred in Android        ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/5254f4a808c5e7d8
    [22:30:10.333     INFO]   7: Contacts Name: Demo                      ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/6c2034580ea2ac15
    [22:30:10.333     INFO]   8: Contacts Name: For Testing OLGC          ID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/727ac1f9891121f7
    

    As we can see, the new folder has been created successfully.

  5. List your sync profiles. When you first start out, there is only a dummy sync profile, whose only purpose for existence is so you can do a list-profiles with your shiny new ASynK download :-) So let’s do it.
    Creating default state.json to hold application status
    [22:35:00.058     INFO] Debug logging to file: /Users/sriramkarra/stuff/code/python/ASynK/logs/asynk_logs.2012-05-12.22-35-00.058672
    [22:35:00.060     INFO] 
    [22:35:00.060     INFO] *** Profile   : sample ***
    [22:35:00.061     INFO]   Collection 1: 
    [22:35:00.061     INFO]     DB ID     : gc
    [22:35:00.061     INFO]     Store ID  : karra.etc@gmail.com
    [22:35:00.061     INFO]     Folder ID : http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/2fae451c0fe771d5
    [22:35:00.062     INFO]   Collection 2: 
    [22:35:00.062     INFO]     DB ID     : bb
    [22:35:00.062     INFO]     Store ID  : test/bbdb.utah.ver7
    [22:35:00.062     INFO]     Folder ID : default
    [22:35:00.062     INFO]   sync_start  : 1980-01-01T00:00:00.00+00:00
    [22:35:00.062     INFO]   sync_stop   : 1980-01-01T00:00:00.00+00:00
    [22:35:00.063     INFO]   sync_dir    : SYNC2WAY
    [22:35:00.063     INFO]   confl_res   : gc
    [22:35:00.063     INFO]   olgid       : 0x9001
    

    The output should be fairly self explanatory. The sample profile is between a GC folder and the default folder in a specific BBDB store. It also specifies that the sync should be two way, and You do not have to understand what “olgid” means. This is

  6. You would create up a sync profile that specifies the various details ASynK needs to know to perform a sync. (See section ASynK Profile). From here on your regular sync is done through a reference to the profile name, and you do not have to type out all the confusing IDs etc. every time.
    Cardassia:Gout sriramkarra$ python asynk.py --op=create-profile --db gc bb  \
    --folder 'http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/2fae451c0fe771d5' \
    'default' --store karra.etc 'test/bbdb.olbb' --name etcbb3
    [00:33:39.347     INFO] Debug logging to file: /Users/sriramkarra/stuff/code/python/Gout/logs/asynk_logs.2012-05-13.00-33-39.347515
    [00:33:39.373     INFO] Successfully added profile: etcbb3
    

    The --op=create-profile operation takes two dbids, two store ids and two folder ids. The command line is quite a handful, but you should not have to repeat this operation too often. It is worth noting the following about the options passed:

    Cardassia:Gout sriramkarra$ python asynk.py --op=list-profiles
    [00:34:44.785     INFO] Debug logging to file: /Users/sriramkarra/stuff/code/python/Gout/logs/asynk_logs.2012-05-13.00-34-44.785442
    [00:34:44.787     INFO] 
    [00:34:44.790     INFO] *** Profile   : etcbb3 ***
    [00:34:44.790     INFO]   Collection 1: 
    [00:34:44.790     INFO]     DB ID     : gc
    [00:34:44.790     INFO]     Store ID  : karra.etc
    [00:34:44.790     INFO]     Folder ID : http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/2fae451c0fe771d5
    [00:34:44.791     INFO]   Collection 2: 
    [00:34:44.791     INFO]     DB ID     : bb
    [00:34:44.791     INFO]     Store ID  : test/bbdb.olbb
    [00:34:44.791     INFO]     Folder ID : default
    [00:34:44.791     INFO]   sync_start  : 1980-01-01T00:00:00.00+00:00
    [00:34:44.791     INFO]   sync_stop   : 1980-01-01T00:00:00.00+00:00
    [00:34:44.791     INFO]   sync_dir    : SYNC2WAY
    [00:34:44.791     INFO]   confl_res   : gc
    [00:34:44.791     INFO]   olgid       : 0x0
    [00:34:44.792     INFO] 
    [00:34:44.792     INFO] *** Profile   : sample ***
    [00:34:44.792     INFO]   Collection 1: 
    [00:34:44.792     INFO]     DB ID     : gc
    [00:34:44.792     INFO]     Store ID  : karra.etc@gmail.com
    [00:34:44.792     INFO]     Folder ID : http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/3b83f70e88fa08bd
    [00:34:44.792     INFO]   Collection 2: 
    [00:34:44.792     INFO]     DB ID     : ol
    [00:34:44.792     INFO]     Store ID  : None
    [00:34:44.792     INFO]     Folder ID : AAAAADWE5+lnNclLmn8GpZUD04eCRRoA
    [00:34:44.792     INFO]   sync_start  : 1980-01-01T00:00:00.00+00:00
    [00:34:44.793     INFO]   sync_stop   : 1980-01-01T00:00:00.00+00:00
    [00:34:44.793     INFO]   sync_dir    : SYNC2WAY
    [00:34:44.793     INFO]   confl_res   : gc
    [00:34:44.793     INFO]   olgid       : 0x9001
    

    And as we can confirm the new profile is now set up and available for use. Please note that there is not much error checking at the time of profile creation. For e.g. it is the user’s responsibility to ensure there is a specified folder and store in a given pimdb, etc. If there are any errors, they will show up in subsequent sync operations.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.3 Sync Actions and Related Cleanup

  1. Perform a “dry run” to get a sense of how many contacts are going to get copied from where to where.
    Cardassia:Gout sriramkarra$ python asynk.py --op=sync --dry-run --name etcbb2 < login.auth
    [00:53:10.643     INFO] Debug logging to file: /Users/sriramkarra/stuff/code/python/Gout/logs/asynk_logs.2012-05-13.00-53-10.643187
    [00:53:10.648     INFO] Logging into Google...
    [00:53:12.143     INFO] Parsing BBDB file /Users/sriramkarra/stuff/code/python/Gout/test/bbdb.utah.ver7...
    Password: [00:53:12.291     INFO] Successfully parsed 338 entries.
    [00:53:12.291     INFO] BBDB database not backed up for dry run
    [00:53:12.292     INFO] Last synk for profile etcbb2 was at: 2012-05-11T11:01:56.57Z
    [00:53:12.292     INFO] Querying Google for status of Contact Entries...
    [00:53:13.157     INFO] Response received from Google. Processing...
    [00:53:13.157     INFO] No entries in feed.
    [00:53:13.159     INFO] ==== gc =====
    [00:53:13.160     INFO]    New              :     0
    [00:53:13.160     INFO]    Modified         :     0
    [00:53:13.160     INFO]    Unchanged        :     0
    [00:53:13.160     INFO]                       =====
    [00:53:13.160     INFO]    Total Entries    :     0
    [00:53:13.160     INFO]    Deleted          :     0
    [00:53:13.160     INFO] ==== bb =====
    [00:53:13.161     INFO]    New              :     0
    [00:53:13.161     INFO]    Modified         :     0
    [00:53:13.161     INFO]    Unchanged        :   338
    [00:53:13.161     INFO]                       =====
    [00:53:13.161     INFO]    Total Entries    :   338
    [00:53:13.161     INFO]    Deleted          :     0
    [00:53:13.161     INFO] Number of entries modified both places (conflicts): 0
    [00:53:13.162     INFO] conflict resolve direction : bb. db1id: gc, db2id: bb
    [00:53:13.162     INFO] After conflict resolution, size of gc mod :     0
    [00:53:13.162     INFO] After conflict resolution, size of bb mod :     0
    

    It’s not technically a complete dry run. For now we just get a summary of stats of what will happen during a proper sync. In the above run we see that there are no new entries or modifications at either end. Essentially if you perform a sync now, no entries need to be copied from anywhere to anywhere.

    Let’s see one more example, this time with a sync profile containing an Outlook folder.

    Z:\Gout>python asynk.py --op=sync --name realolbb --dry-run
    [11:26:33.790     INFO] Debug logging to file: Z:\Gout\logs\asynk_logs.2012-05-13.11-26-33.791000
    [11:26:33.868     INFO] Parsing BBDB file Z:\Gout\test/bbdb.olbb...
    [11:26:33.930     INFO] Successfully parsed 0 entries.
    [11:26:33.930     INFO] Initalizing MAPI...
    [11:26:34.368     INFO] Initalizing MAPI...done
    [11:26:34.368     INFO] Opening default profile in MAPI...
    [11:26:34.476     INFO] Opening default profile in MAPI...done
    [11:26:34.789     INFO] Looking for PIM folders in message store: Personal Folders...
    [11:26:34.805     INFO] Appointments not supported. Ignoring.
    [11:26:34.944     INFO] Looking for PIM folders in message store: Personal Folders...done
    [11:26:35.256     INFO] Looking for PIM folders in message store: Master Task List...
    [11:26:35.273     INFO] Appointments not supported. Ignoring.
    [11:26:35.273     INFO] Appointments not supported. Ignoring.
    [11:26:35.647     INFO] Looking for PIM folders in message store: Master Task List...done
    [11:26:37.674     INFO] BBDB database not backed up for dry run
    [11:26:37.690     INFO] Last synk for profile realolbb was at: 2012-05-12T02:38:08.34Z
    [11:26:37.690     INFO] Querying MAPI for status of Contact Entries
    [11:26:37.706     INFO] Data obtained from MAPI. Processing...
    [11:26:37.706     INFO] ==== bb =====
    [11:26:37.706     INFO]    New              :     0
    [11:26:37.706     INFO]    Modified         :     0
    [11:26:37.706     INFO]    Unchanged        :     0
    [11:26:37.706     INFO]                       =====
    [11:26:37.706     INFO]    Total Entries    :     0
    [11:26:37.706     INFO]    Deleted          :     0
    [11:26:37.706     INFO] ==== ol =====
    [11:26:37.706     INFO]    New              :     2
    [11:26:37.706     INFO]    Modified         :     0
    [11:26:37.706     INFO]    Unchanged        :     0
    [11:26:37.721     INFO]                       =====
    [11:26:37.721     INFO]    Total Entries    :     2
    [11:26:37.721     INFO]    Deleted          :     0
    [11:26:37.721     INFO] Number of entries modified both places (conflicts): 0
    [11:26:37.721     INFO] conflict resolve direction : bb. db1id: bb, db2id: ol
    [11:26:37.721     INFO] After conflict resolution, size of bb mod :     0
    [11:26:37.721     INFO] After conflict resolution, size of ol mod :     0
    
  2. Perform the actual sync. Note that we do not provide a --name argument to specify the profile name. ASynK will remember the last profile that was operated on and use it in case a --name is not explicitly specified.
    Z:\Gout>python asynk.py --op=sync
    [11:26:56.769     INFO] Debug logging to file: Z:\Gout\logs\asynk_logs.2012-05-13.11-26-56.769000
    [11:26:56.769     INFO] Parsing BBDB file Z:\Gout\test/bbdb.olbb...
    [11:26:56.769     INFO] Successfully parsed 0 entries.
    [11:26:56.769     INFO] Initalizing MAPI...
    [11:26:57.144     INFO] Initalizing MAPI...done
    [11:26:57.144     INFO] Opening default profile in MAPI...
    [11:26:57.253     INFO] Opening default profile in MAPI...done
    [11:26:57.549     INFO] Looking for PIM folders in message store: Personal Folders...
    [11:26:57.579     INFO] Appointments not supported. Ignoring.
    [11:26:57.782     INFO] Looking for PIM folders in message store: Personal Folders...done
    [11:26:58.016     INFO] Looking for PIM folders in message store: Master Task List...
    [11:26:58.048     INFO] Appointments not supported. Ignoring.
    [11:26:58.063     INFO] Appointments not supported. Ignoring.
    [11:26:58.312     INFO] Looking for PIM folders in message store: Master Task List...done
    [11:27:00.591     INFO] Backedup BBDB Store (Z:\Gout\test/bbdb.olbb) to file: Z:\Gout\./backups\bbdb_backup.realolbb.2012-05-13.
    -27-00.591000
    [11:27:00.684     INFO] Last synk for profile realolbb was at: 2012-05-12T02:38:08.34Z
    [11:27:00.684     INFO] Querying MAPI for status of Contact Entries
    [11:27:00.684     INFO] Data obtained from MAPI. Processing...
    [11:27:00.684     INFO] ==== bb =====
    [11:27:00.684     INFO]    New              :     0
    [11:27:00.684     INFO]    Modified         :     0
    [11:27:00.684     INFO]    Unchanged        :     0
    [11:27:00.684     INFO]                       =====
    [11:27:00.716     INFO]    Total Entries    :     0
    [11:27:00.716     INFO]    Deleted          :     0
    [11:27:00.716     INFO] ==== ol =====
    [11:27:00.716     INFO]    New              :     2
    [11:27:00.716     INFO]    Modified         :     0
    [11:27:00.730     INFO]    Unchanged        :     0
    [11:27:00.730     INFO]                       =====
    [11:27:00.730     INFO]    Total Entries    :     2
    [11:27:00.730     INFO]    Deleted          :     0
    [11:27:00.730     INFO] Number of entries modified both places (conflicts): 0
    [11:27:00.730     INFO] conflict resolve direction : bb. db1id: bb, db2id: ol
    [11:27:00.730     INFO] After conflict resolution, size of bb mod :     0
    [11:27:00.730     INFO] After conflict resolution, size of ol mod :     0
    [11:27:00.730     INFO] =====================================================
    [11:27:00.730     INFO]    Sending New bb entries to ol
    [11:27:00.730     INFO] =====================================================
    [11:27:00.730     INFO] No new entries that need to be synched
    [11:27:00.730     INFO] =====================================================
    [11:27:00.730     INFO]    Sending Modified bb entries to ol
    [11:27:00.746     INFO] =====================================================
    [11:27:00.746     INFO] No modified entries that need to be synched
    [11:27:00.746     INFO] =====================================================
    [11:27:00.746     INFO]    Sending New ol entries to bb
    [11:27:00.746     INFO] =====================================================
    [11:27:00.746     INFO] 2 new entries to be synched.
    [11:27:00.809     INFO] Saving BBDB File Z:\Gout\test/bbdb.olbb...
    [11:27:00.809     INFO] =====================================================
    [11:27:00.996     INFO]    Sending Modified ol entries to bb
    [11:27:00.996     INFO] =====================================================
    [11:27:00.996     INFO] No modified entries that need to be synched
    

    We see that the output from a dry-run operation is repeated, and then the actual two way sync happens. Note the following:

    1. The BBDB file is backed up before any modifications are made. The location is echoed to the console as an INFO message. It is also captured in a log file as noted.
    2. If there are *any* errors during a sync operation, the timestamps are not updated, however some of the database entries may well have been made persistent, and it is not possible to roll back. In database terms, ASynK does not do transactional writes and roll backs. This could create problems if there are too many failures. It’s a lot of work to change this behaviour. So let’s study the problem in the field and take a call on how to tackle it.

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4 Synching to CardDAV

Setting up a profile to sync with a CardDAV profile may be a bit confusing at best, and downright intimidating at worst. Part of the problem is the Store ID itself is a URL, and it is not a standard - varying from one software to another.

A reminder - CardDAV support is the newest feature in ASynK, and there may be some rough edges. Also most CardDAV servers do not allow a roll back - like Gmail does - to recover any lost data. So convince yourself that ASynK will work for you before you start using it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4.1 Creating a profile with CardDAV

   $ ./asynk.py --op=create-profile --name testbbcd --user-dir=~/.asynk.cd --db bb cd --folder default default --store <opath-to-bbdb-file> <CardDAV URL> --cduser=<username>

Ensure you are able to login to your account properly.

   $ ./asynk.py --op=sync --user-dir=~/.asynk.cd --name testbbcd --dry-run
   $ ./asynk.py --op=sync --user-dir=~/.asynk.cd --name testbbcd

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4.1.1 CardDAV URL to use for the –store parameter

The thing that confuses most people is the CardDAV url which is not in any standard format. Here are some of the known CardDAV servers, and the URL that usually works with them. Replace server.org with the name of your CardDAV server. If your server is not to be found here, a good way to search the internet for the URL to use is to use a software like Addressbook in OS X; the same URL will work with ASynK as well.

  1. Apple CalendarServer: https://server.org:8443/ or http://server.org/
  2. OwnCloud: https://server.org/owncloud/remote.php/carddav
  3. Baikal Server: http://server.org/card.php

Note that for the port number may be optional. If Apple CalendarServer is configured to respond to both http and https the a port number will be required. Check your server documentation.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4.1.2 CardDAV URL to use for the –folder parameter

You can just use “default” as the folder ID. But if you feel like using a specific folder, note that the foid parameter in your state.json should look like the following for each of the tested CardDAV servers:

  1. Apple CalendarServer: /addressbooks/__uids__/skarrag/addressbook/
  2. OwnCloud: /owncloud/remote.php/carddav/addressbooks/skarra/contacts/
  3. Baikal Server: /card.php/addressbooks/skarra/default/

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.5 Synching to Microsoft Exchange

A reminder - Exchange support is the newest feature in ASynK, and there may be some rough edges. We have taken care to ensure that any deletes from the server move the contacts to the Trash Bin from where you can recover items if something goes wrong. However convince yourself that ASynK works fine before using it with your prodcution data.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.5.1 Creating a profile with Exchange

   $ ./asynk.py --op=create-profile --name testbbex --db bb ex --folder default Contacts --store <opath-to-bbdb-file> <Exchange URL>

The Exchange URL is of the form: https://outlook.office365.com/EWS/Exchange.asmx - you should ask your system administrator.

Ensure you are able to login to your account properly.

   $ ./asynk.py --op=sync --user-dir=~/.asynk.cd --name testbbcd --dry-run

If everything works fine, you can try out without the dry-run option.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.6 Misc Housekeeping Activities

  1. Clear Sync Flags from Contact Entries. Recall that ASynK stores some tracking information (such as the contact’s IDs in other remote folders) as custom user fields. These custom fields are readily viewable and editable in Google Contacts and BBDB, and as you can manually edit or delete them on a per contact basis, if you so desire (although it is most definitely not recommended). MS Outlook, on the other hand, does not provide any reasonable way to view or manipulate these fields.

    ASynK provides an automated way to clear out sync related tags from a specified folder. It is best explained through a few examples. But before you should know that ASynK tracks IDs using properties with labels like: “asynk:profile:ol”. There are three parts separated by a colon. The first part is always asynk. The middle portion is the name of the profile. The last portion is the PIMDB ID in whose ID we are tracking.

    The --op=clear-sync-artifacts operation takes a dbid (mandatory), a storeid and a folderid. If the storeid or folderid are missing ASynK tries to use defaults or query the user as per conventions explained earlier (TODO: insert ref). The final argument is the most interesting: it is a regular expression to match against the custom properties of contacts in the specified folder.

    Z:\Gout>python asynk.py --op=clear-sync-artifacts --db bb --store test/bbdb.olbb --label-re="asynk:realobb"
    [10:59:05.456     INFO] Debug logging to file: Z:\Gout\logs\asynk_logs.2012-05-13.10-59-05.456000
    [10:59:05.456     INFO] Parsing BBDB file Z:\Gout\test/bbdb.olbb...
    [10:59:05.456     INFO] Successfully parsed 20 entries.
    [10:59:05.470     INFO] Found 0 contacts with matching sync tag(s).
    [10:59:05.470     INFO] Saving BBDB File Z:\Gout\test/bbdb.olbb...
    

    In the above example, we try to delete any sync labels for the realolbb profile. The output shows that there were 20 entries in all, but nothing was really cleared out as there were no matches.

    Z:\Gout>python asynk.py --op=clear-sync-artifacts --db ol --folder "AAAAADWE5+lnNclLmn8GpZUD04ciRhoA" --label-re="asynk:"
    [11:08:42.651     INFO] Debug logging to file: Z:\Gout\logs\asynk_logs.2012-05-13.11-08-42.652000
    [11:08:42.667     INFO] Initalizing MAPI...
    [11:08:43.134     INFO] Initalizing MAPI...done
    [11:08:43.134     INFO] Opening default profile in MAPI...
    [11:08:43.275     INFO] Opening default profile in MAPI...done
    [11:08:43.602     INFO] Looking for PIM folders in message store: Personal Folders...
    [11:08:43.618     INFO] Appointments not supported. Ignoring.
    [11:08:43.836     INFO] Looking for PIM folders in message store: Personal Folders...done
    [11:08:44.101     INFO] Looking for PIM folders in message store: Master Task List...
    [11:08:44.101     INFO] Appointments not supported. Ignoring.
    [11:08:44.118     INFO] Appointments not supported. Ignoring.
    [11:08:44.710     INFO] Looking for PIM folders in message store: Master Task List...done
    [11:08:46.957     INFO] Querying MAPI for all data needed to clear flag
    [11:08:46.957     INFO] Data obtained from MAPI. Clearing one at a time
    [11:08:47.174     INFO] Entries cleared: 2. Errors: 0; i: 2
    

    In the above example we try to clear out all the sync tags in the specified outlook folder. The final line of output shows us that 2 entries had ASynK sync tags, and they have been cleared out.

  2. Delete a profile
    Cardassia:Gout sriramkarra$ python asynk.py --op=del-profile  \
    --name etcbb3 < login.auth
    [11:45:09.153     INFO] Debug logging to file: /Users/sriramkarra/stuff/code/python/Gout/logs/asynk_logs.2012-05-13.11-45-09.153824
    [11:45:09.191     INFO] Logging into Google...
    [11:45:10.994     INFO] Parsing BBDB file /Users/sriramkarra/stuff/code/python/Gout/test/bbdb.olbb...
    Password: [11:45:11.073     INFO] Successfully parsed 2 entries.
    [11:45:11.073     INFO] Fetching contact entries from Google for folder TestBB...
    [11:45:14.310     INFO] Clearing sync state information...
    [11:45:14.313     INFO] Found 0 contacts with matching sync tag(s). 
    [11:45:14.321     INFO] Found 0 contacts with matching sync tag(s). 
    [11:45:14.322     INFO] Saving BBDB File /Users/sriramkarra/stuff/code/python/Gout/test/bbdb.olbb...
    [11:45:14.655     INFO] Successfully deleted the profile etcbb3 from your Asynk configuration.
    

    This does two things: remove the sync artifacts from both folders in the profile, and if there are no errors, remove the profile itself from the profile list.

  3. Show a summary of Items in a given folder. Currently implemented for Google Contacts, this the --op=show-folder operation can give you a one line summary of all contacts in google folder.
    Cardassia:Gout sriramkarra$ python asynk.py --op=show-folder --db gc \
    --store karra.etc --folder \
    "http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/2fae451c0fe771d5" \
     < login.auth
    [11:43:01.339     INFO] Debug logging to file: /Users/sriramkarra/stuff/code/python/Gout/logs/asynk_logs.2012-05-13.11-43-01.339125
    [11:43:01.389     INFO] Logging into Google...
    [11:43:03.330     INFO] Contacts.	Name: TestBB;	GID: http://www.google.com/m8/feeds/groups/karra.etc%40gmail.com/base/2fae451c0fe771d5;	
    [11:43:03.330     INFO] Summary of contained Items:
    [11:43:06.318     INFO]   Name: Nicholas F. Cianfrocco    Itemid: https://www.google.com/m8/feeds/contacts/karra.etc%40gmail.com/full/86079960ff67a85
    [11:43:06.318     INFO]   Name: K. V. Krishna Kumar       Itemid: https://www.google.com/m8/feeds/contacts/karra.etc%40gmail.com/full/2ed62fa40b90b0bd
    [11:43:06.318     INFO]   Name: ASR Murthy                Itemid: https://www.google.com/m8/feeds/contacts/karra.etc%40gmail.com/full/6c856cd68dae99df
    [11:43:06.318     INFO]   Name: Ed Herring                Itemid: https://www.google.com/m8/feeds/contacts/karra.etc%40gmail.com/full/1041bce089860054
    [11:43:06.318     INFO]   Name: Parveen Kumar Patel       Itemid: https://www.google.com/m8/feeds/contacts/karra.etc%40gmail.com/full/360448d50a2c6bda
    [11:43:06.319     INFO]   Name: Ashwin M. Krishnakumar    Itemid: https://www.google.com/m8/feeds/contacts/karra.etc%40gmail.com/full/10bec2800bd7c9e7
    

    Here we get the name and Google ID of the contact for all contacts in the specified folder.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on November 10, 2017 using texi2html 5.0.