Hex Artifact Content

Artifact 74cf59f6d3891dff504a255c878e932e5d278aa7:


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 23 0a 23 20 43 6f 70 79 72 69  bash..#.# Copyri
0020: 67 68 74 20 28 63 29 20 32 30 31 34 20 20 52 6f  ght (c) 2014  Ro
0030: 79 20 4b 65 65 6e 65 0a 23 0a 23 20 50 65 72 6d  y Keene.#.# Perm
0040: 69 73 73 69 6f 6e 20 69 73 20 68 65 72 65 62 79  ission is hereby
0050: 20 67 72 61 6e 74 65 64 2c 20 66 72 65 65 20 6f   granted, free o
0060: 66 20 63 68 61 72 67 65 2c 20 74 6f 20 61 6e 79  f charge, to any
0070: 20 70 65 72 73 6f 6e 20 6f 62 74 61 69 6e 69 6e   person obtainin
0080: 67 20 61 20 63 6f 70 79 0a 23 20 6f 66 20 74 68  g a copy.# of th
0090: 69 73 20 73 6f 66 74 77 61 72 65 20 61 6e 64 20  is software and 
00a0: 61 73 73 6f 63 69 61 74 65 64 20 64 6f 63 75 6d  associated docum
00b0: 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 73 20 28  entation files (
00c0: 74 68 65 20 22 53 6f 66 74 77 61 72 65 22 29 2c  the "Software"),
00d0: 20 74 6f 20 64 65 61 6c 0a 23 20 69 6e 20 74 68   to deal.# in th
00e0: 65 20 53 6f 66 74 77 61 72 65 20 77 69 74 68 6f  e Software witho
00f0: 75 74 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20  ut restriction, 
0100: 69 6e 63 6c 75 64 69 6e 67 20 77 69 74 68 6f 75  including withou
0110: 74 20 6c 69 6d 69 74 61 74 69 6f 6e 20 74 68 65  t limitation the
0120: 20 72 69 67 68 74 73 0a 23 20 74 6f 20 75 73 65   rights.# to use
0130: 2c 20 63 6f 70 79 2c 20 6d 6f 64 69 66 79 2c 20  , copy, modify, 
0140: 6d 65 72 67 65 2c 20 70 75 62 6c 69 73 68 2c 20  merge, publish, 
0150: 64 69 73 74 72 69 62 75 74 65 2c 20 73 75 62 6c  distribute, subl
0160: 69 63 65 6e 73 65 2c 20 61 6e 64 2f 6f 72 20 73  icense, and/or s
0170: 65 6c 6c 0a 23 20 63 6f 70 69 65 73 20 6f 66 20  ell.# copies of 
0180: 74 68 65 20 53 6f 66 74 77 61 72 65 2c 20 61 6e  the Software, an
0190: 64 20 74 6f 20 70 65 72 6d 69 74 20 70 65 72 73  d to permit pers
01a0: 6f 6e 73 20 74 6f 20 77 68 6f 6d 20 74 68 65 20  ons to whom the 
01b0: 53 6f 66 74 77 61 72 65 20 69 73 0a 23 20 66 75  Software is.# fu
01c0: 72 6e 69 73 68 65 64 20 74 6f 20 64 6f 20 73 6f  rnished to do so
01d0: 2c 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  , subject to the
01e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69   following condi
01f0: 74 69 6f 6e 73 3a 0a 23 0a 23 20 54 68 65 20 61  tions:.#.# The a
0200: 62 6f 76 65 20 63 6f 70 79 72 69 67 68 74 20 6e  bove copyright n
0210: 6f 74 69 63 65 20 61 6e 64 20 74 68 69 73 20 70  otice and this p
0220: 65 72 6d 69 73 73 69 6f 6e 20 6e 6f 74 69 63 65  ermission notice
0230: 20 73 68 61 6c 6c 20 62 65 20 69 6e 63 6c 75 64   shall be includ
0240: 65 64 20 69 6e 0a 23 20 61 6c 6c 20 63 6f 70 69  ed in.# all copi
0250: 65 73 20 6f 72 20 73 75 62 73 74 61 6e 74 69 61  es or substantia
0260: 6c 20 70 6f 72 74 69 6f 6e 73 20 6f 66 20 74 68  l portions of th
0270: 65 20 53 6f 66 74 77 61 72 65 2e 0a 23 0a 23 20  e Software..#.# 
0280: 54 48 45 20 53 4f 46 54 57 41 52 45 20 49 53 20  THE SOFTWARE IS 
0290: 50 52 4f 56 49 44 45 44 20 22 41 53 20 49 53 22  PROVIDED "AS IS"
02a0: 2c 20 57 49 54 48 4f 55 54 20 57 41 52 52 41 4e  , WITHOUT WARRAN
02b0: 54 59 20 4f 46 20 41 4e 59 20 4b 49 4e 44 2c 20  TY OF ANY KIND, 
02c0: 45 58 50 52 45 53 53 20 4f 52 0a 23 20 49 4d 50  EXPRESS OR.# IMP
02d0: 4c 49 45 44 2c 20 49 4e 43 4c 55 44 49 4e 47 20  LIED, INCLUDING 
02e0: 42 55 54 20 4e 4f 54 20 4c 49 4d 49 54 45 44 20  BUT NOT LIMITED 
02f0: 54 4f 20 54 48 45 20 57 41 52 52 41 4e 54 49 45  TO THE WARRANTIE
0300: 53 20 4f 46 20 4d 45 52 43 48 41 4e 54 41 42 49  S OF MERCHANTABI
0310: 4c 49 54 59 2c 0a 23 20 46 49 54 4e 45 53 53 20  LITY,.# FITNESS 
0320: 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 52  FOR A PARTICULAR
0330: 20 50 55 52 50 4f 53 45 20 41 4e 44 20 4e 4f 4e   PURPOSE AND NON
0340: 49 4e 46 52 49 4e 47 45 4d 45 4e 54 2e 20 49 4e  INFRINGEMENT. IN
0350: 20 4e 4f 20 45 56 45 4e 54 20 53 48 41 4c 4c 20   NO EVENT SHALL 
0360: 54 48 45 0a 23 20 41 55 54 48 4f 52 53 20 4f 52  THE.# AUTHORS OR
0370: 20 43 4f 50 59 52 49 47 48 54 20 48 4f 4c 44 45   COPYRIGHT HOLDE
0380: 52 53 20 42 45 20 4c 49 41 42 4c 45 20 46 4f 52  RS BE LIABLE FOR
0390: 20 41 4e 59 20 43 4c 41 49 4d 2c 20 44 41 4d 41   ANY CLAIM, DAMA
03a0: 47 45 53 20 4f 52 20 4f 54 48 45 52 0a 23 20 4c  GES OR OTHER.# L
03b0: 49 41 42 49 4c 49 54 59 2c 20 57 48 45 54 48 45  IABILITY, WHETHE
03c0: 52 20 49 4e 20 41 4e 20 41 43 54 49 4f 4e 20 4f  R IN AN ACTION O
03d0: 46 20 43 4f 4e 54 52 41 43 54 2c 20 54 4f 52 54  F CONTRACT, TORT
03e0: 20 4f 52 20 4f 54 48 45 52 57 49 53 45 2c 20 41   OR OTHERWISE, A
03f0: 52 49 53 49 4e 47 20 46 52 4f 4d 2c 0a 23 20 4f  RISING FROM,.# O
0400: 55 54 20 4f 46 20 4f 52 20 49 4e 20 43 4f 4e 4e  UT OF OR IN CONN
0410: 45 43 54 49 4f 4e 20 57 49 54 48 20 54 48 45 20  ECTION WITH THE 
0420: 53 4f 46 54 57 41 52 45 20 4f 52 20 54 48 45 20  SOFTWARE OR THE 
0430: 55 53 45 20 4f 52 20 4f 54 48 45 52 20 44 45 41  USE OR OTHER DEA
0440: 4c 49 4e 47 53 20 49 4e 0a 23 20 54 48 45 20 53  LINGS IN.# THE S
0450: 4f 46 54 57 41 52 45 2e 0a 23 0a 0a 61 70 70 66  OFTWARE..#..appf
0460: 73 64 5f 6f 70 74 69 6f 6e 73 3d 28 29 0a 69 66  sd_options=().if
0470: 20 5b 20 22 24 31 22 20 3d 3d 20 22 2d 2d 63 61   [ "$1" == "--ca
0480: 63 68 65 64 69 72 22 20 5d 3b 20 74 68 65 6e 0a  chedir" ]; then.
0490: 09 61 70 70 66 73 64 5f 6f 70 74 69 6f 6e 73 3d  .appfsd_options=
04a0: 28 22 24 7b 61 70 70 66 73 64 5f 6f 70 74 69 6f  ("${appfsd_optio
04b0: 6e 73 5b 40 5d 7d 22 20 27 2d 2d 63 61 63 68 65  ns[@]}" '--cache
04c0: 64 69 72 27 20 22 24 32 22 29 0a 0a 09 73 68 69  dir' "$2")...shi
04d0: 66 74 3b 20 73 68 69 66 74 3b 0a 66 69 0a 0a 66  ft; shift;.fi..f
04e0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 5f 61 70 70  unction call_app
04f0: 66 73 64 28 29 20 7b 0a 09 61 70 70 66 73 64 20  fsd() {..appfsd 
0500: 22 24 7b 61 70 70 66 73 64 5f 6f 70 74 69 6f 6e  "${appfsd_option
0510: 73 5b 40 5d 7d 22 20 22 24 40 22 0a 7d 0a 0a 66  s[@]}" "$@".}..f
0520: 75 6e 63 74 69 6f 6e 20 69 6e 76 61 6c 69 64 61  unction invalida
0530: 74 65 28 29 20 7b 0a 09 63 61 6c 6c 5f 61 70 70  te() {..call_app
0540: 66 73 64 20 2d 2d 73 71 6c 69 74 65 33 20 27 55  fsd --sqlite3 'U
0550: 50 44 41 54 45 20 73 69 74 65 73 20 53 45 54 20  PDATE sites SET 
0560: 74 74 6c 20 3d 20 22 30 22 3b 27 0a 7d 0a 0a 66  ttl = "0";'.}..f
0570: 75 6e 63 74 69 6f 6e 20 72 65 6d 6f 76 65 5f 73  unction remove_s
0580: 69 74 65 28 29 20 7b 0a 09 6c 6f 63 61 6c 20 73  ite() {..local s
0590: 69 74 65 0a 0a 09 73 69 74 65 3d 22 24 31 22 0a  ite...site="$1".
05a0: 0a 09 63 61 6c 6c 5f 61 70 70 66 73 64 20 2d 2d  ..call_appfsd --
05b0: 73 71 6c 69 74 65 33 20 27 44 45 4c 45 54 45 20  sqlite3 'DELETE 
05c0: 46 52 4f 4d 20 73 69 74 65 73 20 57 48 45 52 45  FROM sites WHERE
05d0: 20 68 6f 73 74 6e 61 6d 65 20 3d 20 27 22 27 24   hostname = '"'$
05e0: 73 69 74 65 27 22 27 3b 20 44 45 4c 45 54 45 20  site'"'; DELETE 
05f0: 46 52 4f 4d 20 70 61 63 6b 61 67 65 73 20 57 48  FROM packages WH
0600: 45 52 45 20 68 6f 73 74 6e 61 6d 65 20 3d 20 27  ERE hostname = '
0610: 22 27 24 73 69 74 65 27 22 27 3b 27 20 7c 7c 20  "'$site'"';' || 
0620: 72 65 74 75 72 6e 20 31 0a 0a 09 63 6c 65 61 6e  return 1...clean
0630: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 63 6c 65  .}..function cle
0640: 61 6e 28 29 20 7b 0a 09 63 61 6c 6c 5f 61 70 70  an() {..call_app
0650: 66 73 64 20 2d 2d 74 63 6c 20 22 24 28 63 61 74  fsd --tcl "$(cat
0660: 20 3c 3c 5c 5f 45 4f 46 5f 0a 09 09 75 6e 73 65   <<\_EOF_...unse
0670: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72 6f  t -nocomplain ro
0680: 77 0a 09 09 3a 3a 61 70 70 66 73 3a 3a 64 62 20  w...::appfs::db 
0690: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 73 68 61  eval {SELECT sha
06a0: 31 2c 20 68 6f 73 74 6e 61 6d 65 20 46 52 4f 4d  1, hostname FROM
06b0: 20 70 61 63 6b 61 67 65 73 3b 7d 20 72 6f 77 20   packages;} row 
06c0: 7b 0a 09 09 09 73 65 74 20 68 6f 73 74 6e 61 6d  {....set hostnam
06d0: 65 20 5b 3a 3a 61 70 70 66 73 3a 3a 64 62 20 6f  e [::appfs::db o
06e0: 6e 65 63 6f 6c 75 6d 6e 20 7b 53 45 4c 45 43 54  necolumn {SELECT
06f0: 20 68 6f 73 74 6e 61 6d 65 20 46 52 4f 4d 20 73   hostname FROM s
0700: 69 74 65 73 20 57 48 45 52 45 20 68 6f 73 74 6e  ites WHERE hostn
0710: 61 6d 65 20 3d 20 24 72 6f 77 28 68 6f 73 74 6e  ame = $row(hostn
0720: 61 6d 65 29 20 4c 49 4d 49 54 20 31 3b 7d 5d 0a  ame) LIMIT 1;}].
0730: 09 09 09 69 66 20 7b 24 68 6f 73 74 6e 61 6d 65  ...if {$hostname
0740: 20 3d 3d 20 22 22 7d 20 7b 0a 09 09 09 09 63 6f   == ""} {.....co
0750: 6e 74 69 6e 75 65 0a 09 09 09 7d 0a 0a 09 09 09  ntinue....}.....
0760: 73 65 74 20 76 61 6c 69 64 5f 73 68 61 31 28 24  set valid_sha1($
0770: 72 6f 77 28 73 68 61 31 29 29 20 31 0a 09 09 09  row(sha1)) 1....
0780: 3a 3a 61 70 70 66 73 3a 3a 64 62 20 65 76 61 6c  ::appfs::db eval
0790: 20 7b 53 45 4c 45 43 54 20 66 69 6c 65 5f 73 68   {SELECT file_sh
07a0: 61 31 20 46 52 4f 4d 20 66 69 6c 65 73 20 57 48  a1 FROM files WH
07b0: 45 52 45 20 66 69 6c 65 5f 73 68 61 31 20 49 53  ERE file_sha1 IS
07c0: 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 66 69   NOT NULL AND fi
07d0: 6c 65 5f 73 68 61 31 20 21 3d 20 27 27 20 41 4e  le_sha1 != '' AN
07e0: 44 20 70 61 63 6b 61 67 65 5f 73 68 61 31 20 3d  D package_sha1 =
07f0: 20 24 72 6f 77 28 73 68 61 31 29 3b 7d 20 73 75   $row(sha1);} su
0800: 62 72 6f 77 20 7b 0a 09 09 09 09 73 65 74 20 76  brow {.....set v
0810: 61 6c 69 64 5f 73 68 61 31 28 24 73 75 62 72 6f  alid_sha1($subro
0820: 77 28 66 69 6c 65 5f 73 68 61 31 29 29 20 31 0a  w(file_sha1)) 1.
0830: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 66 6f 72 65  ...}...}....fore
0840: 61 63 68 20 66 69 6c 65 20 5b 67 6c 6f 62 20 2d  ach file [glob -
0850: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 2d 74 61 69 6c  nocomplain -tail
0860: 73 20 2d 64 69 72 65 63 74 6f 72 79 20 24 3a 3a  s -directory $::
0870: 61 70 70 66 73 3a 3a 63 61 63 68 65 64 69 72 20  appfs::cachedir 
0880: 7b 5b 30 2d 39 61 2d 66 5d 5b 30 2d 39 61 2d 66  {[0-9a-f][0-9a-f
0890: 5d 2f 2a 2f 2a 2f 2a 2f 2a 7d 5d 20 7b 0a 09 09  ]/*/*/*/*}] {...
08a0: 09 73 65 74 20 73 68 61 31 20 5b 73 74 72 69 6e  .set sha1 [strin
08b0: 67 20 6d 61 70 20 5b 6c 69 73 74 20 22 2f 22 20  g map [list "/" 
08c0: 22 22 20 22 5c 5c 22 20 22 22 5d 20 24 66 69 6c  "" "\\" ""] $fil
08d0: 65 5d 0a 09 09 09 73 65 74 20 66 69 6c 65 20 5b  e]....set file [
08e0: 66 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a 61 70 70  file join $::app
08f0: 66 73 3a 3a 63 61 63 68 65 64 69 72 20 24 66 69  fs::cachedir $fi
0900: 6c 65 5d 0a 0a 09 09 09 69 66 20 7b 5b 69 6e 66  le].....if {[inf
0910: 6f 20 65 78 69 73 74 73 20 76 61 6c 69 64 5f 73  o exists valid_s
0920: 68 61 31 28 24 73 68 61 31 29 5d 7d 20 7b 0a 09  ha1($sha1)]} {..
0930: 09 09 09 63 6f 6e 74 69 6e 75 65 0a 09 09 09 7d  ...continue....}
0940: 0a 0a 09 09 09 70 75 74 73 20 22 43 6c 65 61 6e  .....puts "Clean
0950: 69 6e 67 20 24 66 69 6c 65 22 0a 09 09 09 66 69  ing $file"....fi
0960: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
0970: 20 2d 2d 20 24 66 69 6c 65 0a 09 09 7d 0a 5f 45   -- $file...}._E
0980: 4f 46 5f 0a 09 29 22 0a 7d 0a 0a 66 75 6e 63 74  OF_..)".}..funct
0990: 69 6f 6e 20 63 6c 65 61 72 28 29 20 7b 0a 09 6c  ion clear() {..l
09a0: 6f 63 61 6c 20 70 61 63 6b 61 67 65 0a 0a 09 70  ocal package...p
09b0: 61 63 6b 61 67 65 3d 22 24 31 22 0a 0a 09 69 66  ackage="$1"...if
09c0: 20 5b 20 2d 6e 20 22 24 7b 70 61 63 6b 61 67 65   [ -n "${package
09d0: 7d 22 20 5d 3b 20 74 68 65 6e 0a 09 09 65 63 68  }" ]; then...ech
09e0: 6f 20 22 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  o "not implement
09f0: 65 64 22 20 3e 26 32 0a 0a 09 09 72 65 74 75 72  ed" >&2....retur
0a00: 6e 20 31 0a 09 66 69 0a 0a 09 63 61 6c 6c 5f 61  n 1..fi...call_a
0a10: 70 70 66 73 64 20 2d 2d 74 63 6c 20 27 66 69 6c  ppfsd --tcl 'fil
0a20: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
0a30: 2d 2d 20 7b 2a 7d 5b 67 6c 6f 62 20 2d 64 69 72  -- {*}[glob -dir
0a40: 65 63 74 6f 72 79 20 24 3a 3a 61 70 70 66 73 3a  ectory $::appfs:
0a50: 3a 63 61 63 68 65 64 69 72 20 7b 5b 30 2d 39 61  :cachedir {[0-9a
0a60: 2d 66 5d 5b 30 2d 39 61 2d 66 5d 7d 5d 27 20 7c  -f][0-9a-f]}]' |
0a70: 7c 20 72 65 74 75 72 6e 20 31 0a 09 63 61 6c 6c  | return 1..call
0a80: 5f 61 70 70 66 73 64 20 2d 2d 73 71 6c 69 74 65  _appfsd --sqlite
0a90: 33 20 27 44 45 4c 45 54 45 20 46 52 4f 4d 20 73  3 'DELETE FROM s
0aa0: 69 74 65 73 3b 20 44 45 4c 45 54 45 20 46 52 4f  ites; DELETE FRO
0ab0: 4d 20 70 61 63 6b 61 67 65 73 3b 20 44 45 4c 45  M packages; DELE
0ac0: 54 45 20 46 52 4f 4d 20 66 69 6c 65 73 3b 20 56  TE FROM files; V
0ad0: 41 43 55 55 4d 3b 27 20 7c 7c 20 72 65 74 75 72  ACUUM;' || retur
0ae0: 6e 20 31 0a 7d 0a 0a 63 61 73 65 20 22 24 31 22  n 1.}..case "$1"
0af0: 20 69 6e 0a 09 69 6e 76 61 6c 69 64 61 74 65 29   in..invalidate)
0b00: 0a 09 09 69 6e 76 61 6c 69 64 61 74 65 20 7c 7c  ...invalidate ||
0b10: 20 65 78 69 74 20 31 0a 09 09 3b 3b 0a 09 72 65   exit 1...;;..re
0b20: 6d 6f 76 65 2d 73 69 74 65 29 0a 09 09 72 65 6d  move-site)...rem
0b30: 6f 76 65 5f 73 69 74 65 20 22 24 32 22 20 7c 7c  ove_site "$2" ||
0b40: 20 65 78 69 74 20 31 0a 09 09 3b 3b 0a 09 63 6c   exit 1...;;..cl
0b50: 65 61 6e 29 0a 09 09 63 6c 65 61 6e 20 7c 7c 20  ean)...clean || 
0b60: 65 78 69 74 20 31 0a 09 09 3b 3b 0a 09 63 6c 65  exit 1...;;..cle
0b70: 61 72 29 0a 09 09 63 6c 65 61 72 20 22 24 32 22  ar)...clear "$2"
0b80: 20 7c 7c 20 65 78 69 74 20 31 0a 09 09 3b 3b 0a   || exit 1...;;.
0b90: 09 2a 29 0a 09 09 65 63 68 6f 20 22 55 73 61 67  .*)...echo "Usag
0ba0: 65 3a 20 61 70 70 66 73 2d 63 61 63 68 65 20 7b  e: appfs-cache {
0bb0: 69 6e 76 61 6c 69 64 61 74 65 7c 63 6c 65 61 6e  invalidate|clean
0bc0: 7c 63 6c 65 61 72 7c 63 6c 65 61 72 20 3c 70 61  |clear|clear <pa
0bd0: 63 6b 61 67 65 3e 7c 72 65 6d 6f 76 65 2d 73 69  ckage>|remove-si
0be0: 74 65 20 3c 73 69 74 65 3e 7d 22 20 3e 26 32 0a  te <site>}" >&2.
0bf0: 0a 09 09 65 78 69 74 20 31 0a 09 09 3b 3b 0a 65  ...exit 1...;;.e
0c00: 73 61 63 0a 0a 70 6b 69 6c 6c 20 2d 48 55 50 20  sac..pkill -HUP 
0c10: 61 70 70 66 73 64 0a 0a 65 78 69 74 20 30 0a     appfsd..exit 0.