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.