Overview
Comment: | Updated to remove packages from cache that have been removed from the server |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
7ed2f89c7de1997ccb26a7112957072e |
User & Date: | rkeene on 2014-09-10 08:47:06 |
Other Links: | manifest | tags |
Context
2014-09-10
| ||
09:14 | Minor update check-in: aa1acadcb1 user: rkeene tags: trunk | |
08:47 | Updated to remove packages from cache that have been removed from the server check-in: 7ed2f89c7d user: rkeene tags: trunk | |
08:23 | Updated to expire cache of server index periodically check-in: 977195a680 user: rkeene tags: trunk | |
Changes
Modified appfsd.tcl from [7312652049] to [ccdd0bdb23].
︙ | ︙ | |||
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | file delete -force -- $tmpfile } } return $file } proc _db {args} { return [uplevel 1 [list ::appfs::db {*}$args]] } proc init {} { if {[info exists ::appfs::init_called]} { return } set ::appfs::init_called 1 if {![info exists ::appfs::db]} { file mkdir $::appfs::cachedir sqlite3 ::appfs::db [file join $::appfs::cachedir cache.db] } | > > > > > > > > > > > > > > > | | > > | > > > > > > > | | 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | file delete -force -- $tmpfile } } return $file } proc _isHash {value} { set value [string tolower $value] if {[string length $value] != 40} { return false } if {![regexp {^[0-9a-f]*$} $value]} { return false } return true } proc _db {args} { return [uplevel 1 [list ::appfs::db {*}$args]] } proc init {} { if {[info exists ::appfs::init_called]} { return } set ::appfs::init_called 1 if {![info exists ::appfs::db]} { file mkdir $::appfs::cachedir sqlite3 ::appfs::db [file join $::appfs::cachedir cache.db] } _db eval {CREATE TABLE IF NOT EXISTS sites(hostname PRIMARY KEY, lastUpdate, ttl);} _db eval {CREATE TABLE IF NOT EXISTS packages(hostname, sha1, package, version, os, cpuArch, isLatest, haveManifest);} _db eval {CREATE TABLE IF NOT EXISTS files(package_sha1, type, time, source, size, perms, file_sha1, file_name, file_directory);} } proc download {hostname hash {method sha1}} { set url "http://$hostname/appfs/$method/$hash" set file [_cachefile $url $hash] if {![file exists $file]} { return -code error "Unable to fetch" } return $file } proc getindex {hostname} { set now [clock seconds] set lastUpdates [_db eval {SELECT lastUpdate, ttl FROM sites WHERE hostname = $hostname LIMIT 1;}] if {[llength $lastUpdates] == 0} { set lastUpdate 0 set ttl 0 } else { set lastUpdate [lindex $lastUpdates 0] set ttl [lindex $lastUpdates 1] } if {$now < ($lastUpdate + $ttl)} { return COMPLETE } if {[string match "*\[/~\]*" $hostname]} { return -code error "Invalid hostname" } set url "http://$hostname/appfs/index" catch { set token [::http::geturl $url] if {[::http::ncode $token] == "200"} { set indexhash_data [::http::data $token] } ::http::reset $token $token cleanup } if {![info exists indexhash_data]} { # Cache this result for 60 seconds _db eval {INSERT OR REPLACE INTO sites (hostname, lastUpdate, ttl) VALUES ($hostname, $now, 60);} return -code error "Unable to fetch $url" } set indexhash [lindex [split $indexhash_data ","] 0] if {![_isHash $indexhash]} { return -code error "Invalid hash: $indexhash" } set file [download $hostname $indexhash] set fd [open $file] set data [read $fd] close $fd set curr_packages [list] foreach line [split $data "\n"] { set line [string trim $line] if {[string match "*/*" $line]} { continue } |
︙ | ︙ | |||
156 157 158 159 160 161 162 | set pkgInfo(version) [lindex $work 1] set pkgInfo(os) [lindex $work 2] set pkgInfo(cpuArch) [lindex $work 3] set pkgInfo(hash) [string tolower [lindex $work 4]] set pkgInfo(hash_type) "sha1" set pkgInfo(isLatest) [expr {!![lindex $work 5]}] | | | < < < < | | > > > > | > > > > > > > > > | > > > > | 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | set pkgInfo(version) [lindex $work 1] set pkgInfo(os) [lindex $work 2] set pkgInfo(cpuArch) [lindex $work 3] set pkgInfo(hash) [string tolower [lindex $work 4]] set pkgInfo(hash_type) "sha1" set pkgInfo(isLatest) [expr {!![lindex $work 5]}] if {![_isHash $pkgInfo(hash)]} { continue } lappend curr_packages $pkgInfo(hash) # Do not do any additional work if we already have this package set existing_packages [_db eval {SELECT package FROM packages WHERE hostname = $hostname AND sha1 = $pkgInfo(hash);}] if {[lsearch -exact $existing_packages $pkgInfo(package)] != -1} { continue } if {$pkgInfo(isLatest)} { _db eval {UPDATE packages SET isLatest = 0 WHERE hostname = $hostname AND package = $pkgInfo($package) AND os = $pkgInfo($package) AND cpuArch = $pkgInfo(cpuArch);} } _db eval {INSERT INTO packages (hostname, sha1, package, version, os, cpuArch, isLatest, haveManifest) VALUES ($hostname, $pkgInfo(hash), $pkgInfo(package), $pkgInfo(version), $pkgInfo(os), $pkgInfo(cpuArch), $pkgInfo(isLatest), 0);} } # Look for packages that have been deleted set found_packages [_db eval {SELECT sha1 FROM packages WHERE hostname = $hostname;}] foreach package $found_packages { set found_packages_arr($package) 1 } foreach package $curr_packages { unset -nocomplain found_packages_arr($package) } foreach package [array names found_packages_arr] { _db eval {DELETE FROM packages WHERE hostname = $hostname AND sha1 = $package;} } _db eval {INSERT OR REPLACE INTO sites (hostname, lastUpdate, ttl) VALUES ($hostname, $now, $::appfs::ttl);} return COMPLETE } proc getpkgmanifest {hostname package_sha1} { set haveManifests [_db eval {SELECT haveManifest FROM packages WHERE sha1 = $package_sha1 LIMIT 1;}] set haveManifest [lindex $haveManifests 0] if {$haveManifest} { return COMPLETE } if {![_isHash $package_sha1]} { return FAIL } set file [download $hostname $package_sha1] set fd [open $file] set pkgdata [read $fd] close $fd foreach line [split $pkgdata "\n"] { |
︙ | ︙ |