Upgrade from within GUI (fixes #190)

This commit is contained in:
Jakob Borg committed 2014-07-14 12:42:29 +02:00
1 parent 54a1f37bf5
commit d812f559ef
7 files changed
+116 -47

No files matched your search

+2 -2
View File
@@ -18,7 +18,7 @@ func init() {
bs, _ = ioutil.ReadAll(gr)
Assets["angular.min.js"] = bs
bs, _ = hex.DecodeString("1f8b080000096e8800ffec3c7f73dbb692fffb53a0bab4a21c997292bedebb284e2771d2f7fc92389ed8e9dd8cebce502224b1a648953f62eb6c7ff7db0540123f292a4e72efcd3c4d1b4bc062b1582c16bb8b0546237298aed659345f14c43b1c90c7fb8f7e24ff082ed30979996673122421402445164dca22cd72e2e594926241c9e1fbe3b30f472f3f9ebdff704a66514c07fe0ea07b11c784a1cb4946739a7da2a14f3ee694a4336816e5244fcb6c4ac9340d29819ff3f413cd121a92c91a3a23ef8ecef6f2621d53c41547539ae4d85d509029d44e2899a5259014258c86b74787af8f4f5fb3eefd9d9dd1ee1f791c25059964e915f4fd9414594987d05752444949abdfabb8ccf17ffe9bec8ea0e53c4e27414c1e3c25b320ce012848e6651c64e23702edf44bf892032fa6457fbcb3f329c848be4ea630ac644e0eaa16fe320dcb987afdbaae3f24e71783316b5066f124003407a40ffc61786a381f089d45736f5642419426c47bb0288ad549967e8a429a0dc8cd0e818f52e8877416947191fbd77936fb3b0da0ec3858b20efe67eff0f4c32f7b67e9254da0a30d6d0fd3f432a2555ba5e5dd4027b3c8d238a699d73fad4a0f8b2c86814ab4e7d374058c645d56b4230b5619fdf42a28b09bfd715d3aa7c5fb37508453d294228f82ace00c66330194b08130ec484a4259873900dcdc8db54a60a759be5c1fbdc231f695d2042412919c5f58901c253850853c51bfcad2229da6f1e102e61fe4b8265382a159866bc7c00d6b29798d7526352044343649cfe82ab58c148bb302981ab8ea4e80e911bdb27331a1347cd1709155e1a79f2dfb4f49ff158599950bc32813e5c483ef03b916c5042b915f72799196d305567c5c8530f9a2ea4e27e368ea2022a34b5015563accaa8a8830bd4ae23408ad84047941b328bfac49617f40ef9cc2124fe639a89b599a513249d33827312c0f2829a08d3a8545c180617259f94d1402eeb711204f00112c0910ab692638424e84b8100e415e8421c8784e73002cd62bd051fd825e17fdbba184ed5d707d4a93f0cd64954bf8de97c53cc595f10117d3db6819810e7f13bd1ce5830659522e273453d17d0004417294c0503e05f1a98492d790aa0ab4fd46546205dab189ca2d109e0459009a25fe40ff2c61edcbe3052e10183328842464c36e405a10422bbe3435ee21b65f60df20bc9633b1857df2e4a6d3207e912427b0ae248cac98bc8a4030604f5b1351dd425b85e875124c621aba713568501855247f633b97150bafea86e614f5ec4bbe71ca428bc5a42977b6ff78929c9814f0128295ad8d3f984d5f2469b25ea6650ee6438013c4f418df4e2d882e5495362fa353fbd2142b4e66d3c7a34dcb7158ed44dc665089573986d85e94609e80d1310dd85ef851e1dd468427419e5fa559d88e54821288574d492bb5676fe5558ac6d9dfcfce4ec08a838d083ad2f8db86ecc5c9d11bba9627ede488f0128122584597f05b9ba4da4a805dffb49c4e41f1d3d01b485a3f9a11ef3b6613c8a5d2044749547883b15ae5f5ff23a105f0e0926dabfd01eea341ecf51760eff43568d3e26876a48a84c6fed8928ca6613b11089b2fca0277aa76489b29a4127d6732f79700549cc959f7b0325a9459e262877d425c5cbf9904d3cb304b572007d01f482ec80548c3240db25018d6778e49691b606dd8cc601c0b04ae8d4e99366678fa80d0ab8cee87a43fcad7b0d09740638e7297e792b50d7649a00f4e15d0b14d0438462003db4b240fb8dde7d9a913c8ab0992db35dfdf4ffe80edd3079ee59e6c010e7c58abaf83e942421e853a7a9c315c86e07ac956e579145e9083033039c195a2b308bcafbede143f60091d53d836c88c16d305ba68cc1e32e0ec7c665dfd8cd41ef4a18026e8f17dfc7074982e5769027a0c09ee3a0b1ac7a561684cb73191fd2614bd38136b0bf123187b0e247de941e0b460bd2ff093e7c6b8aa2a178a6fccf6add9ef9a86ba7cf38459d7837dcc9213d8795da37399a4e80fa12b0acedf9537182a1005fa721ec2ecd52eeb808cc8a3fdfd7d15320ac5b6567d240f17daab03c34d16e60043182e96b3bd8f49c822c8df5f25e033ac6856acd9d439a6a88a71589682515280716ac7829d32f98b12b09681fc7741b1f097c1b5b73f247f25bb9c970ce22879b92e687e96166061ee59fc71030a9957840e89a8f1a665b1a96b7002baf4ad80393bbf23604f4d17c4a32ed61a4cd9ef3a040be09d43caf1638d69e89bcaa6c5c0630d9dd7811ea1b0777737ded1430ae0181465ae6cbe58ac5b1ab6fd07e136ee40dc1001f334b94cd036926d01a50713354c14f89ab0c6bec32e9c984f8b74b5829ead985970afe06bb88f9ad4d20dab6f5a57e0eceff9fe855fa41fa183ec10a606b6fe87bc02e665921799f7683056c7219a1f901e060ac034eb91db5bd2941e8531ede963e1d50fa19a78bd864a8c7f9cd06c0afa1e5c2731310f49effb41cf3a5ac112694096193f8cc1bff8fa131e25b3f42bcc76885e7ef6c5265b99b17e0473e3ec592cc4becba86ed0e47ce29d985659b40cc08db761b2b04f9b435528befa44c23ee91ab185bd3cfecef435c3bfdf0dab3285ab6901a30208d82dac72820b8b7731b20148348c75beb2dd6816a760cf433776b58811648b5ac4e2c399e26921b5a8e601ceb2798906fe31fc3d7a75a10a1d02da0c7d2cf7d1ca8b29eb169908acb06d6ab56a5d912265f64fbfa3b55cab4e2ea8c4c3c5a2f70cbbd0f7031d638bd6e9b3f8141b7ead8d2d9cc5c8f0bf065fd3cb6df9295cd96d98b6046b2f7773cb54d6ffb4ec32f563279e99ca7023cfdcba11c78ab1bf6fcc314118639a083db6e9f69f5be65b62f9ffdb103425d0ba4fb987f22bdd380d488c4a291334e97ccf41a68010eeb58dbeafc99e3882bdf75777df1be619b6db103b36b8a30e1747b0449f861d67caa79b80212ea81c91427aab6e93869584631d2bfe060e51e0f5639acc8b05985ce49163c4b57dd03250810d6c65a73088f3e88dd220ac1551dbd144e9f55c164a3dcfd0bda3b10cd2324655622aeb1f7cda9fec460426491cdb06ae4f71c225416be6691326f1a52b53bc92bb5cacd1a095459bf8d385399d3943c3a890ce74ec9c198dc054bba42420188f461b05daaeebea8a5bcbd5fb55e56157791b08e829a7febe00929d6e1d815f9f5d61b8c856fd02b6b7159836e43958b5364c78b8d34a0600c80df1c840f0a16bac9d9ddcd8d99a079f60f710991215530d699be2a222ff387d7fece7ec783c9a69544a1462837455b073fc054b49c99f929b3e26128102dc3b03996407f0ab552c4eb3467fe469d2bfbbd3a31bab3437627dd0178c0d081ab24e6c910e23cae18a1b02ae114b16d826246acf0c61013bb94c334c2c217ecb4c7416f0bccce09f744979fad194a79fa87356a7a47c570917fdb30ce2dc2ee54353b807e4f6d6183effb4a304891daa12aeLine truncated
bs, _ = hex.DecodeString("1f8b080000096e8800ffec3ded72db3892fffd14185d6644d9326527b3737b719ca9c4c9ec7a93382e7fcc5d95e3a9a24448e29822157ec4d6d97ef7eb064012200092b293dc6ed5ba666c0968341a8d46a3bbd140462372102f5749309b67c4391890a73bbb3f937f7857f198bc8e9319f1221f20a22c09c67916272971524a4936a7e4e0e3d1d9c9e1ebf3b38f27a7641a8474e06e00ba57614818ba942434a5c917eabbe43ca5249e42b32025699c27134a26b14f097c9dc55f6812519f8c57d019f97078b69d66ab9022ae3098d028c5eebc8c4ca0764cc934ce81a4206234bc3f3c787b74fa9675ef6e6c8c36ff4cc320cac83889afa1efe7244b723a84bea22c88725a7c5f86798afff3ef6473042d67613cf642f2e439997a610a405e34cb432f11df1168a39fc387147831c9fa7b1b1b5fbc84a4ab6802c38a6664bf68e12e623f0fa9d32febfa43727139d8630df2241c7b80669ff4813f0c4f09e702a1d360e64c732808e288384fe659b63c4ee22f814f9301b9dd20f0a314ba3e9d7a7998a5ee4d9a4cff4e3d283bf216ac83ffd93e383df96dfb2cbea21174d4d2f6208eaf025ab4555ade0fea6466491c863471faa745e9419684305089f674122f8191accb827664c132a15fde781976b3b35796ce68f6f11d14e19454a5c8232fc93883d94c00256c200c3b921251d6610a00b7f77bb54a60a75ebe581dbec131f695d2082412915c5c1a901c463850853c51bf4ce22c9ec4e1c11ce61fe4b8245382a149826b47c30d6b297a8b753a35204434d4494fe832368c148b930c98ead9ea8e81e901bd3692972f6709c8cd61348d4573852f94faaf2a16b32afce9278bfe73d27f4361dae5423f48443971e0f340ae4519c24a64a65c9ec5f9648e15e74b1f244354ddd7c9389c588848e802f488910ebdaa20c28fafa330f67c23215e9ad12448af4a52d81f504aa7b0fea3590aba681a27948ce3384c49086b074a3268a3ce6f9631609879567e1bf880fb7d00c8234004eb05646e92088e9063214b84439057be0f0b20a5290066ab2528b07e466fb2fefd50c2f6c1bb39a591ff6ebc4c257c1ff36c16e3b239c195f63e5804a0e0df05af47e9a04216e58b314d54742780c08b0e2318ca172f3c9550f21a5254c156d08a4a2c4f333651b906c2632ff140ed8427f4730e8a411e2f7081c098415b443e1b7605d280105af1755be31e62fb0d3615c26b39131bd8274f6e3cf1c25751740c8b4ec2c88ac99b00040336bc1511d50db41588de46de38a4be1d578506855145f237b6ad19b1f0aa6e684e5109bfe6bbaa2cb4584caa726bfbf3e3e858a7809710ac6c6c7ca2377d15c5d16a11e729d8161e4e1053727caf3520ba5455da2c0f4ecd4b53ac38994de7876dcb71586c53dca05089573986d85ee560bb804532f1d84679aef0ae15e1b197a6d771e2372395a004e26555d248edd97b7995a2e5f6f7b3b36330f16097828e6afc6d42f6eaf8f01d5dc993767c48788940e12d832bf85e9ba4d2840093e0349f4c40f153df19485a3f9812e7076630c8a5d20407519039833db5cae9ff474433e0c115db73fb03dc64bdd0e9cfc118ead7a07573a4da910a122ae3644d32aa86cd44206c3acf33dca99a214d76924af4bdcedcdf3c50713a67edc34a689627918d1de609b171fd76ec4daefc245e821c407f20b92017200de3d84b7c6175df5b26a56980a5d5338571cc11b8b44865da9855ea0242a7b0c8b7487f94ae60a12f80c614e52e4d25531cec12af3e385540f74c22c0310219d85e2279c08d42c74c9d405e4c90dcaefafc71fc276c9f2ef02c7564f370e0c25a7deb4de612f2c0afa3c719c365087e996c725e04fe25d9df077b14fc2c3a0dc035ebd79be20f58424714b60d32a5d9648efe1bb3873438339f5957bf22b5fb7d28a011ba83e7278707f1621947a0c790e0aeb350e3b8348c1ad34d4c64df0945174fc7da40fc08c69e02495f7b10382d58ef0afce4a536aea2ca86e23bb37d6df6dba6a12c6f9f30e37a308f59f2103baf6bf43ca3189d25f453c133bc76064305224347cf4198edd29f1d9011d9ddd9d95121035f6c6bc58fe4fe427b7560b8c9c21c607cc3c672b6f73109997be9c7eb087c86254db2159b3acb14150110c352d04a32304ecd58b053267f4104d63290ffc1cbe6eec2bb717686e4af6493f392411c46af57194dcfe20c2ccc6d83b3ae4121f332df221125de38cfdaba0627a04bdf0a98b5f37b02f6d4644e1c6a63adc6949dae433000de5ba41c7f8c018ffaa6d2b6187820a2f33aa8872fccddd5e205a85ec031c8f254d97cb1b86e6998f61f846bdd81b82102e6697415a16d24db024a0f3a6a9828f035618dfd805d58319f66f172093d1b31b3c85fc6d7701f35a9a11b565fb52ec0d9df8b9d4b378bcfa183e400a606b6fe2d5e01f3324eb3c4d91deca9e310cdf7490f0305609af5c8dd1da94a0ffd90f6ea63e1d55b504d9c5e4525c63f8e6932017d0fae9398982dd2fb71d0338e56b0441a9061c60f42f02fbefd8407d134fe06b3eda3979f7cb5c95666ac1fc0dc587b160bb16f33aa2b34299f782ba665122c3c70e34d980cecabcda12a14df7c22619fb48dd8c05e1e9c67fa9ae1dfe9865599c2e52483510104ec164639c185c5bb189900241af6ea7c65bbd1348cc19e876ecc6a11c3cb06b588c50753c5d3426a51cd039c61f3120ddc23f87bf8e652153a043419fa58eea2951752d62d32115861dad44ad5ba2459ccec9f7e476bb9549d5c5089838ba5de33ec423f0eea181bb44e9fc5a7d8f04b6d6ce02c4686ff35f81a5fadcb4fe1caaec3b405587ba99d5bbab2fea76597ae1f3bf14c5786ad3cb3eb461c2bc6febe33c704618c6922f4d8a4db7f6d986f89e5ff6f43a82981c67dca3e94df69eb3420312aa54cd0a4c33f0b990242b8d726fabe257bc200f6dedfed7db7cc336cb73e76ac71471d2e8e60813e0d3beb948f3e01439851392285f416dd46152b09c7baa7f81b384481d70d6934cbe66072915dcb884bfba061a0021bd8ca56611087d5add220ac1551dbd144e9f56c164a39cfd0bda5b10cd2304655620aeb1f7cda5fcc460466501c99065e9fe2884b42ad99539b30892f5d99e2e4dce5628d068d2c6ae34f17e674e60cf5834c3ad3317366340253ed8a128f603c1a6d1468bb2aab0b6e2d961f9785875d247520a0a3a404b8024876baeb08dcf2ec0ac345a6ea57b0bd2dc1b4212fc1aa3561c2c39d463200406e884706820f5d63edece4c6ccd6d4fb02bb8748a32898aa49db041715f9c7e9c7233765c7e3c1b446a54421368897193bc79fb37c95f439b9ed63961128c0ed3390497600bf5c86e2346bf4671a47fdfbfb7a746319a75aac0ffa82b1014143d68929d2a145396c7143c03562c902eb8444cd69232c602797d50c134388df30139d053ccd13f8152f28cf4d9af0dc1475ceca7c951f0ae1a29f732f4ccd523ed4857b40eeLine truncated
gr, _ = gzip.NewReader(bytes.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
Assets["app.js"] = bs
@@ -63,7 +63,7 @@ func init() {
bs, _ = ioutil.ReadAll(gr)
Assets["favicon.png"] = bs
bs, _ = hex.DecodeString("1f8b080000096e8800ffec3dfb5bdb4892bfe7afe878e712b2876c4832b37b047c472033cb3c927c90ecdcde7c73f7b5a5b6dd41522bdd2dc0cbb07ffb5555eb6dc9360612e6f14382a57ed5bbabaa1fda7d78f8e6e0dd3fdebe62531b85c307bb0f3defc160c00e5432d37232b56ce3e0097bbab5fd9c7dcb4fd588bd547ac2781c408dd86a394aadd2866d1821989d0a76f0e6f5bbe3a397efdfbd393e6163198a277dec6e3f0c197567981646e83311f4d97b23981a4333699851a9f605f35520183c4ed499d0b108d8680683b11f8ede79c6ce42817d85d217b1c1e1b8653e948e041bab14409231c1f0fdd1c1abd727af68f8fe03cf03ac103916f278b2d713718fc5138f27c95ecfcc621f868f27f4ca478c54180abdd73bc94b0eac0e7bcc0fb9317b3dac142a7edac32e050f860f18db8d84e5cc9f726d84ddeba576ecfdb557164cad4d3cf13195677bbdfff6deef7b072a4ab895a35040b730a288a1d5d1ab3d114c44a55dcc23b1d73b93e23c51da56aa9ecbc04ef702710664f0e86113109756f2d0333e0fc5de767f6baea340185fcbc44a1557fa9aabc6533b557aae4628e353605c08148362eba796491f7b9a6a31deeb8df9193ef61320e4f00136b0d28662581091fdc22e2f91cfaf81bfaf61a48d275757bb0357ab18c0753652ca1aab7932f08d19144ffd48c67d78d3cbe04069305321ac83909e999d2580841517161b5309632315ccd825fd642ce1410000792365ad8a76d85fb6928b1759d91890f6c63c92e16c87f5fe26c23361a5cfd96b918ade262b5e6cb27d0dd4de6486c7c603699663d7c5d503fa9386ff3efdb21831e27a2263cfaa64876df7bf1451ad6e1f81f522152b93705080cb36587e1071a836d90f2ae63efc05cd330a047293f50e406da4d000e239405874d3188283b0a17407a837c1d092e85a3d44d1992f457a75978e8121dda545cfc1c29e5b4b8b9e83820a23a503a11ded621537f00ad54435c8bcc3b65ed4395d7943dd785f960c4f9491a8113b2853a09367cd01a4b15eacbc510a46c11643d16b12380f05ce81d6680888856914176d02699290032f650cb22ebc51a8fcd31c0e106da7c9208fb97c148243661344a72c1871ff74a2d1e2e1284a03f893d1c6d3675f6db2a7cfb7f0bfed272fea14d43c90a9d961cf2ac8e7f4d94e2ed8f3f27d4ec8a7f0fa69fefaaa89178859dc0f38188e869c87620cd06e95825e436f7bab7c4d92cf433941fa23922f96d32a27706e88e7e98bbc600f65845693c7b64513608e289a9d4fa5151ee90c363d074353b306e7c251fff9d6566b4fc19c6171f83f05b3b20c8aa06f221e865e8d8a9d00658dff2b1281e46c23e217194dfff2d55f928b274507995ec12c9b809900911eba3755ed2b2a3336f833c83eccb5967156d85a06339945b32dfa93fe4e5197fd1988a2c1ca8c606265c914286d40a91820a1ce19b26aa4053f35380f870a9a6b9168056d4210c18181191226f47369a7d51e9d3c993efbf3a078dd20820632e55cb92ac47177402a0833f1c04dc50f7609439a7fc08b61ef5402aaa2193a00f82ee667c53ccecfb0c4fd41f392ff0cc498a7214cb7e00708aa27279c264d3797ec06b2e804e7480e48ebac0c6721d08afa18de4883b3d41beeca689297a0ddea31a37d9cc63c7cf2b69ffe95664fe666f7deb3a730b792ecb9df83212b26d35d129bbcb3a90cc0807a1730dbd5c777134b6a058cfe0b100b8a86adb3307537cc6ae498a461058f9c3a959fa4b005e23483e70d02ad92409dc7955228e7d9f4fea75eb31ed07f32416f0815217ba8f652c36a12ce92293a1bacf8e5913de6c0b51c89472232c98b5781b48fe211fcda1d153c0319a47a23f8c76b009618178045224e6b58109ec30217e735823f7a0a9e53101c8b446d3c5901e069103460dd0f0286cd613e527a86a0ed0e60a49587468eae3434a07f2e449354383c76d13970411a79260394f86b800706cb9e3883625682d15793067c79f36b1246ae4e978f1a438fe6b053b06b4787774215334d2d0ad94ad0a9f1780e34d7fc9a148169c1726d57149531549f36063e763ddc094df848a5abc106165f5b4f44899d354519fb68836e779086157b55292d4b76070036c51303b0736edae8b0f8ae3ece335f4b6d2c4c18e79b4cc5e18c4188741e333966b1f085315ccf5eb08c6aec9ceb1827d66c4ecaba070a4820c543e87f2c2747319afac24c42c7e504530326f4a200668eaa15ae94034944c8e87f2f1bb66e919b7591a801d5da9d3eab9750a0d61be658bc16221001ccbbcf8605c5babbc559b9694593e1bb2946fb886faa698665536e209417e05bf2338cfc21c88c15f8253e38e6dc62c2a08c27a314499e81832e485689e2ff589cd7bbeeef0e92ba282c051a8391cacc9e5503982c40eac24cf750f069646306ff3c13d19fcc936009c40ed96c79377ae8c068005a95931074652c2f7a2dbcaabfa83d561eb29f73122f2669085e140868439e6b929bf7870dcb298e8228b681ae177acc4fca1e5aa5fcab4542ee613094f4980c90b0d9085298c5e29ea9c6e5253639c0820dfcd53f3a04af8878058f825bd727fab4f8f77b001bb9d649ee862ad5ea41cd0ecd6a54237fa9e60e011d429e98dc4b4ac08fc1f4cc9f6af8e62e16be04c4be90105b5f0032f3dd377cd5654e0a7354ea1f4a2d7c62df2f8c32416fb99d5e5d2debbed4015671575d9f2796dbb44afaba235a15563e474db440754e34453c634e2e1a55aad41991139815949e1b6d15cbd6acd88cc6da79e122c26a13d6488f64cf109ec9043dfa965eb01f1701b59561a9ee2ac2c2e9724b6479d331ab2834fa49d0c98211825a6892451099641d1d524230e8047ed00dfdcd117321aaa712113710fc9a4a6e8259a133374230f71122f052c39f3292fddc97f1190f65973cac8c7fe61f78464e9a0478a5b55a17ff76603f27a37d154150d70c7fd0af986a15cb7f92bb70036eb758b3cf85ea2454a36640f30dbce3612dd2bc0dc64ea8dbaf65280c4c0c3c3ce733f33a8d46425f5d316961e84dd6d1e8e5cc52a3918c39aac8cbcf47b0a98a9af4fa5ef97740ae107bbd26b5a8cd3d22961faa34f030020d156f6633de80ebaec6e4aeaf45b1eefabcc30ec61091388a0ed9563dcc56e718ae142a993b492d7c293b59992dd8a4852b739e4a0505a2ec322cf6f6008de1563eee167bd9e51615fd7e3651c0ec7c43007ee006a2a79b2a4e67fd0615897ec7e071bf81f0bb37fc8730cb88d5e8e061a387d7eafe523b85a94af8a7a2a97347935869c1de0a1d4963601633774f7337260e69d6277bad93fb4c795ac068c9339fb8858d1fa59dae393f50cf86d2c74892b5dd0628e90a00a08856815ac2aab988895eb7c76fede10befc881245a4660127b1d49e112e115b220e09afb326c49f17758db4ea0021e4f84eeb51a0ff6e8115b7566c11d2a5a06a2656659aec449dbac9975c80ea6Line truncated
bs, _ = hex.DecodeString("1f8b080000096e8800ffec3dfb7bdb3692bfe7af40b4bdc4d933253b49bb7b8ead3bc74e5bf791e4b393ededf5ebdd0791908498241800b4ad75bd7ffbcd0cf81629c9b29d78dbfe9058245e338379e3c1dd87876f0edefdfded2b36b551387cb0fbd0f31e0c06ec4025332d2753cb360e9eb0a75bdbcfd977fc548dd84ba5278cc701d488ad96a3d42a6dd8861182d9a960076f5ebf3b3e7af9fedd9be3133696a178d2c7eef6c3905177866961843e13419fbd3782a93134938619956a5f305f0582c1e3449d091d8b808d663018fbf1e89d67ec2c14d857287d111b1c8e5be643e948b0b14a012419130c3f1c1dbc7a7df28a86ef3ff03cc00a9163218f277b3d11f7583cf17892ecf5cc2cf661f87842af7cc44885a1d07bbd93bce4c0eab0c7fc901bb3d7c34aa1e2a73dec52f060f880b1dd4858cefc29d746d8bd5e6ac7de5f7b65c1d4dac4131f5379b6d7fb6feffdbe77a0a2845b390a05740b238a185a1dbdda13c14454dac53c127bbd3329ce13a56da5eab90cec742f106740068f1e36017169250f3de3f350ec6df7b7e63a0a84f1b54cac5471a5afb96a3cb553a5e76a84323e85890b8162506cfdd432e9634f532dc67bbd313fc3c77e02841c3ec00656da500c0b22b25fd9e525cef36b98dfd730d2c693ababdd81ab550ce03a1b29658dd53c19f8c60c8aa77e24e33ebce96570203798a910d64148cfccce1240c28a0b8b8da984b1910a66ec927e3296f0200080bc91b256453bec2f5bc9c58bac6c0c487b631ec970b6c37adf8af04c58e973f65aa4a2b7c98a179b6c5f03b53799e1b1f1809be5d87571f580fea4e1bf4fbf2c468cb89ec8d8b32ad961dbfd2f4554abdb4760bd48c5ca241c04e0b20d961f451caa4df6a38ab90f7f41f28c0286dc64bd03101b293480780e1016dd3486e0c06cc8dd01ca4d30b4c4ba560f9175e64b915edda5639890eed2a2e76061cfada545cf41418591d281d08e76b18a1b78856aa21a64de615b2fea335d7943dd785f96139e282351227690a74026cf9a034863bd5879a31494822d86a2d7c4701e329c03add110100bd3282eda04d2242187b99431f0baf046a1f24f733880b59d24033fe6fc51300ea94d609db260c4fdd389468d87a3280de04f461b4f9f7db5c99e3edfc2ffb69fbca85350f340a666873dab209fd3673bb960cfcbf739219fc2eba7f9ebab265ec066713fe0a0381a7c1e8a3140bb55327a0dbdedadf235713e0fe504e98f48be584eab9cc0b9229ea72fce057b2823d49a3cb62d920036a268763e9556782433d8f41c144d4d1b9c0b47fde75b5bad3d05738ac5e1ff14d4ca322882be8978187a352a76029435feaf480492b38d885f6434fdcb577f492e9e141d64720556360135012c3d746faad25754666cf067e07db0b5967156e85a0696cca2da16fd497fa7a8cbfe0c44d1a0654660585932054a1b102a0648a873865335d2829f1ab4c3a182e65a245a419b10587060c04282413f97765aedd1f193e9b33f0f8ad70d226820533e2b57053bee0e4804c1120f9c297eb04b1892fd012f86bd5309888a66e800e0bb989f15769c9f6189fb83ea25ff1988314f4330b7e00708aa27279c8ca6b325bb812c3a411bc901699d95a11502a9a88fe18d34384bbde1ae8c267909eaad1e33da4733e6e193b7fdf4af643d99b3eebd674fc1b612efb9df83212b8ce92eb14dded95406a040bd0bb076f5f19d6149ad80d17f056241d1b0d50a5377c3ac468e491a56f0c8a953f949025b204e161c5d2809063c4d26a06ec4513c56fd589c57e84315c163b42ace4cb57b28fcab918df301f027fc2b67c47907ce510317f0b41868e30990b78af9249c2553744858f1cbf3a7e24cc3df34e9e5a83e1291495ebc779d201f5f5e56410783208c450239202bb80e4259c73c1b38d02a09d4795c479867a0ffa9d7ac079c3799a01f882a207ba8f6f22a90f6513c0228774705d7811459c46104ff786da072ce8a012211a7356808de610153959ca0c08e45a25622e734081a74dc0f0286cdc1a22a3d43d0ea645a3634f2e44a4303fae7c291a0313c76d13970411a792603e4c96b80072ad79e38956856e3363569c09737bf2661e4ea74f9a831786a0e3b05cd7c7478275431d3d42293ad049d1a8fe74073cdaf4911306c966bbb22ab8ca1fab431f0b1ebe14e68c2472a5d0d36b059da7a224aecacc9cad8471b74bb83346cd74265c9ee00c0a68868008ad419be0e9be5eaa3a5fc5a6a63c1e49d6f321587330641de79cce498c5c217c6703d7bc132aab173ae63740d32ab9a759fa9fe87d0ff584e8e62345685ba838e4b13590326f4a2006c5fd58e54ca81242264f4bf970d5bd7accdba48d4806aed4e9fd54b28d4ec0d732c5e0b1188003c8767c38262dddda25fd1d4a2c9f0dd14f315886faac94760536ed84808f08ef919e62e204c8e1578563e8416604d827e69c4599422c93370d089ca2a510603cc66bdebfeee20a9b3c252a0319c6ad8de15ac2f9a5c13552d2f4b20fac9ecfdddc861d3becef14908b2329617bd96b9aabfa83d561eb29f731c2f2669087e203068839f6b9c9bf7870d4b13476120db40e7117dfe27650fad5cfed52226f7309c4b7a4c0648d86c0429cc6276cf44e3f2129b1c60c106feea1f1d825f4773058f825bd7277ae5f8f707001b67ad93dc0d51aad5839a1d92d5a8467e4fcdad013a843c31b9b793801f8309a63fd5f0cd5d257c09887d21e3405c0032f3dd37bced654e0a7354ea1f4a2d7c9abe5f19e5b2de723bbdba5ad67d2903ace270bb3e4f2cb76995f47557bacaac7c8e9aa881ea33d164f16c7272d6a852a53e1139815941e9b9d156d16ccd8acd78b27d2e5c4c5b6dc21a099eec19024c99604cd2d20bf6e362b8b6322cd55d4558385dae892c6f3a661581463f093a593042500baeb21828e3aca3434a69069dc00fbaa1bf39622ec8f65422e206825f53c94d302b64e64608e63e42045e6af87346b25ffa323ee3a1ece28795f1cffc03cfc8499300afb456ebe2df0eece79c685f4510d435c31ff42ba610dfca7f90bb7083d96ed1669f0bd549a846cd80e61b78c7c35aa4791b133ba16ebf96a13060187878ce67e6751a8d84beba62d2c2d09baca3d1cb99a5462319731491979f8f60531535e9f583f2ef805c21f67a4d6a519b7b442c3f5469e061041a2adecc66bc01d75d8dc95d5f8b62ddf579871e8c212271141db2ad7a98adce315c2944b24885cdcf4bd9c9cad3824d5a6665ce53a9a040945d86c5de1ea031dccac7dd622fbbdca2a2dfcfc60ab8bed060801fb981e8e9a682d359bf4145a2df3178dc6f20fcee0dff2ecc3262353a78d8e8e1b5babfd44ec15409ff543465ee68122b2dd85ba123690c583173f7347763e290667db2d73ab9cf94a725188f8773de835b9af949dae99af6817a36943e4692aced36404957000045b48ed51256cd454cf4ba3d7e6b0f5f78470e24d1320295d8Line truncated
gr, _ = gzip.NewReader(bytes.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
Assets["index.html"] = bs
+28
View File
@@ -102,6 +102,7 @@ func startGUI(cfg config.GUIConfiguration, assetDir string, m *model.Model) erro
getRestMux.HandleFunc("/rest/discovery", restGetDiscovery)
getRestMux.HandleFunc("/rest/report", withModel(m, restGetReport))
getRestMux.HandleFunc("/rest/events", restGetEvents)
getRestMux.HandleFunc("/rest/upgrade", restGetUpgrade)
// The POST handlers
postRestMux := http.NewServeMux()
@@ -113,6 +114,7 @@ func startGUI(cfg config.GUIConfiguration, assetDir string, m *model.Model) erro
postRestMux.HandleFunc("/rest/error/clear", restClearErrors)
postRestMux.HandleFunc("/rest/discovery/hint", restPostDiscoveryHint)
postRestMux.HandleFunc("/rest/model/override", withModel(m, restPostOverride))
postRestMux.HandleFunc("/rest/upgrade", restPostUpgrade)
// A handler that splits requests between the two above and disables
// caching
@@ -427,6 +429,32 @@ func restGetEvents(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(eventSub.Since(since, nil))
}
func restGetUpgrade(w http.ResponseWriter, r *http.Request) {
rel, err := currentRelease()
if err != nil {
http.Error(w, err.Error(), 500)
return
}
res := make(map[string]interface{})
res["running"] = Version
res["latest"] = rel.Tag
res["newer"] = compareVersions(rel.Tag, Version) == 1
w.Header().Set("Content-Type", "application/json; charset=utf-8")
json.NewEncoder(w).Encode(res)
}
func restPostUpgrade(w http.ResponseWriter, r *http.Request) {
err := upgrade()
if err != nil {
l.Warnln(err)
http.Error(w, err.Error(), 500)
return
}
restPostRestart(w, r)
}
func getQR(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
text := r.FormValue("text")
+33
View File
@@ -0,0 +1,33 @@
package main
import (
"bytes"
"strconv"
"strings"
)
type githubRelease struct {
Tag string `json:"tag_name"`
Prelease bool `json:"prerelease"`
Assets []githubAsset `json:"assets"`
}
type githubAsset struct {
URL string `json:"url"`
Name string `json:"name"`
}
func compareVersions(a, b string) int {
return bytes.Compare(versionParts(a), versionParts(b))
}
func versionParts(v string) []byte {
parts := strings.Split(v, "-")
fields := strings.Split(parts[0], ".")
res := make([]byte, len(fields))
for i, s := range fields {
v, _ := strconv.Atoi(s)
res[i] = byte(v)
}
return res
}
+19 -41
View File
@@ -2,7 +2,7 @@
// All rights reserved. Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file.
// +build !solaris,!windows
// +build !solaris,!windows,!noupgrade
package main
@@ -19,24 +19,11 @@ import (
"path"
"path/filepath"
"runtime"
"strconv"
"strings"
"bytes"
"bitbucket.org/kardianos/osext"
)
type githubRelease struct {
Tag string `json:"tag_name"`
Prelease bool `json:"prerelease"`
Assets []githubAsset `json:"assets"`
}
type githubAsset struct {
URL string `json:"url"`
Name string `json:"name"`
}
var GoArchExtra string // "", "v5", "v6", "v7"
func upgrade() error {
@@ -49,20 +36,11 @@ func upgrade() error {
return err
}
resp, err := http.Get("https://api.github.com/repos/calmh/syncthing/releases?per_page=1")
rel, err := currentRelease()
if err != nil {
return err
}
var rels []githubRelease
json.NewDecoder(resp.Body).Decode(&rels)
resp.Body.Close()
if len(rels) != 1 {
return fmt.Errorf("Unexpected number of releases: %d", len(rels))
}
rel := rels[0]
switch compareVersions(rel.Tag, Version) {
case -1:
l.Okf("Current version %s is newer than latest release %s. Not upgrading.", Version, rel.Tag)
@@ -102,8 +80,23 @@ func upgrade() error {
}
}
l.Warnf("Found no asset for %q", expectedRelease)
return nil
return fmt.Errorf("Found no asset for %q", expectedRelease)
}
func currentRelease() (githubRelease, error) {
resp, err := http.Get("https://api.github.com/repos/calmh/syncthing/releases?per_page=1")
if err != nil {
return githubRelease{}, err
}
var rels []githubRelease
json.NewDecoder(resp.Body).Decode(&rels)
resp.Body.Close()
if len(rels) != 1 {
return githubRelease{}, fmt.Errorf("Unexpected number of releases: %d", len(rels))
}
return rels[0], nil
}
func readTarGZ(url string, dir string) (string, error) {
@@ -159,18 +152,3 @@ func readTarGZ(url string, dir string) (string, error) {
return "", fmt.Errorf("No upgrade found")
}
func compareVersions(a, b string) int {
return bytes.Compare(versionParts(a), versionParts(b))
}
func versionParts(v string) []byte {
parts := strings.Split(v, "-")
fields := strings.Split(parts[0], ".")
res := make([]byte, len(fields))
for i, s := range fields {
v, _ := strconv.Atoi(s)
res[i] = byte(v)
}
return res
}
+8 -2
View File
@@ -1,9 +1,15 @@
// +build windows solaris
// +build windows solaris noupgrade
package main
import "errors"
var errUpgradeUnsupported = errors.New("Automatic upgrade not supported")
func upgrade() error {
return errors.New("Upgrade currently unsupported on Windows")
return errUpgradeUnsupported
}
func currentRelease() (githubRelease, error) {
return githubRelease{}, errUpgradeUnsupported
}
+21
View File
@@ -32,6 +32,7 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) {
$scope.repos = {};
$scope.reportData = {};
$scope.reportPreview = false;
$scope.upgradeInfo = {};
$scope.needActions = {
'rm': 'Del',
@@ -336,6 +337,8 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) {
$scope.restart = function () {
restarting = true;
$scope.restartingHeader = "Restarting"
$scope.restartingBody = "Syncthing is restarting."
$('#restarting').modal({backdrop: 'static', keyboard: false});
$http.post(urlbase + '/restart');
$scope.configInSync = true;
@@ -356,6 +359,18 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) {
}
};
$scope.upgrade = function () {
$scope.restartingHeader = "Upgrading"
$scope.restartingBody = "Syncthing is upgrading."
$('#restarting').modal({backdrop: 'static', keyboard: false});
$http.post(urlbase + '/upgrade').success(function () {
restarting = true;
$scope.restartingBody = "Syncthing is restarting into the new version."
}).error(function () {
$('#restarting').modal('hide');
});
};
$scope.shutdown = function () {
restarting = true;
$http.post(urlbase + '/shutdown').success(function () {
@@ -606,6 +621,12 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) {
$http.get(urlbase + '/report').success(function (data) {
$scope.reportData = data;
});
$http.get(urlbase + '/upgrade').success(function (data) {
$scope.upgradeInfo = data;
}).error(function () {
$scope.upgradeInfo = {};
});
};
$scope.acceptUR = function () {
+5 -2
View File
@@ -96,6 +96,9 @@
<div class="container">
<span class="navbar-brand"><img class="logo" src="st-logo-128.png" width="32" height="32" /> Syncthing<small class="hidden-xs"> <span class="text-muted">|</span> {{thisNodeName()}}</small></span>
<ul class="nav navbar-nav navbar-right">
<li ng-if="upgradeInfo.newer">
<button type="button" class="btn navbar-btn btn-default" href="" ng-click="upgrade()"><span class="glyphicon glyphicon-chevron-up"></span>&emsp;Upgrade to {{upgradeInfo.latest}}</button>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Edit&nbsp;<b class="caret"></b></a>
<ul class="dropdown-menu">
@@ -376,12 +379,12 @@
<div class="modal-header alert alert-info">
<h4 class="modal-title">
<span class="glyphicon glyphicon-refresh"></span>
Restarting
{{restartingHeader}}
</h4>
</div>
<div class="modal-body">
<p>
Syncthing is restarting. Please hold&hellip;
{{restartingBody}} Please hold&hellip;
</p>
</div>
</div>