Overview
Comment: | Updated to expire cache of server index periodically |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
977195a68090eb376e8f08ef29c13ee2 |
User & Date: | rkeene on 2014-09-10 08:23:19 |
Other Links: | manifest | tags |
Context
2014-09-10
| ||
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 | |
07:58 | Updated install target check-in: 921f12e64a user: rkeene tags: trunk | |
Changes
Modified appfsd.tcl from [8b965c29ef] to [7312652049].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #! /usr/bin/env tclsh package require http 2.7 package require sqlite3 namespace eval ::appfs { variable cachedir "/tmp/appfs-cache" proc _hash_sep {hash {seps 4}} { for {set idx 0} {$idx < $seps} {incr idx} { append retval "[string range $hash [expr {$idx * 2}] [expr {($idx * 2) + 1}]]/" } append retval "[string range $hash [expr {$idx * 2}] end]" | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #! /usr/bin/env tclsh package require http 2.7 package require sqlite3 namespace eval ::appfs { variable cachedir "/tmp/appfs-cache" variable ttl 3600 proc _hash_sep {hash {seps 4}} { for {set idx 0} {$idx < $seps} {incr idx} { append retval "[string range $hash [expr {$idx * 2}] [expr {($idx * 2) + 1}]]/" } append retval "[string range $hash [expr {$idx * 2}] end]" |
︙ | ︙ | |||
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 | 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 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} { if {[string match "*\[/~\]*" $hostname]} { return -code error "Invalid hostname" } set url "http://$hostname/appfs/index" | > > > > > > > > > > > > > > > > > | | > > > | > < < < | 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 | 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);} _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 FROM sites WHERE hostname = $hostname LIMIT 1;}] if {[llength $lastUpdates] == 0} { set lastUpdate 0 } else { set lastUpdate [lindex $lastUpdates 0] } if {$now < ($lastUpdate + $::appfs::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]} { return -code error "Unable to fetch $url" } set indexhash [lindex [split $indexhash_data ","] 0] set file [download $hostname $indexhash] set fd [open $file] set data [read $fd] close $fd array set packages [list] |
︙ | ︙ | |||
160 161 162 163 164 165 166 167 168 169 170 171 172 173 | 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);} } 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] | > > | 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | 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);} } _db eval {INSERT OR REPLACE INTO sites (hostname, lastUpdate) VALUES ($hostname, $now);} 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] |
︙ | ︙ |