Hex Artifact Content

Artifact 536bd4fe36921a190b32c62bfa00961a422372ed:


0000: 23 21 20 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20  #! /usr/bin/env 
0010: 62 61 73 68 0a 0a 61 70 70 66 73 64 5f 6f 70 74  bash..appfsd_opt
0020: 69 6f 6e 73 3d 28 29 0a 0a 43 41 5f 43 45 52 54  ions=()..CA_CERT
0030: 5f 46 49 4c 45 3d 27 41 70 70 46 53 5f 43 41 2e  _FILE='AppFS_CA.
0040: 63 72 74 27 0a 43 41 5f 4b 45 59 5f 46 49 4c 45  crt'.CA_KEY_FILE
0050: 3d 27 41 70 70 46 53 5f 43 41 2e 6b 65 79 27 0a  ='AppFS_CA.key'.
0060: 65 78 70 6f 72 74 20 43 41 5f 43 45 52 54 5f 46  export CA_CERT_F
0070: 49 4c 45 20 43 41 5f 4b 45 59 5f 46 49 4c 45 0a  ILE CA_KEY_FILE.
0080: 0a 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 5f 61  .function call_a
0090: 70 70 66 73 64 28 29 20 7b 0a 09 61 70 70 66 73  ppfsd() {..appfs
00a0: 64 20 22 24 7b 61 70 70 66 73 64 5f 6f 70 74 69  d "${appfsd_opti
00b0: 6f 6e 73 5b 40 5d 7d 22 20 22 24 40 22 0a 7d 0a  ons[@]}" "$@".}.
00c0: 0a 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 5f 70  .function read_p
00d0: 61 73 73 77 6f 72 64 28 29 20 7b 0a 09 6c 6f 63  assword() {..loc
00e0: 61 6c 20 70 72 6f 6d 70 74 20 76 61 72 69 61 62  al prompt variab
00f0: 6c 65 0a 0a 09 70 72 6f 6d 70 74 3d 22 24 31 22  le...prompt="$1"
0100: 0a 09 76 61 72 69 61 62 6c 65 3d 22 24 32 22 0a  ..variable="$2".
0110: 0a 09 69 66 20 5b 20 2d 7a 20 22 24 28 65 76 61  ..if [ -z "$(eva
0120: 6c 20 65 63 68 6f 20 27 24 27 24 7b 76 61 72 69  l echo '$'${vari
0130: 61 62 6c 65 7d 29 22 20 5d 3b 20 74 68 65 6e 0a  able})" ]; then.
0140: 09 09 65 63 68 6f 20 2d 6e 20 22 24 7b 70 72 6f  ..echo -n "${pro
0150: 6d 70 74 7d 22 20 3e 26 32 0a 0a 09 09 73 74 74  mpt}" >&2....stt
0160: 79 20 2d 65 63 68 6f 0a 09 09 49 46 53 3d 27 27  y -echo...IFS=''
0170: 20 72 65 61 64 20 2d 72 20 24 76 61 72 69 61 62   read -r $variab
0180: 6c 65 0a 09 09 73 74 74 79 20 65 63 68 6f 0a 09  le...stty echo..
0190: 09 65 63 68 6f 20 27 27 20 3e 26 32 0a 09 66 69  .echo '' >&2..fi
01a0: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 72 65 61  .}..function rea
01b0: 64 5f 74 65 78 74 28 29 20 7b 0a 09 6c 6f 63 61  d_text() {..loca
01c0: 6c 20 70 72 6f 6d 70 74 20 76 61 72 69 61 62 6c  l prompt variabl
01d0: 65 0a 0a 09 70 72 6f 6d 70 74 3d 22 24 31 22 0a  e...prompt="$1".
01e0: 09 76 61 72 69 61 62 6c 65 3d 22 24 32 22 0a 0a  .variable="$2"..
01f0: 09 69 66 20 5b 20 2d 7a 20 22 24 28 65 76 61 6c  .if [ -z "$(eval
0200: 20 65 63 68 6f 20 27 24 27 24 7b 76 61 72 69 61   echo '$'${varia
0210: 62 6c 65 7d 29 22 20 5d 3b 20 74 68 65 6e 0a 09  ble})" ]; then..
0220: 09 65 63 68 6f 20 2d 6e 20 22 24 7b 70 72 6f 6d  .echo -n "${prom
0230: 70 74 7d 22 20 3e 26 32 0a 0a 09 09 49 46 53 3d  pt}" >&2....IFS=
0240: 27 27 20 72 65 61 64 20 2d 72 20 24 76 61 72 69  '' read -r $vari
0250: 61 62 6c 65 0a 09 66 69 0a 7d 0a 0a 66 75 6e 63  able..fi.}..func
0260: 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 5f 63 61  tion generate_ca
0270: 5f 63 65 72 74 5f 61 6e 64 5f 6b 65 79 28 29 20  _cert_and_key() 
0280: 7b 0a 09 72 65 61 64 5f 74 65 78 74 20 27 43 65  {..read_text 'Ce
0290: 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72  rtificate Author
02a0: 69 74 79 20 28 43 41 29 20 43 6f 6d 70 61 6e 79  ity (CA) Company
02b0: 20 4e 61 6d 65 20 28 4f 29 3a 20 27 20 43 41 5f   Name (O): ' CA_
02c0: 44 4e 5f 53 5f 4f 0a 09 72 65 61 64 5f 74 65 78  DN_S_O..read_tex
02d0: 74 20 27 43 65 72 74 69 66 69 63 61 74 65 20 41  t 'Certificate A
02e0: 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 52 65  uthority (CA) Re
02f0: 73 70 6f 6e 73 69 62 6c 65 20 50 61 72 74 79 20  sponsible Party 
0300: 4e 61 6d 65 20 28 43 4e 29 3a 20 27 20 43 41 5f  Name (CN): ' CA_
0310: 44 4e 5f 53 5f 43 4e 0a 09 72 65 61 64 5f 70 61  DN_S_CN..read_pa
0320: 73 73 77 6f 72 64 20 27 50 61 73 73 77 6f 72 64  ssword 'Password
0330: 20 66 6f 72 20 43 65 72 74 69 66 69 63 61 74 65   for Certificate
0340: 20 41 75 74 68 6f 72 69 74 79 20 4b 65 79 3a 20   Authority Key: 
0350: 27 20 43 41 5f 50 41 53 53 57 4f 52 44 0a 0a 09  ' CA_PASSWORD...
0360: 65 78 70 6f 72 74 20 43 41 5f 44 4e 5f 53 5f 4f  export CA_DN_S_O
0370: 20 43 41 5f 44 4e 5f 53 5f 43 4e 20 43 41 5f 50   CA_DN_S_CN CA_P
0380: 41 53 53 57 4f 52 44 0a 0a 09 63 61 6c 6c 5f 61  ASSWORD...call_a
0390: 70 70 66 73 64 20 2d 2d 74 63 6c 20 27 0a 70 61  ppfsd --tcl '.pa
03a0: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 70 6b  ckage require pk
03b0: 69 0a 0a 73 65 74 20 66 69 6c 65 6e 61 6d 65 5f  i..set filename_
03c0: 63 65 72 74 20 24 3a 3a 65 6e 76 28 43 41 5f 43  cert $::env(CA_C
03d0: 45 52 54 5f 46 49 4c 45 29 0a 73 65 74 20 66 69  ERT_FILE).set fi
03e0: 6c 65 6e 61 6d 65 5f 6b 65 79 20 20 24 3a 3a 65  lename_key  $::e
03f0: 6e 76 28 43 41 5f 4b 45 59 5f 46 49 4c 45 29 0a  nv(CA_KEY_FILE).
0400: 0a 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  .puts -nonewline
0410: 20 22 47 65 6e 65 72 61 74 69 6e 67 20 52 53 41   "Generating RSA
0420: 20 4b 65 79 2e 2e 2e 22 0a 66 6c 75 73 68 20 73   Key...".flush s
0430: 74 64 6f 75 74 0a 73 65 74 20 6b 65 79 20 5b 70  tdout.set key [p
0440: 6b 69 3a 3a 72 73 61 3a 3a 67 65 6e 65 72 61 74  ki::rsa::generat
0450: 65 20 32 30 34 38 5d 0a 70 75 74 73 20 22 20 44  e 2048].puts " D
0460: 6f 6e 65 2e 22 0a 0a 6c 61 70 70 65 6e 64 20 6b  one."..lappend k
0470: 65 79 20 73 75 62 6a 65 63 74 20 22 4f 3d 24 3a  ey subject "O=$:
0480: 3a 65 6e 76 28 43 41 5f 44 4e 5f 53 5f 4f 29 2c  :env(CA_DN_S_O),
0490: 43 4e 3d 24 3a 3a 65 6e 76 28 43 41 5f 44 4e 5f  CN=$::env(CA_DN_
04a0: 53 5f 43 4e 29 22 0a 0a 73 65 74 20 63 61 20 5b  S_CN)"..set ca [
04b0: 70 6b 69 3a 3a 78 35 30 39 3a 3a 63 72 65 61 74  pki::x509::creat
04c0: 65 5f 63 65 72 74 20 24 6b 65 79 20 24 6b 65 79  e_cert $key $key
04d0: 20 31 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64   1 [clock second
04e0: 73 5d 20 5b 63 6c 6f 63 6b 20 61 64 64 20 5b 63  s] [clock add [c
04f0: 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 20 35 20  lock seconds] 5 
0500: 79 65 61 72 73 5d 20 31 20 5b 6c 69 73 74 5d 20  years] 1 [list] 
0510: 31 5d 0a 0a 70 75 74 73 20 22 57 72 69 74 69 6e  1]..puts "Writin
0520: 67 20 5c 22 24 66 69 6c 65 6e 61 6d 65 5f 63 65  g \"$filename_ce
0530: 72 74 5c 22 22 0a 73 65 74 20 66 64 20 5b 6f 70  rt\"".set fd [op
0540: 65 6e 20 24 66 69 6c 65 6e 61 6d 65 5f 63 65 72  en $filename_cer
0550: 74 20 77 20 30 36 34 34 5d 0a 70 75 74 73 20 24  t w 0644].puts $
0560: 66 64 20 24 63 61 0a 63 6c 6f 73 65 20 24 66 64  fd $ca.close $fd
0570: 0a 0a 70 75 74 73 20 22 57 72 69 74 69 6e 67 20  ..puts "Writing 
0580: 5c 22 24 66 69 6c 65 6e 61 6d 65 5f 6b 65 79 5c  \"$filename_key\
0590: 22 22 0a 73 65 74 20 66 64 20 5b 6f 70 65 6e 20  "".set fd [open 
05a0: 24 66 69 6c 65 6e 61 6d 65 5f 6b 65 79 20 77 20  $filename_key w 
05b0: 30 34 30 30 5d 0a 70 75 74 73 20 24 66 64 20 5b  0400].puts $fd [
05c0: 70 6b 69 3a 3a 6b 65 79 20 24 6b 65 79 20 24 3a  pki::key $key $:
05d0: 3a 65 6e 76 28 43 41 5f 50 41 53 53 57 4f 52 44  :env(CA_PASSWORD
05e0: 29 5d 0a 63 6c 6f 73 65 20 24 66 64 0a 27 0a 7d  )].close $fd.'.}
05f0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72  ..function gener
0600: 61 74 65 5f 6b 65 79 28 29 20 7b 0a 09 72 65 61  ate_key() {..rea
0610: 64 5f 70 61 73 73 77 6f 72 64 20 27 50 61 73 73  d_password 'Pass
0620: 77 6f 72 64 20 66 6f 72 20 53 69 74 65 20 4b 65  word for Site Ke
0630: 79 3a 20 27 20 53 49 54 45 5f 50 41 53 53 57 4f  y: ' SITE_PASSWO
0640: 52 44 0a 0a 09 65 78 70 6f 72 74 20 53 49 54 45  RD...export SITE
0650: 5f 50 41 53 53 57 4f 52 44 0a 0a 09 63 61 6c 6c  _PASSWORD...call
0660: 5f 61 70 70 66 73 64 20 2d 2d 74 63 6c 20 27 0a  _appfsd --tcl '.
0670: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
0680: 70 6b 69 0a 0a 69 66 20 7b 5b 69 6e 66 6f 20 65  pki..if {[info e
0690: 78 69 73 74 73 20 3a 3a 65 6e 76 28 53 49 54 45  xists ::env(SITE
06a0: 5f 4b 45 59 5f 46 49 4c 45 29 5d 7d 20 7b 0a 09  _KEY_FILE)]} {..
06b0: 73 65 74 20 66 69 6c 65 6e 61 6d 65 5f 6b 65 79  set filename_key
06c0: 20 24 3a 3a 65 6e 76 28 53 49 54 45 5f 4b 45 59   $::env(SITE_KEY
06d0: 5f 46 49 4c 45 29 0a 7d 20 65 6c 73 65 20 7b 0a  _FILE).} else {.
06e0: 09 73 65 74 20 66 69 6c 65 6e 61 6d 65 5f 6b 65  .set filename_ke
06f0: 79 20 22 41 70 70 46 53 5f 53 69 74 65 2e 6b 65  y "AppFS_Site.ke
0700: 79 22 0a 7d 0a 0a 70 75 74 73 20 2d 6e 6f 6e 65  y".}..puts -none
0710: 77 6c 69 6e 65 20 22 47 65 6e 65 72 61 74 69 6e  wline "Generatin
0720: 67 20 52 53 41 20 4b 65 79 2e 2e 2e 22 0a 66 6c  g RSA Key...".fl
0730: 75 73 68 20 73 74 64 6f 75 74 0a 73 65 74 20 6b  ush stdout.set k
0740: 65 79 20 5b 70 6b 69 3a 3a 72 73 61 3a 3a 67 65  ey [pki::rsa::ge
0750: 6e 65 72 61 74 65 20 32 30 34 38 5d 0a 70 75 74  nerate 2048].put
0760: 73 20 22 20 44 6f 6e 65 2e 22 0a 0a 70 75 74 73  s " Done."..puts
0770: 20 22 57 72 69 74 69 6e 67 20 5c 22 24 66 69 6c   "Writing \"$fil
0780: 65 6e 61 6d 65 5f 6b 65 79 5c 22 22 0a 73 65 74  ename_key\"".set
0790: 20 66 64 20 5b 6f 70 65 6e 20 24 66 69 6c 65 6e   fd [open $filen
07a0: 61 6d 65 5f 6b 65 79 20 77 20 30 34 30 30 5d 0a  ame_key w 0400].
07b0: 70 75 74 73 20 24 66 64 20 5b 70 6b 69 3a 3a 6b  puts $fd [pki::k
07c0: 65 79 20 24 6b 65 79 20 24 3a 3a 65 6e 76 28 53  ey $key $::env(S
07d0: 49 54 45 5f 50 41 53 53 57 4f 52 44 29 5d 0a 63  ITE_PASSWORD)].c
07e0: 6c 6f 73 65 20 24 66 64 0a 27 0a 7d 0a 0a 66 75  lose $fd.'.}..fu
07f0: 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 5f  nction generate_
0800: 63 73 72 28 29 20 7b 0a 09 72 65 61 64 5f 74 65  csr() {..read_te
0810: 78 74 20 27 53 69 74 65 20 68 6f 73 74 6e 61 6d  xt 'Site hostnam
0820: 65 3a 20 27 20 53 49 54 45 5f 48 4f 53 54 4e 41  e: ' SITE_HOSTNA
0830: 4d 45 0a 0a 09 69 66 20 5b 20 2d 7a 20 22 24 7b  ME...if [ -z "${
0840: 53 49 54 45 5f 4b 45 59 5f 46 49 4c 45 7d 22 20  SITE_KEY_FILE}" 
0850: 5d 3b 20 74 68 65 6e 0a 09 09 53 49 54 45 5f 4b  ]; then...SITE_K
0860: 45 59 5f 46 49 4c 45 3d 22 41 70 70 46 53 5f 53  EY_FILE="AppFS_S
0870: 69 74 65 5f 24 7b 53 49 54 45 5f 48 4f 53 54 4e  ite_${SITE_HOSTN
0880: 41 4d 45 7d 2e 6b 65 79 22 0a 09 66 69 0a 0a 09  AME}.key"..fi...
0890: 65 78 70 6f 72 74 20 53 49 54 45 5f 48 4f 53 54  export SITE_HOST
08a0: 4e 41 4d 45 20 53 49 54 45 5f 4b 45 59 5f 46 49  NAME SITE_KEY_FI
08b0: 4c 45 0a 0a 09 69 66 20 5b 20 2d 66 20 22 24 7b  LE...if [ -f "${
08c0: 53 49 54 45 5f 4b 45 59 5f 46 49 4c 45 7d 22 20  SITE_KEY_FILE}" 
08d0: 5d 3b 20 74 68 65 6e 0a 09 09 65 63 68 6f 20 27  ]; then...echo '
08e0: 4b 65 79 20 66 69 6c 65 20 61 6c 72 65 61 64 79  Key file already
08f0: 20 65 78 69 73 74 73 2e 27 0a 09 09 72 65 61 64   exists.'...read
0900: 5f 70 61 73 73 77 6f 72 64 20 27 50 61 73 73 77  _password 'Passw
0910: 6f 72 64 20 66 6f 72 20 28 65 78 69 73 74 69 6e  ord for (existin
0920: 67 29 20 53 69 74 65 20 4b 65 79 3a 20 27 20 53  g) Site Key: ' S
0930: 49 54 45 5f 50 41 53 53 57 4f 52 44 0a 0a 09 09  ITE_PASSWORD....
0940: 65 78 70 6f 72 74 20 53 49 54 45 5f 50 41 53 53  export SITE_PASS
0950: 57 4f 52 44 0a 09 65 6c 73 65 0a 09 09 67 65 6e  WORD..else...gen
0960: 65 72 61 74 65 5f 6b 65 79 0a 09 66 69 0a 0a 63  erate_key..fi..c
0970: 61 6c 6c 5f 61 70 70 66 73 64 20 2d 2d 74 63 6c  all_appfsd --tcl
0980: 20 27 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69   '.package requi
0990: 72 65 20 70 6b 69 0a 0a 69 66 20 7b 5b 69 6e 66  re pki..if {[inf
09a0: 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 53  o exists ::env(S
09b0: 49 54 45 5f 4b 45 59 5f 46 49 4c 45 29 5d 7d 20  ITE_KEY_FILE)]} 
09c0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  {.        set fi
09d0: 6c 65 6e 61 6d 65 5f 6b 65 79 20 24 3a 3a 65 6e  lename_key $::en
09e0: 76 28 53 49 54 45 5f 4b 45 59 5f 46 49 4c 45 29  v(SITE_KEY_FILE)
09f0: 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20  .} else {.      
0a00: 20 20 73 65 74 20 66 69 6c 65 6e 61 6d 65 5f 6b    set filename_k
0a10: 65 79 20 22 41 70 70 46 53 5f 53 69 74 65 2e 6b  ey "AppFS_Site.k
0a20: 65 79 22 0a 7d 0a 73 65 74 20 66 69 6c 65 6e 61  ey".}.set filena
0a30: 6d 65 5f 63 73 72 20 22 5b 66 69 6c 65 20 72 6f  me_csr "[file ro
0a40: 6f 74 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65  otname $filename
0a50: 5f 6b 65 79 5d 2e 63 73 72 22 0a 0a 73 65 74 20  _key].csr"..set 
0a60: 6b 65 79 20 5b 72 65 61 64 20 5b 6f 70 65 6e 20  key [read [open 
0a70: 24 66 69 6c 65 6e 61 6d 65 5f 6b 65 79 5d 5d 0a  $filename_key]].
0a80: 0a 73 65 74 20 6b 65 79 20 5b 3a 3a 70 6b 69 3a  .set key [::pki:
0a90: 3a 70 6b 63 73 3a 3a 70 61 72 73 65 5f 6b 65 79  :pkcs::parse_key
0aa0: 20 24 6b 65 79 20 24 3a 3a 65 6e 76 28 53 49 54   $key $::env(SIT
0ab0: 45 5f 50 41 53 53 57 4f 52 44 29 5d 0a 0a 73 65  E_PASSWORD)]..se
0ac0: 74 20 63 73 72 20 5b 3a 3a 70 6b 69 3a 3a 70 6b  t csr [::pki::pk
0ad0: 63 73 3a 3a 63 72 65 61 74 65 5f 63 73 72 20 24  cs::create_csr $
0ae0: 6b 65 79 20 5b 6c 69 73 74 20 43 4e 20 24 3a 3a  key [list CN $::
0af0: 65 6e 76 28 53 49 54 45 5f 48 4f 53 54 4e 41 4d  env(SITE_HOSTNAM
0b00: 45 29 5d 20 31 5d 0a 0a 70 75 74 73 20 22 57 72  E)] 1]..puts "Wr
0b10: 69 74 69 6e 67 20 5c 22 24 66 69 6c 65 6e 61 6d  iting \"$filenam
0b20: 65 5f 63 73 72 5c 22 22 0a 73 65 74 20 66 64 20  e_csr\"".set fd 
0b30: 5b 6f 70 65 6e 20 24 66 69 6c 65 6e 61 6d 65 5f  [open $filename_
0b40: 63 73 72 20 77 20 30 36 34 34 5d 0a 70 75 74 73  csr w 0644].puts
0b50: 20 24 66 64 20 24 63 73 72 0a 63 6c 6f 73 65 20   $fd $csr.close 
0b60: 24 66 64 0a 27 0a 7d 0a 0a 66 75 6e 63 74 69 6f  $fd.'.}..functio
0b70: 6e 20 67 65 6e 65 72 61 74 65 5f 63 65 72 74 28  n generate_cert(
0b80: 29 20 7b 0a 09 53 49 54 45 5f 43 53 52 5f 46 49  ) {..SITE_CSR_FI
0b90: 4c 45 3d 22 24 31 22 0a 0a 09 72 65 61 64 5f 74  LE="$1"...read_t
0ba0: 65 78 74 20 27 43 65 72 74 69 66 69 63 61 74 65  ext 'Certificate
0bb0: 20 53 69 67 6e 69 6e 67 20 52 65 71 75 65 73 74   Signing Request
0bc0: 20 28 43 53 52 29 20 66 69 6c 65 3a 20 27 20 53   (CSR) file: ' S
0bd0: 49 54 45 5f 43 53 52 5f 46 49 4c 45 0a 0a 09 69  ITE_CSR_FILE...i
0be0: 66 20 5b 20 2d 7a 20 22 24 7b 53 49 54 45 5f 43  f [ -z "${SITE_C
0bf0: 53 52 5f 46 49 4c 45 7d 22 20 5d 3b 20 74 68 65  SR_FILE}" ]; the
0c00: 6e 0a 09 09 67 65 6e 65 72 61 74 65 5f 63 73 72  n...generate_csr
0c10: 20 7c 7c 20 65 78 69 74 20 31 0a 0a 09 09 53 49   || exit 1....SI
0c20: 54 45 5f 43 53 52 5f 46 49 4c 45 3d 22 24 28 65  TE_CSR_FILE="$(e
0c30: 63 68 6f 20 22 24 7b 53 49 54 45 5f 4b 45 59 5f  cho "${SITE_KEY_
0c40: 46 49 4c 45 7d 22 20 7c 20 73 65 64 20 27 73 40  FILE}" | sed 's@
0c50: 2e 5b 5e 5c 2e 5d 2a 24 40 40 27 29 2e 63 73 72  .[^\.]*$@@').csr
0c60: 22 0a 09 66 69 0a 0a 09 69 66 20 5b 20 21 20 2d  "..fi...if [ ! -
0c70: 65 20 22 24 7b 43 41 5f 43 45 52 54 5f 46 49 4c  e "${CA_CERT_FIL
0c80: 45 7d 22 20 2d 6f 20 21 20 2d 65 20 22 24 7b 43  E}" -o ! -e "${C
0c90: 41 5f 4b 45 59 5f 46 49 4c 45 7d 22 20 5d 3b 20  A_KEY_FILE}" ]; 
0ca0: 74 68 65 6e 0a 09 09 72 65 61 64 5f 74 65 78 74  then...read_text
0cb0: 20 27 43 65 72 74 69 66 69 63 61 74 65 20 41 75   'Certificate Au
0cc0: 74 68 6f 72 69 74 79 20 28 43 41 29 20 43 65 72  thority (CA) Cer
0cd0: 74 69 66 69 63 61 74 65 20 46 69 6c 65 6e 61 6d  tificate Filenam
0ce0: 65 3a 20 27 20 43 41 5f 43 45 52 54 5f 46 49 4c  e: ' CA_CERT_FIL
0cf0: 45 0a 09 09 72 65 61 64 5f 74 65 78 74 20 27 43  E...read_text 'C
0d00: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
0d10: 72 69 74 79 20 28 43 41 29 20 4b 65 79 20 46 69  rity (CA) Key Fi
0d20: 6c 65 6e 61 6d 65 3a 20 27 20 43 41 5f 4b 45 59  lename: ' CA_KEY
0d30: 5f 46 49 4c 45 0a 09 66 69 0a 0a 09 72 65 61 64  _FILE..fi...read
0d40: 5f 70 61 73 73 77 6f 72 64 20 27 43 65 72 74 69  _password 'Certi
0d50: 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79  ficate Authority
0d60: 20 28 43 41 29 20 50 61 73 73 77 6f 72 64 3a 20   (CA) Password: 
0d70: 27 20 43 41 5f 50 41 53 53 57 4f 52 44 0a 0a 09  ' CA_PASSWORD...
0d80: 53 49 54 45 5f 53 45 52 49 41 4c 5f 4e 55 4d 42  SITE_SERIAL_NUMB
0d90: 45 52 3d 22 24 28 75 75 69 64 67 65 6e 20 7c 20  ER="$(uuidgen | 
0da0: 64 64 20 63 6f 6e 76 3d 75 63 61 73 65 20 32 3e  dd conv=ucase 2>
0db0: 2f 64 65 76 2f 6e 75 6c 6c 20 7c 20 73 65 64 20  /dev/null | sed 
0dc0: 27 73 40 2d 40 40 67 3b 73 40 5e 40 69 62 61 73  's@-@@g;s@^@ibas
0dd0: 65 3d 31 36 3b 20 40 27 20 7c 20 62 63 20 2d 6c  e=16; @' | bc -l
0de0: 71 29 22 0a 0a 09 65 78 70 6f 72 74 20 53 49 54  q)"...export SIT
0df0: 45 5f 43 53 52 5f 46 49 4c 45 20 53 49 54 45 5f  E_CSR_FILE SITE_
0e00: 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 43 41  SERIAL_NUMBER CA
0e10: 5f 43 45 52 54 5f 46 49 4c 45 20 43 41 5f 4b 45  _CERT_FILE CA_KE
0e20: 59 5f 46 49 4c 45 20 43 41 5f 50 41 53 53 57 4f  Y_FILE CA_PASSWO
0e30: 52 44 0a 0a 09 53 49 54 45 5f 43 45 52 54 3d 22  RD...SITE_CERT="
0e40: 24 28 63 61 6c 6c 5f 61 70 70 66 73 64 20 2d 2d  $(call_appfsd --
0e50: 74 63 6c 20 27 0a 70 61 63 6b 61 67 65 20 72 65  tcl '.package re
0e60: 71 75 69 72 65 20 70 6b 69 0a 0a 73 65 74 20 63  quire pki..set c
0e70: 73 72 20 5b 72 65 61 64 20 5b 6f 70 65 6e 20 24  sr [read [open $
0e80: 3a 3a 65 6e 76 28 53 49 54 45 5f 43 53 52 5f 46  ::env(SITE_CSR_F
0e90: 49 4c 45 29 5d 5d 0a 73 65 74 20 63 73 72 20 5b  ILE)]].set csr [
0ea0: 3a 3a 70 6b 69 3a 3a 70 6b 63 73 3a 3a 70 61 72  ::pki::pkcs::par
0eb0: 73 65 5f 63 73 72 20 24 63 73 72 5d 0a 0a 73 65  se_csr $csr]..se
0ec0: 74 20 63 61 5f 6b 65 79 20 5b 72 65 61 64 20 5b  t ca_key [read [
0ed0: 6f 70 65 6e 20 24 3a 3a 65 6e 76 28 43 41 5f 4b  open $::env(CA_K
0ee0: 45 59 5f 46 49 4c 45 29 5d 5d 0a 73 65 74 20 63  EY_FILE)]].set c
0ef0: 61 5f 63 65 72 74 20 5b 72 65 61 64 20 5b 6f 70  a_cert [read [op
0f00: 65 6e 20 24 3a 3a 65 6e 76 28 43 41 5f 43 45 52  en $::env(CA_CER
0f10: 54 5f 46 49 4c 45 29 5d 5d 0a 0a 73 65 74 20 63  T_FILE)]]..set c
0f20: 61 5f 6b 65 79 20 5b 3a 3a 70 6b 69 3a 3a 70 6b  a_key [::pki::pk
0f30: 63 73 3a 3a 70 61 72 73 65 5f 6b 65 79 20 24 63  cs::parse_key $c
0f40: 61 5f 6b 65 79 20 24 3a 3a 65 6e 76 28 43 41 5f  a_key $::env(CA_
0f50: 50 41 53 53 57 4f 52 44 29 5d 0a 73 65 74 20 63  PASSWORD)].set c
0f60: 61 5f 63 65 72 74 20 5b 3a 3a 70 6b 69 3a 3a 78  a_cert [::pki::x
0f70: 35 30 39 3a 3a 70 61 72 73 65 5f 63 65 72 74 20  509::parse_cert 
0f80: 24 63 61 5f 63 65 72 74 5d 0a 73 65 74 20 63 61  $ca_cert].set ca
0f90: 5f 6b 65 79 20 5b 63 6f 6e 63 61 74 20 24 63 61  _key [concat $ca
0fa0: 5f 6b 65 79 20 24 63 61 5f 63 65 72 74 5d 0a 0a  _key $ca_cert]..
0fb0: 73 65 74 20 63 65 72 74 20 5b 3a 3a 70 6b 69 3a  set cert [::pki:
0fc0: 3a 78 35 30 39 3a 3a 63 72 65 61 74 65 5f 63 65  :x509::create_ce
0fd0: 72 74 20 24 63 73 72 20 24 63 61 5f 6b 65 79 20  rt $csr $ca_key 
0fe0: 24 3a 3a 65 6e 76 28 53 49 54 45 5f 53 45 52 49  $::env(SITE_SERI
0ff0: 41 4c 5f 4e 55 4d 42 45 52 29 20 5b 63 6c 6f 63  AL_NUMBER) [cloc
1000: 6b 20 73 65 63 6f 6e 64 73 5d 20 5b 63 6c 6f 63  k seconds] [cloc
1010: 6b 20 61 64 64 20 5b 63 6c 6f 63 6b 20 73 65 63  k add [clock sec
1020: 6f 6e 64 73 5d 20 31 20 79 65 61 72 5d 20 30 20  onds] 1 year] 0 
1030: 5b 6c 69 73 74 5d 20 31 5d 0a 0a 70 75 74 73 20  [list] 1]..puts 
1040: 24 63 65 72 74 0a 27 29 22 0a 0a 09 53 49 54 45  $cert.')"...SITE
1050: 5f 53 55 42 4a 45 43 54 3d 22 24 28 65 63 68 6f  _SUBJECT="$(echo
1060: 20 22 24 7b 53 49 54 45 5f 43 45 52 54 7d 22 20   "${SITE_CERT}" 
1070: 7c 20 6f 70 65 6e 73 73 6c 20 78 35 30 39 20 2d  | openssl x509 -
1080: 73 75 62 6a 65 63 74 20 2d 6e 6f 6f 75 74 20 7c  subject -noout |
1090: 20 73 65 64 20 27 73 40 2e 2a 3d 20 40 40 27 29   sed 's@.*= @@')
10a0: 22 0a 0a 09 65 63 68 6f 20 22 24 7b 55 53 45 52  "...echo "${USER
10b0: 7d 40 24 7b 48 4f 53 54 4e 41 4d 45 7d 20 24 28  }@${HOSTNAME} $(
10c0: 64 61 74 65 29 3a 20 24 7b 53 49 54 45 5f 53 45  date): ${SITE_SE
10d0: 52 49 41 4c 5f 4e 55 4d 42 45 52 7d 20 24 7b 53  RIAL_NUMBER} ${S
10e0: 49 54 45 5f 53 55 42 4a 45 43 54 7d 22 20 3e 3e  ITE_SUBJECT}" >>
10f0: 20 22 24 7b 43 41 5f 4b 45 59 5f 46 49 4c 45 7d   "${CA_KEY_FILE}
1100: 2e 69 73 73 75 65 64 22 0a 0a 09 65 63 68 6f 20  .issued"...echo 
1110: 22 24 7b 53 49 54 45 5f 43 45 52 54 7d 22 0a 7d  "${SITE_CERT}".}
1120: 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72  ..function gener
1130: 61 74 65 5f 73 65 6c 66 73 69 67 6e 65 64 28 29  ate_selfsigned()
1140: 20 7b 0a 09 72 65 61 64 5f 70 61 73 73 77 6f 72   {..read_passwor
1150: 64 20 27 50 61 73 73 77 6f 72 64 20 66 6f 72 20  d 'Password for 
1160: 4b 65 79 3a 20 27 20 53 49 54 45 5f 50 41 53 53  Key: ' SITE_PASS
1170: 57 4f 52 44 0a 09 72 65 61 64 5f 74 65 78 74 20  WORD..read_text 
1180: 27 53 69 74 65 20 68 6f 73 74 6e 61 6d 65 3a 20  'Site hostname: 
1190: 27 20 53 49 54 45 5f 48 4f 53 54 4e 41 4d 45 0a  ' SITE_HOSTNAME.
11a0: 0a 09 53 49 54 45 5f 53 45 52 49 41 4c 5f 4e 55  ..SITE_SERIAL_NU
11b0: 4d 42 45 52 3d 22 24 28 75 75 69 64 67 65 6e 20  MBER="$(uuidgen 
11c0: 7c 20 64 64 20 63 6f 6e 76 3d 75 63 61 73 65 20  | dd conv=ucase 
11d0: 32 3e 2f 64 65 76 2f 6e 75 6c 6c 20 7c 20 73 65  2>/dev/null | se
11e0: 64 20 27 73 40 2d 40 40 67 3b 73 40 5e 40 69 62  d 's@-@@g;s@^@ib
11f0: 61 73 65 3d 31 36 3b 20 40 27 20 7c 20 62 63 20  ase=16; @' | bc 
1200: 2d 6c 71 29 22 0a 0a 09 65 78 70 6f 72 74 20 53  -lq)"...export S
1210: 49 54 45 5f 50 41 53 53 57 4f 52 44 20 53 49 54  ITE_PASSWORD SIT
1220: 45 5f 48 4f 53 54 4e 41 4d 45 20 53 49 54 45 5f  E_HOSTNAME SITE_
1230: 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 0a 0a 09  SERIAL_NUMBER...
1240: 63 61 6c 6c 5f 61 70 70 66 73 64 20 2d 2d 74 63  call_appfsd --tc
1250: 6c 20 27 0a 70 61 63 6b 61 67 65 20 72 65 71 75  l '.package requ
1260: 69 72 65 20 70 6b 69 0a 0a 73 65 74 20 66 69 6c  ire pki..set fil
1270: 65 6e 61 6d 65 5f 63 65 72 74 20 22 41 70 70 46  ename_cert "AppF
1280: 53 5f 53 69 74 65 5f 24 3a 3a 65 6e 76 28 53 49  S_Site_$::env(SI
1290: 54 45 5f 48 4f 53 54 4e 41 4d 45 29 2e 63 72 74  TE_HOSTNAME).crt
12a0: 22 0a 73 65 74 20 66 69 6c 65 6e 61 6d 65 5f 6b  ".set filename_k
12b0: 65 79 20 20 22 41 70 70 46 53 5f 53 69 74 65 5f  ey  "AppFS_Site_
12c0: 24 3a 3a 65 6e 76 28 53 49 54 45 5f 48 4f 53 54  $::env(SITE_HOST
12d0: 4e 41 4d 45 29 2e 6b 65 79 22 0a 0a 70 75 74 73  NAME).key"..puts
12e0: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 47 65 6e   -nonewline "Gen
12f0: 65 72 61 74 69 6e 67 20 52 53 41 20 4b 65 79 2e  erating RSA Key.
1300: 2e 2e 22 0a 66 6c 75 73 68 20 73 74 64 6f 75 74  ..".flush stdout
1310: 0a 73 65 74 20 6b 65 79 20 5b 70 6b 69 3a 3a 72  .set key [pki::r
1320: 73 61 3a 3a 67 65 6e 65 72 61 74 65 20 32 30 34  sa::generate 204
1330: 38 5d 0a 70 75 74 73 20 22 20 44 6f 6e 65 2e 22  8].puts " Done."
1340: 0a 0a 6c 61 70 70 65 6e 64 20 6b 65 79 20 73 75  ..lappend key su
1350: 62 6a 65 63 74 20 22 43 4e 3d 24 3a 3a 65 6e 76  bject "CN=$::env
1360: 28 53 49 54 45 5f 48 4f 53 54 4e 41 4d 45 29 22  (SITE_HOSTNAME)"
1370: 0a 0a 73 65 74 20 63 65 72 74 20 5b 70 6b 69 3a  ..set cert [pki:
1380: 3a 78 35 30 39 3a 3a 63 72 65 61 74 65 5f 63 65  :x509::create_ce
1390: 72 74 20 24 6b 65 79 20 24 6b 65 79 20 24 3a 3a  rt $key $key $::
13a0: 65 6e 76 28 53 49 54 45 5f 53 45 52 49 41 4c 5f  env(SITE_SERIAL_
13b0: 4e 55 4d 42 45 52 29 20 5b 63 6c 6f 63 6b 20 73  NUMBER) [clock s
13c0: 65 63 6f 6e 64 73 5d 20 5b 63 6c 6f 63 6b 20 61  econds] [clock a
13d0: 64 64 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  dd [clock second
13e0: 73 5d 20 31 20 79 65 61 72 73 5d 20 31 20 5b 6c  s] 1 years] 1 [l
13f0: 69 73 74 5d 20 31 5d 0a 0a 70 75 74 73 20 22 57  ist] 1]..puts "W
1400: 72 69 74 69 6e 67 20 5c 22 24 66 69 6c 65 6e 61  riting \"$filena
1410: 6d 65 5f 63 65 72 74 5c 22 22 0a 73 65 74 20 66  me_cert\"".set f
1420: 64 20 5b 6f 70 65 6e 20 24 66 69 6c 65 6e 61 6d  d [open $filenam
1430: 65 5f 63 65 72 74 20 77 20 30 36 34 34 5d 0a 70  e_cert w 0644].p
1440: 75 74 73 20 24 66 64 20 24 63 65 72 74 0a 63 6c  uts $fd $cert.cl
1450: 6f 73 65 20 24 66 64 0a 0a 70 75 74 73 20 22 57  ose $fd..puts "W
1460: 72 69 74 69 6e 67 20 5c 22 24 66 69 6c 65 6e 61  riting \"$filena
1470: 6d 65 5f 6b 65 79 5c 22 22 0a 73 65 74 20 66 64  me_key\"".set fd
1480: 20 5b 6f 70 65 6e 20 24 66 69 6c 65 6e 61 6d 65   [open $filename
1490: 5f 6b 65 79 20 77 20 30 34 30 30 5d 0a 70 75 74  _key w 0400].put
14a0: 73 20 24 66 64 20 5b 70 6b 69 3a 3a 6b 65 79 20  s $fd [pki::key 
14b0: 24 6b 65 79 20 24 3a 3a 65 6e 76 28 53 49 54 45  $key $::env(SITE
14c0: 5f 50 41 53 53 57 4f 52 44 29 5d 0a 63 6c 6f 73  _PASSWORD)].clos
14d0: 65 20 24 66 64 0a 27 0a 7d 0a 0a 66 75 6e 63 74  e $fd.'.}..funct
14e0: 69 6f 6e 20 73 69 67 6e 5f 73 69 74 65 28 29 20  ion sign_site() 
14f0: 7b 0a 09 53 49 54 45 5f 49 4e 44 45 58 5f 46 49  {..SITE_INDEX_FI
1500: 4c 45 3d 22 24 31 22 0a 09 53 49 54 45 5f 4b 45  LE="$1"..SITE_KE
1510: 59 5f 46 49 4c 45 3d 22 24 32 22 0a 09 53 49 54  Y_FILE="$2"..SIT
1520: 45 5f 43 45 52 54 5f 46 49 4c 45 3d 22 24 33 22  E_CERT_FILE="$3"
1530: 0a 0a 09 72 65 61 64 5f 74 65 78 74 20 27 41 70  ...read_text 'Ap
1540: 70 46 53 20 53 69 74 65 20 49 6e 64 65 78 20 66  pFS Site Index f
1550: 69 6c 65 3a 20 27 20 53 49 54 45 5f 49 4e 44 45  ile: ' SITE_INDE
1560: 58 5f 46 49 4c 45 0a 09 72 65 61 64 5f 74 65 78  X_FILE..read_tex
1570: 74 20 27 53 69 74 65 20 4b 65 79 20 66 69 6c 65  t 'Site Key file
1580: 6e 61 6d 65 3a 20 27 20 53 49 54 45 5f 4b 45 59  name: ' SITE_KEY
1590: 5f 46 49 4c 45 0a 09 72 65 61 64 5f 74 65 78 74  _FILE..read_text
15a0: 20 27 53 69 74 65 20 43 65 72 74 69 66 69 63 61   'Site Certifica
15b0: 74 65 20 66 69 6c 65 6e 61 6d 65 3a 20 27 20 53  te filename: ' S
15c0: 49 54 45 5f 43 45 52 54 5f 46 49 4c 45 0a 09 72  ITE_CERT_FILE..r
15d0: 65 61 64 5f 70 61 73 73 77 6f 72 64 20 22 50 61  ead_password "Pa
15e0: 73 73 77 6f 72 64 20 66 6f 72 20 4b 65 79 20 28  ssword for Key (
15f0: 24 7b 53 49 54 45 5f 4b 45 59 5f 46 49 4c 45 7d  ${SITE_KEY_FILE}
1600: 29 3a 20 22 20 53 49 54 45 5f 50 41 53 53 57 4f  ): " SITE_PASSWO
1610: 52 44 0a 0a 09 65 78 70 6f 72 74 20 53 49 54 45  RD...export SITE
1620: 5f 49 4e 44 45 58 5f 46 49 4c 45 20 53 49 54 45  _INDEX_FILE SITE
1630: 5f 4b 45 59 5f 46 49 4c 45 20 53 49 54 45 5f 43  _KEY_FILE SITE_C
1640: 45 52 54 5f 46 49 4c 45 20 53 49 54 45 5f 50 41  ERT_FILE SITE_PA
1650: 53 53 57 4f 52 44 0a 0a 09 63 61 6c 6c 5f 61 70  SSWORD...call_ap
1660: 70 66 73 64 20 2d 2d 74 63 6c 20 22 24 28 63 61  pfsd --tcl "$(ca
1670: 74 20 3c 3c 5c 5f 45 4f 46 5f 0a 70 61 63 6b 61  t <<\_EOF_.packa
1680: 67 65 20 72 65 71 75 69 72 65 20 70 6b 69 0a 0a  ge require pki..
1690: 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 3a 3a  set fd [open $::
16a0: 65 6e 76 28 53 49 54 45 5f 49 4e 44 45 58 5f 46  env(SITE_INDEX_F
16b0: 49 4c 45 29 5d 0a 67 65 74 73 20 24 66 64 20 6c  ILE)].gets $fd l
16c0: 69 6e 65 0a 63 6c 6f 73 65 20 24 66 64 0a 0a 73  ine.close $fd..s
16d0: 65 74 20 6c 69 6e 65 20 5b 73 70 6c 69 74 20 24  et line [split $
16e0: 6c 69 6e 65 20 22 2c 22 5d 0a 0a 23 20 44 61 74  line ","]..# Dat
16f0: 61 20 74 6f 20 62 65 20 73 69 67 6e 65 64 0a 73  a to be signed.s
1700: 65 74 20 64 61 74 61 20 5b 6a 6f 69 6e 20 5b 6c  et data [join [l
1710: 72 61 6e 67 65 20 24 6c 69 6e 65 20 30 20 31 5d  range $line 0 1]
1720: 20 22 2c 22 5d 0a 0a 73 65 74 20 6b 65 79 20 5b   ","]..set key [
1730: 72 65 61 64 20 5b 6f 70 65 6e 20 24 3a 3a 65 6e  read [open $::en
1740: 76 28 53 49 54 45 5f 4b 45 59 5f 46 49 4c 45 29  v(SITE_KEY_FILE)
1750: 5d 5d 0a 73 65 74 20 6b 65 79 20 5b 3a 3a 70 6b  ]].set key [::pk
1760: 69 3a 3a 70 6b 63 73 3a 3a 70 61 72 73 65 5f 6b  i::pkcs::parse_k
1770: 65 79 20 24 6b 65 79 20 24 3a 3a 65 6e 76 28 53  ey $key $::env(S
1780: 49 54 45 5f 50 41 53 53 57 4f 52 44 29 5d 0a 0a  ITE_PASSWORD)]..
1790: 73 65 74 20 63 65 72 74 20 5b 72 65 61 64 20 5b  set cert [read [
17a0: 6f 70 65 6e 20 24 3a 3a 65 6e 76 28 53 49 54 45  open $::env(SITE
17b0: 5f 43 45 52 54 5f 46 49 4c 45 29 5d 5d 0a 61 72  _CERT_FILE)]].ar
17c0: 72 61 79 20 73 65 74 20 63 65 72 74 5f 61 72 72  ray set cert_arr
17d0: 20 5b 3a 3a 70 6b 69 3a 3a 5f 70 61 72 73 65 5f   [::pki::_parse_
17e0: 70 65 6d 20 24 63 65 72 74 20 22 2d 2d 2d 2d 2d  pem $cert "-----
17f0: 42 45 47 49 4e 20 43 45 52 54 49 46 49 43 41 54  BEGIN CERTIFICAT
1800: 45 2d 2d 2d 2d 2d 22 20 22 2d 2d 2d 2d 2d 45 4e  E-----" "-----EN
1810: 44 20 43 45 52 54 49 46 49 43 41 54 45 2d 2d 2d  D CERTIFICATE---
1820: 2d 2d 22 5d 0a 62 69 6e 61 72 79 20 73 63 61 6e  --"].binary scan
1830: 20 24 63 65 72 74 5f 61 72 72 28 64 61 74 61 29   $cert_arr(data)
1840: 20 48 2a 20 63 65 72 74 0a 0a 73 65 74 20 73 69   H* cert..set si
1850: 67 6e 61 74 75 72 65 20 5b 3a 3a 70 6b 69 3a 3a  gnature [::pki::
1860: 73 69 67 6e 20 24 64 61 74 61 20 24 6b 65 79 5d  sign $data $key]
1870: 0a 62 69 6e 61 72 79 20 73 63 61 6e 20 24 73 69  .binary scan $si
1880: 67 6e 61 74 75 72 65 20 48 2a 20 73 69 67 6e 61  gnature H* signa
1890: 74 75 72 65 0a 0a 73 65 74 20 64 61 74 61 20 5b  ture..set data [
18a0: 73 70 6c 69 74 20 24 64 61 74 61 20 22 2c 22 5d  split $data ","]
18b0: 0a 6c 61 70 70 65 6e 64 20 64 61 74 61 20 24 63  .lappend data $c
18c0: 65 72 74 0a 6c 61 70 70 65 6e 64 20 64 61 74 61  ert.lappend data
18d0: 20 24 73 69 67 6e 61 74 75 72 65 0a 0a 73 65 74   $signature..set
18e0: 20 64 61 74 61 20 5b 6a 6f 69 6e 20 24 64 61 74   data [join $dat
18f0: 61 20 22 2c 22 5d 0a 0a 73 65 74 20 66 64 20 5b  a ","]..set fd [
1900: 6f 70 65 6e 20 22 24 3a 3a 65 6e 76 28 53 49 54  open "$::env(SIT
1910: 45 5f 49 4e 44 45 58 5f 46 49 4c 45 29 2e 6e 65  E_INDEX_FILE).ne
1920: 77 22 20 22 77 22 5d 0a 70 75 74 73 20 24 66 64  w" "w"].puts $fd
1930: 20 24 64 61 74 61 0a 63 6c 6f 73 65 20 24 66 64   $data.close $fd
1940: 0a 0a 66 69 6c 65 20 72 65 6e 61 6d 65 20 2d 66  ..file rename -f
1950: 6f 72 63 65 20 2d 2d 20 22 24 3a 3a 65 6e 76 28  orce -- "$::env(
1960: 53 49 54 45 5f 49 4e 44 45 58 5f 46 49 4c 45 29  SITE_INDEX_FILE)
1970: 2e 6e 65 77 22 20 24 3a 3a 65 6e 76 28 53 49 54  .new" $::env(SIT
1980: 45 5f 49 4e 44 45 58 5f 46 49 4c 45 29 0a 0a 5f  E_INDEX_FILE).._
1990: 45 4f 46 5f 0a 29 22 0a 7d 0a 0a 63 6d 64 3d 22  EOF_.)".}..cmd="
19a0: 24 31 22 0a 73 68 69 66 74 0a 63 61 73 65 20 22  $1".shift.case "
19b0: 24 7b 63 6d 64 7d 22 20 69 6e 0a 09 67 65 6e 65  ${cmd}" in..gene
19c0: 72 61 74 65 2d 63 61 29 0a 09 09 67 65 6e 65 72  rate-ca)...gener
19d0: 61 74 65 5f 63 61 5f 63 65 72 74 5f 61 6e 64 5f  ate_ca_cert_and_
19e0: 6b 65 79 20 22 24 40 22 20 7c 7c 20 65 78 69 74  key "$@" || exit
19f0: 20 31 0a 09 09 3b 3b 0a 09 67 65 6e 65 72 61 74   1...;;..generat
1a00: 65 2d 6b 65 79 29 0a 09 09 23 20 48 69 64 64 65  e-key)...# Hidde
1a10: 6e 2c 20 75 73 65 72 73 20 73 68 6f 75 6c 64 20  n, users should 
1a20: 75 73 65 20 22 67 65 6e 65 72 61 74 65 2d 63 73  use "generate-cs
1a30: 72 22 20 69 6e 73 74 65 61 64 0a 09 09 67 65 6e  r" instead...gen
1a40: 65 72 61 74 65 5f 6b 65 79 20 22 24 40 22 20 7c  erate_key "$@" |
1a50: 7c 20 65 78 69 74 20 31 0a 09 09 3b 3b 0a 09 67  | exit 1...;;..g
1a60: 65 6e 65 72 61 74 65 2d 63 73 72 29 0a 09 09 67  enerate-csr)...g
1a70: 65 6e 65 72 61 74 65 5f 63 73 72 20 22 24 40 22  enerate_csr "$@"
1a80: 20 7c 7c 20 65 78 69 74 20 31 0a 09 09 3b 3b 0a   || exit 1...;;.
1a90: 09 73 69 67 6e 2d 63 73 72 7c 67 65 6e 65 72 61  .sign-csr|genera
1aa0: 74 65 2d 63 65 72 74 29 0a 09 09 67 65 6e 65 72  te-cert)...gener
1ab0: 61 74 65 5f 63 65 72 74 20 22 24 40 22 20 7c 7c  ate_cert "$@" ||
1ac0: 20 65 78 69 74 20 31 0a 09 09 3b 3b 0a 09 67 65   exit 1...;;..ge
1ad0: 6e 65 72 61 74 65 2d 73 65 6c 66 73 69 67 6e 65  nerate-selfsigne
1ae0: 64 29 0a 09 09 67 65 6e 65 72 61 74 65 5f 73 65  d)...generate_se
1af0: 6c 66 73 69 67 6e 65 64 20 22 24 40 22 20 7c 7c  lfsigned "$@" ||
1b00: 20 65 78 69 74 20 31 0a 09 09 3b 3b 0a 09 73 69   exit 1...;;..si
1b10: 67 6e 2d 73 69 74 65 29 0a 09 09 73 69 67 6e 5f  gn-site)...sign_
1b20: 73 69 74 65 20 22 24 40 22 20 7c 7c 20 65 78 69  site "$@" || exi
1b30: 74 20 31 0a 09 09 3b 3b 0a 09 2a 29 0a 09 09 65  t 1...;;..*)...e
1b40: 63 68 6f 20 27 55 73 61 67 65 3a 20 61 70 70 66  cho 'Usage: appf
1b50: 73 2d 63 65 72 74 20 7b 67 65 6e 65 72 61 74 65  s-cert {generate
1b60: 2d 73 65 6c 66 73 69 67 6e 65 64 7c 67 65 6e 65  -selfsigned|gene
1b70: 72 61 74 65 2d 63 61 7c 67 65 6e 65 72 61 74 65  rate-ca|generate
1b80: 2d 63 73 72 7c 73 69 67 6e 2d 63 73 72 7c 67 65  -csr|sign-csr|ge
1b90: 6e 65 72 61 74 65 2d 63 65 72 74 7c 73 69 67 6e  nerate-cert|sign
1ba0: 2d 73 69 74 65 7d 27 20 3e 26 32 0a 0a 09 09 65  -site}' >&2....e
1bb0: 78 69 74 20 31 0a 09 09 3b 3b 0a 65 73 61 63 0a  xit 1...;;.esac.
1bc0: 0a 65 78 69 74 20 30 0a                          .exit 0.