Minor rearrangements to whenjobs(1) manpage.
[whenjobs.git] / tools / whenjobs.pod
1 =encoding utf8
2
3 =head1 NAME
4
5 whenjobs - A powerful but simple cron replacement
6
7 =head1 SYNOPSIS
8
9 Editing the jobs script:
10
11  whenjobs -e | --edit
12  whenjobs -l | --list
13
14 Get and set variables:
15
16  whenjobs --get variable
17  whenjobs --set variable=value [variable=value ...]
18  whenjobs --variables
19
20 Start and stop the per-user daemon:
21
22  whenjobs --daemon-start
23  whenjobs --daemon-stop
24  whenjobs --daemon-status
25  whenjobs --daemon-restart
26
27 Examine running jobs:
28
29  whenjobs --jobs
30  whenjobs --cancel serial
31  whenjobs --start "name"
32  whenjobs --tail serial
33
34 =head1 DESCRIPTION
35
36 Whenjobs is a powerful but simple replacement for cron.  It lets you
37 run jobs periodically like cron, but it also lets you trigger jobs to
38 run when user-defined variables are set or change value.
39
40 Periodic jobs are written like this:
41
42  every 10 minutes :
43  <<
44    # Get the current load average.
45    load=`awk '{print $1}' /proc/loadavg`
46    whenjobs --set --type float load=$load
47  >>
48
49 When-statements let you create jobs that run based on variables set
50 elsewhere:
51
52  when load >= 6 :
53  <<
54    mail -s "ALERT: high load average: $load" $LOGNAME < /dev/null
55  >>
56
57 (When statements are "edge-triggered", meaning that this job will only
58 run when the load goes from under 6 to E<ge> 6).
59
60 Like L<crontab(5)>, whenjobs are controlled by a jobs file which can
61 be edited from the command line:
62
63  $ whenjobs -e
64
65 Whenjobs uses a daemon called L<whenjobsd(8)>.  Unlike crond, this
66 daemon runs as the same user.  Each user who wants to use whenjobs
67 starts their own daemon:
68
69  $ whenjobs --daemon-start
70
71 You can also have the daemon start as you when the machine boots by
72 adding the following line to a boot file such as C</etc/rc.local>.
73 Replace C<username> with your username:
74
75  su username -c /usr/sbin/whenjobsd
76
77 Variables are the key to expressing dependencies between whenjobs.
78 Variables are stored (per-user) in the daemon.  You can use the
79 command line tool to examine and set variables:
80
81  $ whenjobs --variables
82  JOBSERIAL=297
83  libguestfs_build_local=1.17.16
84  libguestfs_commit=7e32d892d76a31f55e2a4151902623b9949e3efa
85  libguestfs_dist=1.17.16
86  libguestfs_release=1.17.16
87  libguestfs_stable_build_local=1.16.10
88  libguestfs_stable_commit=27433a0a335301441b1eb6244ba425c2c44b2d99
89  libguestfs_stable_dist=1.16.10
90  libguestfs_stable_release=1.16.10
91  libguestfs_stable_version=1.16.10
92  libguestfs_version=1.17.16
93  $ whenjobs --set cat=sushi
94  $ whenjobs --get cat
95  sushi
96
97 Note: The act of setting a variable (using I<--set>) can trigger jobs
98 to run.
99
100 You can also list out what jobs are running:
101
102  $ whenjobs --jobs
103  287 libguestfs-stable: fedora 16
104     running in: /tmp/whenjobsa2afc44fd757465f95438309f1a51609
105     started at: 2012-03-13 10:59:37
106
107 and you can 'tail' the output of running jobs which is useful for
108 debugging:
109
110  $ whenjobs --tail 287
111  Uploading: 147496271972717053d46b82a07435ca  libguestfs-1.16.10.tar.gz
112
113 You can start and cancel jobs manually:
114
115  $ whenjobs --start 'libguestfs: poll'
116  $ whenjobs --cancel 287
117
118 =head1 OPTIONS
119
120 =over 4
121
122 =item B<--cancel> serial
123
124 Cancel the job with the given serial number.
125
126 Use I<--jobs> to list running jobs along with their serial numbers.
127 The serial number is also available in the job script (as
128 C<$JOBSERIAL>) and in the log file.
129
130 =item B<--daemon-start>
131
132 =item B<--daemon-stop>
133
134 Start and stop the per-user daemon.
135
136 =item B<--daemon-status>
137
138 Prints the status of the daemon: C<up> or C<down>.
139
140 =item B<--daemon-restart>
141
142 Restart the daemon.  (If it is not running, then this command
143 starts it).
144
145 =item B<-e>
146
147 =item B<--edit>
148
149 Edit the jobs script.  If you make changes to the jobs script, then it
150 is automatically uploaded to the daemon.
151
152 The C<$EDITOR> environment variable is used for editing.  If not set,
153 C<vi> is used.
154
155 =item B<--get> variable
156
157 Print the value of a variable.
158
159 =item B<-help>
160
161 =item B<--help>
162
163 Display brief usage and exit.
164
165 =item B<--job-names>
166
167 List the names of all loaded jobs (whether they are running or not).
168 Use I<--jobs> to list running jobs.
169
170 =item B<--jobs>
171
172 List all running jobs.
173
174 Note that it is possible for the same job to be running more than once
175 (for example, a periodic job that takes longer than the period to run).
176
177 =item B<-l>
178
179 =item B<--list>
180
181 List the jobs script.
182
183 =item B<--lib> directory
184
185 Set the library directory which needs to contain the auxiliary files
186 C<pa_when.cmo> and C<whenlib.cma>.  Normally you do not need to
187 specify this.  However if you are running whenjobs without installing
188 it, then you need to point this to the C<lib/> directory from the
189 source, eg:
190
191  whenjobs --lib $builddir/lib -e
192
193 =item B<--set> variable=value [variable=value ...]
194
195 =item B<--type> bool|int|float|string|unit
196
197 I<--set> sets the variable named C<variable> to the new C<value>.  The
198 variable is created if it does not already exist.  Note that setting a
199 variable can cause jobs to run immediately.
200
201 To unset a variable, set it to the empty string like this:
202
203  whenjobs --set var=
204
205 By default variables are strings.  You can also set the type of a
206 variable when setting it by adding the optional I<--type> parameter.
207 The I<--type> parameter should come I<before> the variable
208 declaration, like this:
209
210  whenjobs --set --type int free_space=10000
211
212 See the discussion of variable types in the L</REFERENCE> section
213 below.
214
215 You can set multiple variables.  When setting multiple variables in a
216 single command, the values are all changed in a single atomic
217 operation.
218
219  whenjobs --set cat=sushi food=fish
220
221 When using I<--type> and multiple variables, the type changes the
222 remaining command line parameters until the next I<--type>, eg:
223
224  whenjobs --set cat=sushi \
225      --type float weight=3.5 \
226      --type string food=fish
227
228 (C<cat> and C<food> are strings, and C<weight> is a float).
229
230 =item B<--start> "job name"
231
232 Start the job immediately and unconditionally.
233
234 This runs the job even if its normal preconditions are not met.  This
235 may cause unexpected results, so use with caution.
236
237 =item B<--tail> serial
238
239 Tail the output of the running job identified by its serial number.
240 Use the I<--jobs> flag to get a list of running jobs.
241
242 =item B<--test> variable=value [variable=value ...]
243
244 This works the same way as the I<--set> option, but the difference is
245 that the variables are not set.  Instead, it lists out the jobs that
246 I<would> run, I<if> the variables were updated to these new values.
247
248 The variables are not actually updated, and the jobs are not actually
249 run.
250
251 The output is a list of job names that would run.
252
253 =item B<--upload>
254
255 Compile the jobs script and upload it to the daemon, without editing.
256 Note that the I<--edit> option does this automatically.  Furthermore,
257 when the daemon is started it checks for a jobs script and loads it if
258 found.
259
260 =item B<--variables>
261
262 Display all the variables and their values, in the format C<name=value>.
263
264 =item B<-V>
265
266 =item B<--version>
267
268 Display the name and version of the program and exit.
269
270 =back
271
272 =head1 REFERENCE
273
274 A whenjobs file consists of a series of one or more "every" or "when"
275 statements.
276
277 Comments in the file can be written using C<(* ... *)>.  Comments
278 may be nested.
279
280 Shell script fragments are written using C<E<lt>E<lt> ... E<gt>E<gt>>.
281 Within shell script fragments, use C<#> for comments (as in ordinary
282 shell scripts).  Because C<E<gt>E<gt>> has a special meaning, it
283 cannot be used in the shell script (ie. for redirection).  You have to
284 write C<E<gt>\E<gt>> instead which is replaced with C<E<gt>E<gt>> when
285 the shell script is parsed.
286
287 =head2 EVERY STATEMENTS (PERIODIC JOBS)
288
289 An every statement has the form:
290
291  every <period> :
292  <<
293    # shell script
294  >>
295
296 where C<E<lt>periodE<gt>> is a I<period expression>, which may take
297 one of the forms below.  Don't forget the colon character between the
298 period expression and the shell script.
299
300 An every statement is a job which runs periodically.
301
302 =head3 PERIOD EXPRESSIONS
303
304 =over 4
305
306 =item B<every second>
307
308 The job runs every second.
309
310 =item B<every minute>
311
312 The job runs every minute.
313
314 =item B<every hour>
315
316 The job runs every hour.
317
318 =item B<every day>
319
320 The job runs every day, at midnight UTC.
321
322 =item B<every week>
323
324 The job runs every week, on a Thursday at midnight UTC.
325
326 =item B<every month>
327
328 The job runs every month, on the first of the month at midnight UTC.
329
330 =item B<every year>
331
332 The job runs every year, on the first day of the year at midnight UTC.
333
334 =item B<every decade>
335
336 =item B<every century>
337
338 =item B<every millenium>
339
340 The job runs every 10, 100 or 1000 years.
341
342 =item B<every I<N> seconds>
343
344 The job runs every I<N> seconds (I<N> is any number E<ge> 1).
345
346 =item B<every I<N> minutes>
347
348 The job runs every I<N> minutes.
349
350 =item B<every I<N> hours>
351
352 The job runs every I<N> hours.
353
354 =item B<every I<N> days>
355
356 The job runs every I<N> days.
357
358 =item B<every I<N> weeks>
359
360 The job runs every I<N> weeks.
361
362 =item B<every I<N> months>
363
364 The job runs every I<N> months.
365
366 =item B<every I<N> years>
367
368 =item B<every I<N> decades>
369
370 =item B<every I<N> centuries>
371
372 =item B<every I<N> millenia>
373
374 The job runs every I<N>, I<10*N>, I<100*N> or I<1000*N> years.
375
376 =back
377
378 =head2 WHEN STATEMENTS (DEPENDENT JOBS)
379
380 A when statement has the form:
381
382  when <expr> :
383  <<
384    # shell script
385  >>
386
387 where C<E<lt>exprE<gt>> is a I<when expression>, described below.
388 Don't forget the colon character between the period expression and the
389 shell script.
390
391 A when statement is a job which runs when the conditions described in
392 its when-expression become true.
393
394 When jobs are I<edge triggered>.  This means that they run when the
395 condition changes from false to true (or in the case where the
396 expression has not been evaluated before, when it evaluates initially
397 to true).
398
399 =head3 WHEN EXPRESSIONS
400
401 When expressions are fully recursive expressions constructed from the
402 following elements:
403
404 =over 4
405
406 =item I<expr> B<&&> I<expr>
407
408 =item I<expr> B<||> I<expr>
409
410 The boolean "and" or "or" of the two sub-expressions.
411
412 =item I<expr> B<E<lt>> I<expr>
413
414 =item I<expr> B<E<lt>=> I<expr>
415
416 =item I<expr> B<==> I<expr>
417
418 =item I<expr> B<E<gt>=> I<expr>
419
420 =item I<expr> B<E<gt>> I<expr>
421
422 The two sub-expressions are evaluated and the usual comparison
423 operator is performed.
424
425 If the sub-expressions are numeric, then numeric comparison is done.
426 If either sub-expression is non-numeric, then both expressions are
427 converted (if necessary) to strings and string comparison is done.
428
429 =item B<!> I<expr>
430
431 Boolean negative of I<expr>.
432
433 =item I<expr> B<+> I<expr>
434
435 For numeric sub-expressions, this performs addition.
436
437 If both sub-expressions are strings, this performs string
438 concatenation.
439
440 Other types give an error.
441
442 =item I<expr> B<-> I<expr>
443
444 =item I<expr> B<*> I<expr>
445
446 =item I<expr> B</> I<expr>
447
448 =item I<expr> B<mod> I<expr>
449
450 Both sub-expressions are evaluated, and if both are numeric, then the
451 result is subtraction, multiplication, division or modulo.
452
453 Other types give an error.  Note that I<mod> really is an infix
454 operator.
455
456 =item B<len> I<expr>
457
458 If I<expr> is a string, this returns the length of the string.
459
460 =item I<variable>
461
462 The value of the named variable.
463
464 Previously undefined variables are automatically initialized to the
465 empty string.
466
467 =item B<prev> I<variable>
468
469 The I<previous> value of the named variable.  This means, the value
470 that it had last time this when-job ran.
471
472 If the when-job has not run yet, then this returns C<"">.
473
474 Job state is preserved across file reloads, but I<only> for jobs that
475 are explicitly named.  If you find that jobs using C<prev>, C<changes>
476 etc are running unnecessarily when the jobs file is edited or
477 uploaded, try giving the jobs an explicit name.
478
479 =item B<changes> I<variable>
480
481 If the named variable has changed since this job last ran, then this
482 evaluates to true, else false.
483
484 This is the same as writing C<prev variable == variable>.
485
486 =item B<increases> I<variable>
487
488 If the named variable has changed and increased since this job last
489 ran, then this evaluates to true, else false.
490
491 This is the same as writing C<prev variable E<lt> variable>.
492
493 =item B<decreases> I<variable>
494
495 If the named variable has changed and decreased since this job last
496 ran, then this evaluates to true, else false.
497
498 This is the same as writing C<prev variable E<gt> variable>.
499
500 B<Note:> There is a subtle gotcha with the I<decreases> operator: The
501 first time the expression is evaluated, the job has (by definition)
502 not yet run.  Therefore C<prev variable> evaluates to C<""> (see
503 definition of I<prev> above).  Since it is always true that
504
505  "" < anything
506
507 the I<decreases> operator evaluates to false, and since this usually
508 means the job does not run, the operator always evaluates to false.
509
510 To fix this, ensure that the variable is initialized (see
511 L</SETTING THE INITIAL VALUE OF VARIABLES> below).
512
513 =item B<reloaded ()>
514
515 This evaluates to true the first time the expression is evaluated
516 after the jobs file has been reloaded or the daemon restarted.
517 Thereafter it evaluates to false.
518
519 Don't use this to initialize variables: it won't do what you mean.
520
521 =item B<false>
522
523 =item B<true>
524
525 Constants that evaluate to boolean false or true respectively.
526
527 =item I<"any string">
528
529 Any string.
530
531 In a boolean context, the empty string evaluates to false, and
532 non-empty strings evaluate to true.
533
534 =item I<N>
535
536 Any integer.  (Arbitrarily large integers are supported.)
537
538 In a boolean context, 0 evaluates to false, and non-zero evaluates to
539 true.
540
541 =item I<N.>
542
543 =item I<.N>
544
545 =item I<N.N>
546
547 =item I<N.NeN>
548
549 Any floating point number.
550
551 In a boolean context, 0 evaluates to false, and non-zero evaluates to
552 true.
553
554 =back
555
556 =head2 SHELL SCRIPTS
557
558 The code between C<E<lt>E<lt> ... E<gt>E<gt>> is a shell script.  It
559 is executed using C<$SHELL>, or if that environment variable is not
560 set then C</bin/sh>.
561
562 =head3 SHELL SCRIPT VARIABLES
563
564 Every variable that has been set (using the whenjobs I<--set> option)
565 is exported to the script, so you can simply get the value of any
566 variable by writing C<$name>.
567
568 In addition, there are some special variables available:
569
570 =over 4
571
572 =item C<$JOBNAME>
573
574 The name of the job.  If the job has been named explicitly, then that
575 name is available through this variable, else it will be some implicit
576 name like C<job$1>.
577
578 =item C<$JOBSERIAL>
579
580 The serial number of the job.  This is simply a variable that
581 increments each time a job is run, and is unique to that run of the
582 job.
583
584 =back
585
586 Other environment variables such as C<$HOME>, C<$LOGNAME> etc are
587 available as normal.
588
589 =head3 SHELL SCRIPT TEMPORARY CURRENT DIRECTORY
590
591 The shell script runs with its current directory set to a temporary
592 directory.  The temporary directory is removed when the shell script
593 exits.  Therefore you can write temporary files here without worrying
594 about cleaning them up.
595
596 If you want to store permanent state, then you have to save it to a
597 well-known directory, eg. C<$HOME>, C</var> etc.
598
599 =head3 SHELL SCRIPT USER
600
601 The shell script runs as the ordinary user.  It has no special
602 privileges.
603
604 =head2 JOB NAMES
605
606 Jobs are given implicit names (C<job$1>, C<job$2> etc.).  You can also
607 name jobs explicitly by preceeding the "every" or "when" statement
608 with C<job "name">:
609
610  job "poll source"
611  every 10 seconds :
612  <<
613    # ...
614  >>
615
616 The job name is passed to the shell script in the C<$JOBNAME>
617 environment variable.
618
619 =head2 OCAML EXPRESSIONS
620
621 As well as simple "every" and "when" expressions, advanced users may
622 want to use arbitrary OCaml expressions, functions, etc in the jobs
623 script.  These are useful for factoring common code or strings, for
624 setting the initial values of variables, or for defining pre and post
625 functions.
626
627 A simple example of an OCaml expression is:
628
629  let prefix = "daily_"
630  
631  job (prefix ^ "virus_scan")
632  every day :
633  <<
634    # ...
635  >>
636  
637  job (prefix ^ "disk_check")
638  every day :
639  <<
640    # ...
641  >>
642
643 which creates two jobs called C<"daily_virus_scan"> and
644 C<"daily_disk_check"> (C<^> is the OCaml string concatenation
645 operator).
646
647 OCaml expressions have access to a library of functions called
648 B<Whentools> which is described below.  It lets you set variables,
649 create jobs algorithmically, etc.
650
651 The OCaml expressions run once, when the jobs file is being loaded or
652 reloaded.
653
654 =head3 SETTING THE INITIAL VALUE OF VARIABLES
655
656 Variables are created when they are referenced, and until set they
657 have the value empty string (just like the shell).  Across file
658 reloads, the previous values of variables are preserved.
659
660 To initialize a variable to a known value when the jobs file is
661 loaded, call one of the C<Whentools.set_variable*> functions as in
662 this example:
663
664  let () =
665    Whentools.set_variable "name" "Richard";
666    Whentools.set_variable_int "counter" 0
667
668 =head3 PRE FUNCTIONS
669
670 Before a job runs, you can arrange that a C<pre> function is called.
671 This function may decide not to run the job (by returning C<false>).
672
673 One use for this is to prevent a particular job from running if there
674 is already an instance of the same job running:
675
676  job "only one"
677  pre (Whentools.one ())
678  every 10 seconds :
679  <<
680    # Takes longer than 10 seconds to run, but 'Whentools.one ()'
681    # will ensure only one is ever running.
682    sleep 11
683  >>
684
685 When using pre functions, jobs must be given an explicit name, ie.
686 you must use the C<job> statement.
687
688 A number of pre functions are available in the library; see below.
689
690 You can also write your own post functions (in OCaml).  The function
691 is passed one argument which is a C<Whentools.preinfo> struct, defined
692 below.  It should return a boolean: C<true> if the job should run, and
693 C<false> if the job should not run.
694
695 Note that a fresh serial number (see L</JOBSERIAL>) is assigned to
696 each run, whether or not the job actually runs because of
697 preconditions.
698
699 =head3 POST FUNCTIONS
700
701 After a job runs, you can control what happens to its output by
702 writing a C<post> function.  To write a post function you have to
703 name the job (ie. have an explicit C<job> statement).  Put C<post ...>
704 after the job name like this:
705
706  job "poll source"
707  post (Whentools.mailto "you@example.com")
708  every 10 seconds :
709  <<
710    # ...
711  >>
712
713 A number of post functions are available in the library; see below.
714
715 You can also write your own post functions (in OCaml).  The
716 function is passed one argument which is a C<Whentools.result> struct,
717 defined below.
718
719 =head3 WHENTOOLS LIBRARY
720
721 =head4 Functions
722
723 =over 4
724
725 =item B<Whentools.mailto> [I<~only_on_failure:true>]
726 [I<~from:from_address>] I<email_address> I<result>
727
728 This built-in post function sends the result of the script by email to
729 the given email address.
730
731 If the optional C<~only_on_failure:true> flag is set, then it is only
732 sent out if the script failed.
733
734 If the optional C<~from> flag is set, then the from address is set
735 accordingly.  This is sometimes needed when sending mail.
736
737 Note the C<result> parameter is passed implicitly by the daemon.  You
738 do not need to add it.
739
740 Here are some examples of using the mailto function:
741
742  job "ex.1"
743  post (Whentools.mailto "you@example.com")
744  every 10 seconds :
745  <<
746    # do something
747  >>
748
749  job "ex.2"
750  post (Whentools.mailto ~only_on_failure:true
751                         "you@example.com")
752  every 10 seconds :
753  <<
754    # do something
755  >>
756
757  let from = "me@example.com"
758  let to_addr = "you@example.com"
759  
760  job "ex.3"
761  post (Whentools.mailto ~from to_addr)
762  every 10 seconds :
763  <<
764    # do something
765  >>
766
767 =item B<Whentools.max> I<n>
768
769 This built-in pre function ensures that a maximum of I<n> instances of
770 the job are running.
771
772 It checks the list of running jobs, and if I<n> or more instances are
773 already running, then it returns C<false>, which ensures that the new
774 job is not started.
775
776 =item B<Whentools.one> I<()>
777
778 This built-in pre function ensures that only one instance of the job
779 is running.  It is the same as calling:
780
781  Whentools.max 1
782
783 =item B<Whentools.set_variable> I<name> I<string>
784
785 Set variable I<name> to the string.
786
787 =item B<Whentools.set_variable_bool> I<name> I<b>
788
789 Set variable I<name> to the boolean value I<b>.
790
791 =item B<Whentools.set_variable_int> I<name> I<i>
792
793 Set variable I<name> to the integer value I<i>.
794
795 =item B<Whentools.set_variable_string> I<name> I<s>
796
797 Set variable I<name> to the string value <s>.  This is
798 the same as I<Whentools.set_variable>.
799
800 =item B<Whentools.set_variable_float> I<name> I<f>
801
802 Set variable I<name> to the floating point value I<f>.
803
804 =back
805
806 =head4 Structures
807
808 =over 4
809
810 =item B<Whentools.preinfo>
811
812 This structure is passed to pre functions.  It has the following
813 fields:
814
815  type preinfo = {
816    pi_job_name : string;           # Job name.
817    pi_serial : Big_int.big_int;    # Job serial number.
818    pi_variables : (string * variable) list; # Variables set in job.
819    pi_running : preinfo_running_job list;   # List of running jobs.
820  }
821  and preinfo_running_job = {
822    pirun_job_name : string;        # Running job name.
823    pirun_serial : Big_int.big_int; # Running job serial number.
824    pirun_start_time : float;       # Running job start time.
825    pirun_pid : int;                # Running job process ID.
826  }
827
828 =item B<Whentools.result>
829
830 This structure is passed to post functions.  It has the following
831 fields:
832
833  type result = {
834    res_job_name : string;  # job name
835    res_serial : big_int;   # job serial (same as $JOBSERIAL)
836    res_code : int;         # return code from the shell script
837    res_tmpdir : string;    # temporary directory script ran in
838    res_output : string;    # filename of stdout/stderr output
839    res_start_time : float; # when the job started
840  }
841
842 =back
843
844 =head1 FILES
845
846
847
848 =head1 ENVIRONMENT VARIABLES
849
850
851
852 =head1 SEE ALSO
853
854 L<whenjobsd(8)>
855
856 =head1 AUTHOR
857
858 Richard W.M. Jones L<http://people.redhat.com/~rjones/>
859
860 =head1 COPYRIGHT
861
862 Copyright (C) 2012 Red Hat Inc.
863
864 This program is free software; you can redistribute it and/or modify
865 it under the terms of the GNU General Public License as published by
866 the Free Software Foundation; either version 2 of the License, or
867 (at your option) any later version.
868
869 This program is distributed in the hope that it will be useful,
870 but WITHOUT ANY WARRANTY; without even the implied warranty of
871 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
872 GNU General Public License for more details.
873
874 You should have received a copy of the GNU General Public License
875 along with this program; if not, write to the Free Software
876 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.