Hex Artifact Content

Artifact 9e355e1b1c955c57b58601bf349e5479c375ff48:


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 69 66 20 5b 20 22 24 31  ions=().if [ "$1
0030: 22 20 3d 3d 20 22 2d 2d 63 61 63 68 65 64 69 72  " == "--cachedir
0040: 22 20 5d 3b 20 74 68 65 6e 0a 09 61 70 70 66 73  " ]; then..appfs
0050: 64 5f 6f 70 74 69 6f 6e 73 3d 28 22 24 7b 61 70  d_options=("${ap
0060: 70 66 73 64 5f 6f 70 74 69 6f 6e 73 5b 40 5d 7d  pfsd_options[@]}
0070: 22 20 27 2d 2d 63 61 63 68 65 64 69 72 27 20 22  " '--cachedir' "
0080: 24 32 22 29 0a 0a 09 73 68 69 66 74 3b 20 73 68  $2")...shift; sh
0090: 69 66 74 3b 0a 66 69 0a 0a 66 75 6e 63 74 69 6f  ift;.fi..functio
00a0: 6e 20 63 61 6c 6c 5f 61 70 70 66 73 64 28 29 20  n call_appfsd() 
00b0: 7b 0a 09 61 70 70 66 73 64 20 22 24 7b 61 70 70  {..appfsd "${app
00c0: 66 73 64 5f 6f 70 74 69 6f 6e 73 5b 40 5d 7d 22  fsd_options[@]}"
00d0: 20 22 24 40 22 0a 7d 0a 0a 66 75 6e 63 74 69 6f   "$@".}..functio
00e0: 6e 20 69 6e 76 61 6c 69 64 61 74 65 28 29 20 7b  n invalidate() {
00f0: 0a 09 63 61 6c 6c 5f 61 70 70 66 73 64 20 2d 2d  ..call_appfsd --
0100: 73 71 6c 69 74 65 33 20 27 55 50 44 41 54 45 20  sqlite3 'UPDATE 
0110: 73 69 74 65 73 20 53 45 54 20 74 74 6c 20 3d 20  sites SET ttl = 
0120: 22 30 22 3b 27 0a 7d 0a 0a 66 75 6e 63 74 69 6f  "0";'.}..functio
0130: 6e 20 72 65 6d 6f 76 65 5f 73 69 74 65 28 29 20  n remove_site() 
0140: 7b 0a 09 6c 6f 63 61 6c 20 73 69 74 65 0a 0a 09  {..local site...
0150: 73 69 74 65 3d 22 24 31 22 0a 0a 09 63 61 6c 6c  site="$1"...call
0160: 5f 61 70 70 66 73 64 20 2d 2d 73 71 6c 69 74 65  _appfsd --sqlite
0170: 33 20 27 44 45 4c 45 54 45 20 46 52 4f 4d 20 73  3 'DELETE FROM s
0180: 69 74 65 73 20 57 48 45 52 45 20 68 6f 73 74 6e  ites WHERE hostn
0190: 61 6d 65 20 3d 20 27 22 27 24 73 69 74 65 27 22  ame = '"'$site'"
01a0: 27 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  '; DELETE FROM p
01b0: 61 63 6b 61 67 65 73 20 57 48 45 52 45 20 68 6f  ackages WHERE ho
01c0: 73 74 6e 61 6d 65 20 3d 20 27 22 27 24 73 69 74  stname = '"'$sit
01d0: 65 27 22 27 3b 27 20 7c 7c 20 72 65 74 75 72 6e  e'"';' || return
01e0: 20 31 0a 0a 09 63 6c 65 61 6e 0a 7d 0a 0a 66 75   1...clean.}..fu
01f0: 6e 63 74 69 6f 6e 20 63 6c 65 61 6e 28 29 20 7b  nction clean() {
0200: 0a 09 63 61 6c 6c 5f 61 70 70 66 73 64 20 2d 2d  ..call_appfsd --
0210: 74 63 6c 20 22 24 28 63 61 74 20 3c 3c 5c 5f 45  tcl "$(cat <<\_E
0220: 4f 46 5f 0a 09 09 75 6e 73 65 74 20 2d 6e 6f 63  OF_...unset -noc
0230: 6f 6d 70 6c 61 69 6e 20 72 6f 77 0a 09 09 3a 3a  omplain row...::
0240: 61 70 70 66 73 3a 3a 64 62 20 65 76 61 6c 20 7b  appfs::db eval {
0250: 53 45 4c 45 43 54 20 73 68 61 31 2c 20 68 6f 73  SELECT sha1, hos
0260: 74 6e 61 6d 65 20 46 52 4f 4d 20 70 61 63 6b 61  tname FROM packa
0270: 67 65 73 3b 7d 20 72 6f 77 20 7b 0a 09 09 09 73  ges;} row {....s
0280: 65 74 20 68 6f 73 74 6e 61 6d 65 20 5b 3a 3a 61  et hostname [::a
0290: 70 70 66 73 3a 3a 64 62 20 6f 6e 65 63 6f 6c 75  ppfs::db onecolu
02a0: 6d 6e 20 7b 53 45 4c 45 43 54 20 68 6f 73 74 6e  mn {SELECT hostn
02b0: 61 6d 65 20 46 52 4f 4d 20 73 69 74 65 73 20 57  ame FROM sites W
02c0: 48 45 52 45 20 68 6f 73 74 6e 61 6d 65 20 3d 20  HERE hostname = 
02d0: 24 72 6f 77 28 68 6f 73 74 6e 61 6d 65 29 20 4c  $row(hostname) L
02e0: 49 4d 49 54 20 31 3b 7d 5d 0a 09 09 09 69 66 20  IMIT 1;}]....if 
02f0: 7b 24 68 6f 73 74 6e 61 6d 65 20 3d 3d 20 22 22  {$hostname == ""
0300: 7d 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  } {.....continue
0310: 0a 09 09 09 7d 0a 0a 09 09 09 73 65 74 20 76 61  ....}.....set va
0320: 6c 69 64 5f 73 68 61 31 28 24 72 6f 77 28 73 68  lid_sha1($row(sh
0330: 61 31 29 29 20 31 0a 09 09 09 3a 3a 61 70 70 66  a1)) 1....::appf
0340: 73 3a 3a 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  s::db eval {SELE
0350: 43 54 20 66 69 6c 65 5f 73 68 61 31 20 46 52 4f  CT file_sha1 FRO
0360: 4d 20 66 69 6c 65 73 20 57 48 45 52 45 20 66 69  M files WHERE fi
0370: 6c 65 5f 73 68 61 31 20 49 53 20 4e 4f 54 20 4e  le_sha1 IS NOT N
0380: 55 4c 4c 20 41 4e 44 20 66 69 6c 65 5f 73 68 61  ULL AND file_sha
0390: 31 20 21 3d 20 27 27 20 41 4e 44 20 70 61 63 6b  1 != '' AND pack
03a0: 61 67 65 5f 73 68 61 31 20 3d 20 24 72 6f 77 28  age_sha1 = $row(
03b0: 73 68 61 31 29 3b 7d 20 73 75 62 72 6f 77 20 7b  sha1);} subrow {
03c0: 0a 09 09 09 09 73 65 74 20 76 61 6c 69 64 5f 73  .....set valid_s
03d0: 68 61 31 28 24 73 75 62 72 6f 77 28 66 69 6c 65  ha1($subrow(file
03e0: 5f 73 68 61 31 29 29 20 31 0a 09 09 09 7d 0a 09  _sha1)) 1....}..
03f0: 09 7d 0a 0a 09 09 66 6f 72 65 61 63 68 20 66 69  .}....foreach fi
0400: 6c 65 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70  le [glob -nocomp
0410: 6c 61 69 6e 20 2d 74 61 69 6c 73 20 2d 64 69 72  lain -tails -dir
0420: 65 63 74 6f 72 79 20 24 3a 3a 61 70 70 66 73 3a  ectory $::appfs:
0430: 3a 63 61 63 68 65 64 69 72 20 7b 5b 30 2d 39 61  :cachedir {[0-9a
0440: 2d 66 5d 5b 30 2d 39 61 2d 66 5d 2f 2a 2f 2a 2f  -f][0-9a-f]/*/*/
0450: 2a 2f 2a 7d 5d 20 7b 0a 09 09 09 73 65 74 20 73  */*}] {....set s
0460: 68 61 31 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  ha1 [string map 
0470: 5b 6c 69 73 74 20 22 2f 22 20 22 22 20 22 5c 5c  [list "/" "" "\\
0480: 22 20 22 22 5d 20 24 66 69 6c 65 5d 0a 09 09 09  " ""] $file]....
0490: 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65 20 6a  set file [file j
04a0: 6f 69 6e 20 24 3a 3a 61 70 70 66 73 3a 3a 63 61  oin $::appfs::ca
04b0: 63 68 65 64 69 72 20 24 66 69 6c 65 5d 0a 0a 09  chedir $file]...
04c0: 09 09 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  ..if {[info exis
04d0: 74 73 20 76 61 6c 69 64 5f 73 68 61 31 28 24 73  ts valid_sha1($s
04e0: 68 61 31 29 5d 7d 20 7b 0a 09 09 09 09 63 6f 6e  ha1)]} {.....con
04f0: 74 69 6e 75 65 0a 09 09 09 7d 0a 0a 09 09 09 70  tinue....}.....p
0500: 75 74 73 20 22 43 6c 65 61 6e 69 6e 67 20 24 66  uts "Cleaning $f
0510: 69 6c 65 22 0a 09 09 09 66 69 6c 65 20 64 65 6c  ile"....file del
0520: 65 74 65 20 2d 66 6f 72 63 65 20 2d 2d 20 24 66  ete -force -- $f
0530: 69 6c 65 0a 09 09 7d 0a 5f 45 4f 46 5f 0a 09 29  ile...}._EOF_..)
0540: 22 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 63 6c  ".}..function cl
0550: 65 61 72 28 29 20 7b 0a 09 6c 6f 63 61 6c 20 70  ear() {..local p
0560: 61 63 6b 61 67 65 0a 0a 09 70 61 63 6b 61 67 65  ackage...package
0570: 3d 22 24 31 22 0a 0a 09 69 66 20 5b 20 2d 6e 20  ="$1"...if [ -n 
0580: 22 24 7b 70 61 63 6b 61 67 65 7d 22 20 5d 3b 20  "${package}" ]; 
0590: 74 68 65 6e 0a 09 09 65 63 68 6f 20 22 6e 6f 74  then...echo "not
05a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 20 3e 26   implemented" >&
05b0: 32 0a 0a 09 09 72 65 74 75 72 6e 20 31 0a 09 66  2....return 1..f
05c0: 69 0a 0a 09 63 61 6c 6c 5f 61 70 70 66 73 64 20  i...call_appfsd 
05d0: 2d 2d 74 63 6c 20 27 66 69 6c 65 20 64 65 6c 65  --tcl 'file dele
05e0: 74 65 20 2d 66 6f 72 63 65 20 2d 2d 20 7b 2a 7d  te -force -- {*}
05f0: 5b 67 6c 6f 62 20 2d 64 69 72 65 63 74 6f 72 79  [glob -directory
0600: 20 24 3a 3a 61 70 70 66 73 3a 3a 63 61 63 68 65   $::appfs::cache
0610: 64 69 72 20 7b 5b 30 2d 39 61 2d 66 5d 5b 30 2d  dir {[0-9a-f][0-
0620: 39 61 2d 66 5d 7d 5d 27 20 7c 7c 20 72 65 74 75  9a-f]}]' || retu
0630: 72 6e 20 31 0a 09 63 61 6c 6c 5f 61 70 70 66 73  rn 1..call_appfs
0640: 64 20 2d 2d 73 71 6c 69 74 65 33 20 27 44 45 4c  d --sqlite3 'DEL
0650: 45 54 45 20 46 52 4f 4d 20 73 69 74 65 73 3b 20  ETE FROM sites; 
0660: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 63 6b  DELETE FROM pack
0670: 61 67 65 73 3b 20 44 45 4c 45 54 45 20 46 52 4f  ages; DELETE FRO
0680: 4d 20 66 69 6c 65 73 3b 20 56 41 43 55 55 4d 3b  M files; VACUUM;
0690: 27 20 7c 7c 20 72 65 74 75 72 6e 20 31 0a 7d 0a  ' || return 1.}.
06a0: 0a 63 61 73 65 20 22 24 31 22 20 69 6e 0a 09 69  .case "$1" in..i
06b0: 6e 76 61 6c 69 64 61 74 65 29 0a 09 09 69 6e 76  nvalidate)...inv
06c0: 61 6c 69 64 61 74 65 20 7c 7c 20 65 78 69 74 20  alidate || exit 
06d0: 31 0a 09 09 3b 3b 0a 09 72 65 6d 6f 76 65 2d 73  1...;;..remove-s
06e0: 69 74 65 29 0a 09 09 72 65 6d 6f 76 65 5f 73 69  ite)...remove_si
06f0: 74 65 20 22 24 32 22 20 7c 7c 20 65 78 69 74 20  te "$2" || exit 
0700: 31 0a 09 09 3b 3b 0a 09 63 6c 65 61 6e 29 0a 09  1...;;..clean)..
0710: 09 63 6c 65 61 6e 20 7c 7c 20 65 78 69 74 20 31  .clean || exit 1
0720: 0a 09 09 3b 3b 0a 09 63 6c 65 61 72 29 0a 09 09  ...;;..clear)...
0730: 63 6c 65 61 72 20 22 24 32 22 20 7c 7c 20 65 78  clear "$2" || ex
0740: 69 74 20 31 0a 09 09 3b 3b 0a 09 2a 29 0a 09 09  it 1...;;..*)...
0750: 65 63 68 6f 20 22 55 73 61 67 65 3a 20 61 70 70  echo "Usage: app
0760: 66 73 2d 63 61 63 68 65 20 7b 69 6e 76 61 6c 69  fs-cache {invali
0770: 64 61 74 65 7c 63 6c 65 61 6e 7c 63 6c 65 61 72  date|clean|clear
0780: 7c 63 6c 65 61 72 20 3c 70 61 63 6b 61 67 65 3e  |clear <package>
0790: 7c 72 65 6d 6f 76 65 2d 73 69 74 65 20 3c 73 69  |remove-site <si
07a0: 74 65 3e 7d 22 20 3e 26 32 0a 0a 09 09 65 78 69  te>}" >&2....exi
07b0: 74 20 31 0a 09 09 3b 3b 0a 65 73 61 63 0a 0a 70  t 1...;;.esac..p
07c0: 6b 69 6c 6c 20 2d 48 55 50 20 61 70 70 66 73 64  kill -HUP appfsd
07d0: 0a 0a 65 78 69 74 20 30 0a                       ..exit 0.