From 6673b6014fdc04976b5bbd95187b28dcbf1a7e19 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 13 Oct 2014 15:05:18 -0400 Subject: [PATCH 01/46] propellor spin --- src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs index 056578a..20ba784 100644 --- a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs +++ b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs @@ -65,6 +65,7 @@ tree buildarch = combineProperties "gitannexbuilder tree" buildDepsApt :: Property buildDepsApt = combineProperties "gitannexbuilder build deps" [ Apt.buildDep ["git-annex"] + , Apt.installed ["liblockfile-simple-perl"] , buildDepsNoHaskellLibs , "git-annex source build deps installed" ==> Apt.buildDepIn builddir ] From 158cbd0fbf414cbaede9b030edbf77a5890098a4 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 14 Oct 2014 19:22:01 -0400 Subject: [PATCH 02/46] android chroot switched to jessie --- src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs index 20ba784..d9dc114 100644 --- a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs +++ b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs @@ -132,7 +132,7 @@ androidContainer dockerImage name setupgitannexdir gitannexdir = Docker.containe chrootsetup = scriptProperty [ "cd " ++ gitannexdir ++ " && ./standalone/android/buildchroot-inchroot" ] - osver = System (Debian (Stable "wheezy")) "i386" + osver = System (Debian Testing) "i386" -- once jessie is released, use: (Stable "jessie") -- armel builder has a companion container using amd64 that -- runs the build first to get TH splices. They need From bf238a34ee3c72bd579deb8991fe7529b99bbe22 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 15 Oct 2014 00:49:39 -0400 Subject: [PATCH 03/46] propellor spin --- src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs index d9dc114..8604cdf 100644 --- a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs +++ b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs @@ -117,7 +117,7 @@ androidContainer dockerImage name setupgitannexdir gitannexdir = Docker.containe & User.accountFor builduser & File.dirExists gitbuilderdir & File.ownerGroup homedir builduser builduser - & buildDepsNoHaskellLibs + & buildDepsApt & flagFile chrootsetup ("/chrootsetup") `requires` setupgitannexdir & Docker.tweaked From 8a6da9ff731e446a8e74befae1f8dc610cce6082 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 16 Oct 2014 12:13:55 -0400 Subject: [PATCH 04/46] full auto baybee! --- src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs index 8604cdf..d480e02 100644 --- a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs +++ b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs @@ -114,17 +114,14 @@ androidContainer dockerImage name setupgitannexdir gitannexdir = Docker.containe & os osver & Apt.stdSourcesList & Apt.installed ["systemd"] + & Docker.tweaked & User.accountFor builduser & File.dirExists gitbuilderdir & File.ownerGroup homedir builduser builduser & buildDepsApt & flagFile chrootsetup ("/chrootsetup") `requires` setupgitannexdir - & Docker.tweaked - -- TODO: automate installing haskell libs - -- (Currently have to run - -- git-annex/standalone/android/install-haskell-packages - -- which is not fully automated.) + & flagFile haskellpkgsinstalled ("/haskellpkgsinstalled") where -- Use git-annex's android chroot setup script, which will install -- ghc-android and the NDK, all build deps, etc, in the home @@ -132,6 +129,9 @@ androidContainer dockerImage name setupgitannexdir gitannexdir = Docker.containe chrootsetup = scriptProperty [ "cd " ++ gitannexdir ++ " && ./standalone/android/buildchroot-inchroot" ] + haskellpkgsinstalled = userScriptProperty "builder" + [ "cd " ++ gitannexdir ++ " && ./install-haskell-packages" + ] osver = System (Debian Testing) "i386" -- once jessie is released, use: (Stable "jessie") -- armel builder has a companion container using amd64 that From 0f1fcc24f89a7b8f8be1bcd71e800739d46b7912 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 16 Oct 2014 17:02:16 -0400 Subject: [PATCH 05/46] propellor spin --- src/Propellor/Property/SiteSpecific/JoeySites.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Propellor/Property/SiteSpecific/JoeySites.hs b/src/Propellor/Property/SiteSpecific/JoeySites.hs index 77af65f..bd9e01e 100644 --- a/src/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/src/Propellor/Property/SiteSpecific/JoeySites.hs @@ -72,7 +72,7 @@ oldUseNetServer hosts = propertyList ("olduse.net server") oldUseNetShellBox :: Property oldUseNetShellBox = propertyList "olduse.net shellbox" [ oldUseNetInstalled "oldusenet" - , Service.running "oldusenet" + , Service.running "shellinabox" ] oldUseNetInstalled :: Apt.Package -> Property From b971afeccd69c1f3b597c071fd77d1d5273bde6f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 17 Oct 2014 12:38:07 -0400 Subject: [PATCH 06/46] propellor spin --- privdata/privdata.gpg | 1491 +++++++++++++++++++++-------------------- 1 file changed, 746 insertions(+), 745 deletions(-) diff --git a/privdata/privdata.gpg b/privdata/privdata.gpg index 4748408..62fb3b9 100644 --- a/privdata/privdata.gpg +++ b/privdata/privdata.gpg @@ -1,749 +1,750 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -hQIMA7ODiaEXBlRZARAAtJVYjYAhXNfNxuQs25QLREubNqGIDGL5oCoCzd63VkFQ -7rl+3HYTdeM9BW5uHHsQ5jnVTML5zAP9AmJzfa+FCw9ACgo34fY/rH/KwksS/4G1 -xWH7wyCZcIGQxFbEZJYVbMexK2KfWVMv3qhtiFme0waNcIL1uhs3wv8NHkFfwoD1 -//1pYPuWa6yuMRbxkSCIply+5k2ui4jPl6X3ePxclSh/oSeDicly/gn8XmUyfX91 -T5SYCG1WoH6O2N5YRCMAVwWnPl3TvthRM8XrziMR3UiNo/wM1AvY1/Ay4aRZZ3uw -CobdrvDimGEKqPhwYdzLtdJq3b/s4zEs8fj/pgB5gu/0wZ46LUNgNTaJflcn42JZ -8RPbDNX+oF7tvx/tBsvrFLGT9IxI6mK0s02uNKQcmD9+BiMV33yf4oEPaUUFhLQG -YumlgFhj2JbdeC3VJ+ifx8h7pad06YvsC8UFfEqSCK3h6Ww61TgpE/SSjMlfCnjK -gi4bPUO7EHg5H0jJgjClzWRfKikXegk6J0OgpzVeskOqAABdsehCGFZFAuNYG/39 -sIEeSr/KBW10w4pSr4ogE5+9fR5rfQDBQp5dSYhsFr43FjYM9G9gg6Acw24uDj9n -6ESRKYt/OVJ0XkjsaPSg/tJKmqjcNm9i2mqiMxAUhRW7pVhBQjVCkp0hMomyWT3S -7QFjOe+XaXu8E9Dp7zutGnJc4LQjd6N/ezq0FfFewpL4zwf04v50VO5inUUs5Zix -64zy91Da+sGmjkzFt4eLCfB/B8a5LkrE2lcveyb/iai4fDcBLXvQL8ui225cJApU -nfT3yb7S+jBoilEhJBQGz39VfjUB/CeAWDx/2uSGT9/gkLAFu5gred2ch8DKxbnP -U/jyuqK+GCjmNI1a2wj8MSUpwpahzRrJ5s0TyRFcPnyE1wg1H24JdZYWeCK6wGd1 -rZnPkkxRQrizM4kwq2VhBsMr+0nXSxKq2hQ/ELgAkDYpwEZ0hzZ/Dr1WSwlbVLVt -T8DSXszUKlsewGV1/VYlktNhUWNKal+jt6SX3jkQ4xdZL7OYAdrAnTj59H76C8iu -qUQh8J7wPyaR20bmosuaKKUlFuwXfdVutBdIt5+EcCUqf+fvv5jmYUyAyfAXakzg -gHyJ9x4UE4jO2uc8jbpwrepga6Fz3PPuzLk/fqfTW9++CmiYkHUmEhXmkIwVOxFA -qYxIlhVEUGT70jZ4rkiQT5/cHPVWtldhnBTFeocrTZoXsZsKjzVuFerBq+xVWq2J -DO50sKooWw1ZWH7IIFeinm/d0Y9q2yPmn2Pxdc5UDL8bjXpumsle1AymosHGf0Xx -hFC/mthD51LT2pFvj2fZEry0UyFwWditQ18T8rxKhUPDkPAMklyElQWHcJ/n9ojU -NpxwBbdIWsIZ4bJl5LmgYR1ovJrTXHnpKSGeo0EJLgS3IGQPUDWswhvcyvFL0HvD -MZRQC0fPEIjL9P/C46lejr336y2DQm/EfZFPh/16J5YkfssT/EXCDF6+yYfTZ7hU -FqzVHP2puc56SSzfsembtxrjacwlsFKJYVC9cFS8G+GqbGFEnNL21Ruta2mBcqdJ -6MvRMsKSZZzVIm6zj/Agw0umlbMZx5SES9x2Yph+pY1Yap2/CDK2Xe1A2gXrUn22 -pNdRKdAHOuD7IXOqyzfnonYSEFUpyktiZBiJBowVbjR/UK5AWa5gBSD02v1alXry -OBlc6ya+Qb3iPDTbmbRKwqwMJ6DZhOLngaFZg8QFr6nl9/SRrnbpGf3yJlWEW+zW -616PGWwHp11kFPhPxGseb/fdvqlnH+pgzcURPmOUKvNw49MU60haE4xfj642CzbB -prwKx0pFilOsBusdCWUpvpr/HcsgB5KJH0lmsY0uhl/cue+LkRTKv7KArjNL+qPr -9zy2XJ5VqUt6kYjaOsusVuWBeRR37vuo3Jik7morTdGvNJB0aPYBWA9No2V16vZn -VISfNS4xwCos0aRFr4DRqQ7zC5nk56YrRhXifXayGLJGOtTUhtRjoVWbm+RgCS2K -AhLeWkVgkvMYlX0U6FXlzHBvsn+pmwJ+oy8f+iJgtzflFsy+y23/xj/n8/55g3uw -qRGTw3kW4rumGJ7PQYvJ6umBgUnlBwVjWjb7NFSe0HkESIVMVnu0vt1/g3Eyeyii -hIh+gyMaTpOfA+qfggvT+mwWwct6oI4OVDA+5Y2/BnUO7s0Ft7ATsTXf/ubxxyML -KftAK359mtiEv+5HGBMEkc6hf8NTmzH7TLPa0KLm7vp0J5X6pJbE/y9izMFiIMKm -w+hptkzOm5KE02XdSDMGh21mVJGobZENR07ajR35ntRhl84SC90hFdXQRatApdZn -Z/jBp9Uw7M82QvPTkoTiaS8uFhZYTO61He80aNWk7rbvZ1P0nw6U/oWfwMj5mWyE -4XOR/NV6Px398CUCaNvwS5a8J6rScL6v/2Eg5gc8krdPkzsWE65lniiGwo1WqIeE -29GWrD9psFRje8xLOu71rKLc3JbXxVV5MutLx6GOJVImvlnDILHiofkq5kox3Q0s -MQ+UzKg14oK5iUdtYgRvujcsaSZXp7ep9eGdKaBGZ/yBw3BwZnCVriuXEYjMJ1FC -3TlGooV3/4JhlXDaPhw9FwIfwicJ0hDY+f4rv7n+9YmHhRoQSxr4usZro1owHtUr -fqT/27jyvIAYMCye6QGEFD6v/elI3e2Dk4d8IZeo2kV5tAp7h6LDAmmeZ8MerIOX -F9RMsUSlSpFv1sFRhBkcBDgo3vIP/2ePiydSkFiCu1U6ukjZwhIkhLNaiLu3oAq6 -5t6PgxPM1ANguH18hBKW7K5A24RKaeNcywwbWB51S22AcN91d/H//pOUTMYdzWoR -qfanaqK8XeVMILj6gD2H0qFhu0mQO1tpgzuNT58ly1O9P7CtsklXFw7LyH0e3851 -lj4t6Tf2ZpGftszUu3kXv+SWt0ggGkO3AjyH99H7pg/CL7H/6Y4YWuh4Hp9hrQRj -wCFUAcPxxp51xeiKNpeJAvH4V3pLC9+WDBbC7JgNFvTWODzmMsFk0vRjWq5tVh6a -ghaivHLajvtXB2gD4wiQG8uKO1yUI9rIo/HWOQuGbJmpJheagpXELBdAAShqDyYR -P+svvjizGyJuRFIq2gdSUN8RGRzbrMr96yJ0y/JX1VLBYMz6qNQUN1jVLDjFG/7G -TYr9wTtWQd6x6bfCkD4C+ZdnNHBwRWYXzbIQtB9w+Tk6W5VGkwQZ69BqGLWD2H4m -pXzImsMrAnQ63sZElmeGh21q9CodzCThZhkT6OdG+dNBD7cFAXX7jQ0Qf7eII+4y -/OmjehPOy/53L6h+NfeCV/NfyvZ9cM0jAl2cfMPFYWJHf62sOSzdeYXYrCjzyaqe -5ixkAQAQD1znFLjj0AZLRx/9x56NBrrzuM2IOjwXG82g3jFFTlFm+j7GPPOFf4f5 -TR/7rF1wEuYqnY88+XmF6RYljHcYzCsxSzBCiHEhfYKbwn1hpnt35Lnl9KxbmTqA -l8XM9OYy2ZEdYjtWNko+7gmdReWML6dbxvEwZXCydQEPbc0zTOLWVDyd5LQ9z6R6 -ONOdlu0I2WcW//hrUqtBVtI0dcpKs4cKZCNNgZ0aQtCdHm74BvvaLYN/OOrWsU6h -iz7Sz/ueKb5rrFQgu8P5vatN9ASd1V6tnB+m6AXMQZq9BqYxEXZ7pXOrcAWamIU7 -EImELl2Z+c1rTH38EqoqM3TZq3z6DS11f2fG3omC5jLoctJzHi5ekYqN7Z4/Kb75 -NDMXE6OSa3CbvVkjKGGRBbHrAUPLN7S5dT/c0t92iaBy2Ehti1hEhtkgbi0xAOyN -hDDDjy6wHaNrcAXj4VpJwv2Uz9oSX36oK4II6JmpXh79pxE71ud/XIM6WEQJIp6c -6oRht3nmV6yPHkRpXw2cJ8wghwDhc2K1O7lkDtRpqvAZAYW0Eu4CwGfa+0IMJUFO -wIdTE7sh2zLxgob+fn5o3LFe9OVfNbM2xYD3W5kcAiGecqwJrXJf4P6Wsqdzpc1Z -iyV0dTQAPbLTzF7rGKzHSiwIgm9suUJIZTzL3faXQHAEMgkYWRyj969Lm1Ly498Q -An7AfuJMOVj5/+arsVTqKjtak9/UJ0k3qxzCnHo2//B9xf0jIp1dJ4J9vAkRXBBe -f6xSH24mjc+D2xEkfChNjnxiFhFeifklM97JbskXx1x/bykCsvm1xHFnsuGaXJn2 -QYm7mqb+ehin+3Fj5Hy/FkAX+j9hasv7Z5frW/4JgXZCW+nA3mQRcb4BmdQcAV79 -NLe5brAk0Od1e5ZgbwLrcLRq+exDAnYyEqI02fvA7EwUoF9k6FQxQETrcmVzTxyC -qvc39UQF7cfuxGMRTWWN1/1c8H8nsDm88XhFOQGuxEPF0AsNYAIOaGa8gAE2tTz+ -BCWCxdJ89EZPo9BoROjmwr0OTqhKq3rHJ0iJpOHCKw9QKurV+Fx++WatAhJ1ggtM -GYwkHRD/JCL9zhYMAknDa1yOe70fistZ6itnOsJbDUTK4ZrwE9WwLM0mHIcE0NtM -h5m3pDoxE4Eoefy3XEZ9kXXhXN6LZgkqhq/5Q9cLyrWBS+76cQpktEEiB3lua7VJ -QtfIlpNqNNQLafto5DrhDIA/K7jf2G40DJ0fs6tOdkXSWBseSPM9G7U3a+tMb2Eb -IU46b3lpgHSMDekPwoQvjvx97cENi5GEhqxrrqGREFPSlKtoOV4vawjZ4gLi02zo -IC3Z5VbaE9UfDT875zWYviBa/5eFzaq0KtDd97NMzQu8WSkwbsb8PIG8ptX7wbn2 -Ex5ovvGH6nPo3cvtEXaVt7TrSRUh3VKyx1X3D5O8+em/gIVMV4y0R6LAb8c1jiY4 -4ZEs8pQqTiApWh4RRKtCZ0yGLD+tNjiI1YjnuKM6jH0YtwMd/jvcKWcopX8hBPvT -SJMMldSADlqxme2YTrkzCz1jDs3fBtdeHvqq6/wfFZnvb//h3KzF3XCZbcyJgCgb -qQO4Iu7dD1X0rHDHHg8cGPpJlHlrhMulVlqouKFuSNpqN9pXw+KfMI1gMitsBXMa -W1cIKB/7k2AtRcsSzxVLywyaXm0QMoHtPm0XspAcQM81gYA0FcncMvfUDnbsb5xZ -sQhEMquQGkxyOo8RqJp7a27Sj9eLZ+sVXpAAymogWY4nu861StmjbQkxKnypIpfc -CeQzpARMT5PKkaZoE7ob54qYcPxfHUHqPE8pCKqDg3wWNd35hApPTPVdWKB9ZfEE -kIwkhlrXUn1Ai/XpLbufqO85pj0mnnwSoW7rMNZJh07XFLaaVJksg28TKg9ivd+p -YTZfp56yIOTFAygraVp+AWpHxE1ogmOp0aOrpXZACKTe6g6/2G/69znbc/FV8ARF -7sKtBnUwmFlB0c35AXe/C2/ITEPDkEoER92CNW4wxJk9yAsPausBxqbeaxiioT1K -CwZ3Me3o2BxSucjID5eqfblVKXkgXLRY8fsC817jLz/ktS892Ik6rCHY+K5e6Zu8 -cRMcKwLC2ETn8tr7Nw+0itD167DUAyQT7nxB+Z7/xktd9moh2wefF+ItSDY+Ox7m -023ej5dn+0GriWKxpQeZQperBfq85e7NgsTI9JOFAm7vchbLdsidBEQN95XgGCG6 -dEnQXFiRCn0kxO6wp8Pg0SYb0tCZlUHo0JyM0ZhmEAsfQH9EzyAh6nH90IrbzGUN -6jkXW2xl2CHIvyGSkKPOlGxocAp0gbr2WTYaNnL7C7Ogx0CDnWY73Baq5LRW9VG6 -Y+SGDJDzg3w2iRvL0Prss1huBWjBJn0XYLP/7g2YYxCGFlu7f/312gu2XGi/B9pA -e3qsjetT8TIpOPIpmV/mNxMk/yKIdIgNtD6R00maWbomLxB4MAgDs+6btXZTKHiC -WfoImcz+4A4alL73ufXdXo6eewj4v0bjF+1pGB3KuBZpQZD0owsnPW+i80xw3QaQ -vDkRq05bHa7yOSPJ3zdjfuBaPcfAipYJ6JHl5z+D9+t5aopjqm/pTcvoXVqW0Awm -mZEWc1v/UUMFDLlNhEhd1FTHzOGOx6H5sK8lTRgFStjLt2XDDjIuuuRvKvLNbQhT -iitRsmKK+NTPoqZm2IV40MJe6nHBUPxlfAMiGXMyDfk+dfgq+MAVLqLSpDXwKGR2 -5GN9OGcXyclusX2+vW2GkDWWggWjInixzKXh6L7FIzCw6TP+g6CG/hj5ci+gHPar -uBVTJ7nSMjNv1evVslduvqcOhv1SzdOrUOIiWTLOW4UcbE/QYg6g0gBLp6PBjQki -ny13v6wR07GHZG0XCw4bgBD0JKHQCKBFh4JLrVx7Xe5/QjLuXXtHI01lYqewlTBd -eOrvv+OpaKPhL16jk+lhiSlB5Qow30XF3QTSX6u/QsiGtsur3QjicW+xiVsSUfQy -Il0eG4Ej7WE0jpT34w3xRrjjHj4x6vQStqgY9WKkb60DMPWsh+mvIzH01+QzxsUO -bQ55qrV6daP70ztIhMBx/onHHRwIhg0SikJn/74W9MW4UfC4VoS5mNuUGzXRgY2L -wfZvl7OoaIQYCC3GbF/syYyzs/j3Gfskq+vb99ve+TaRd734+5IXVTy+5Ikf9uoa -N46WJDg51SWzx+SONnG6LkrdPl/9KNdeeGxM3bLYRrMSMhAr0s0E2PBeBLbdY0Qs -ezA+xEQyl6B2efefVzn+fhWSP7fhFX5VGIjxQx8ulDWeonfA4y//EFS6ZYS+3Awl -qZUjjw9xefzbGm5twhUy5RE6N9Pe0iuQHndDHTt0KYPnz0MDO24ClwUMsNA15V8n -WJgdGpMEaNzF9opdAVLhn6BM68lCF72rF5uTcjk+diY5U42/3SRMB4SiRmCOiAJl -WJ7ZngsOr+XjlQT5l3kvB5J+QnaEVHr6JAFBa248JdLMLdGvaPBUMkq9ZZElCUeX -WSfgQzeugdKzGosc6cDNTLYeJEF3T+glLp5YC1poUdbUJ2JvjRVUPuX+fUCARwEJ -g+8xdgWd6Wm56Zwc94uuKcNdlijPmJMMDR0TxmC0xMYR2Tlc0B7MAlIKDlJODHLK -kbh8/Pp9MrZtbbCuHOIdUvsrO9wLURN4Tnq0HCkcr9vW5wla10JWj1uMFH+yqerW -huj9MpzbW1KhJibB8tV8Jw0tzU5nqR9DvUDO3365ITyilw9GUhAuKrvOdcnEUIll -DEIOfL4uF8+b9xMuO8iV/TQpzt/3cVGZzPXe/bLPB5tbXWEWC7P8dhr5la3WEwc8 -+uFECxAAYS3MOk3uK5h604C7i5PpeQec3FeiKZWW/jwAYzwjYO8JkXOmxhzztLrJ -lW/S2bY9Lcu3hR3hO2kju8Cy7jppDHT/JTcS8VYDpADJJJgglFeDAJZYv8vFF5lb -4MkkR4hb8yzWJlDO9Uh/Eq58uk3dxuTwd3h22rKh0d39xJwzHjnAZpmP237ZD5Xg -4finr6ltPK1fguE0u9QOdcDdWeOJ8OjEAM5TB5tUYKNzFf0nk//3yrFonJYowPLr -ZVcC2wDnnB95FwkkBO6wLzuR1524z1AwmBz64On4Q9w9I+NW5ai0eBUxDkxvOFzd -i+HWec5LFX3130BeAYpC40Wi0YxIgf3aRA+QNUfrfbbAr9Ur/0jbSn+9Ed+G1Y3A -NLPlimP4rMnG4zTkDpTxMAJCoBCSryskiZdTm/vMJ7lLa0cNQ8dRvHTOArtg8ymq -PxGyLrIHwLYUtSIGpWcDlFRqOccr5KYoWVDmqYaFoVPwUqk9/nwf0t+TkhBJ/lLJ -0a4vL8Q9cbmeqpW7Ycg3fi45InIsR+pnmMY/ooIxUqyTxJAuXh0muTDaWWVWRtkR -qflcL3ldgPpTnDXyLsLFxAMoDaiZlEgHD9m6QD8wlqTNvju3tUHNMObLD8pFXXNF -usHFVftc7GCDNMlcfGu+FmDReXFJfGOO7MIPXM8Ehe543XK33+T6touAGV+gSrgX -awBTkhZLoW1odTPxSUb0sjEVxpLgB9RGW0s0VDlQjY4EzM3jLEPIbO7lMh3QbndR -ZVS5L9ra6qZ2BxL+/J1HYLISMfBR53HvAxd7DLzqGYaOjJDc7M3YW4D0CPN4PLGT -rGPlXu973HLGNv5jlsMhQ1UU7zkiS304j8tVrDs1Wz+1lQaoXWu+cI4OHLXr8erw -+xyZvqJA9KVVAaTpT1/beajOXWZVl8ZD0SzFfFi1Q1Dt76ZJ9yHmJMa1L65qjWQ4 -eDHoLtw0pRIPqBuWpy5KffioHlhAOUyOnm7iqSWweB4gt/omBKgdu70mk7biv0dw -4ACvu44zUG5cEv5pNuSoOnBVfRTVVl4HaIuHrXeF/dQEEMHFtzKLrJrx7m9ZKg7M -C2b63FadYZpKwJ8HdXuV9bLx+CDaXFnaw9mTY2Ky9HgQ+o7d20o1IDusJPJCs4JU -MFG3yfQ4jBhAi9sx2X6hWCT/d8a8gzk18dNRhIvxkKaRCTFLNH3Z5oOMt643pQ+6 -EpzcWzNKSfsGnTNn9RMVmbcIXjMOUSPENNMh3qpm3azykMFy/ehWs6yLDPWtihTr -VC1fu46cH/ocbeXGe3jtfc6Om0fHzH4EUYJh/oM+oV6UteqhDnmw9mb1zKWcbOVO -kvkMIH8I2xKk5rrBDXKzV9XLohcDHtDenjsinneb/lVAvIiFaJX8rTkzQtUyZKyF -5f41s2eiKP/GYgIIebd17awJ6RWw+9VVU7oxUuSEMTt3ObpWvIyKHO4ZuBcWXOQt -rdf4R8RJheHHwblEguHN0P7ubgBl0XKxtfc7+z3Okt4mUZQKl/3kcxmL1QnflpVf -ubzARzUjpyM1/JqTchqPNF29Fmcw6bVM+cZ8hVtR9ABhjFGpwq66XbJpovHEHtyP -9ssSAMlahqanKC+IWuFALAQ2j+tQa2AJHFPPqQncyyB2Earm/3GwcgxPhrw7HHDv -sneiI6a43s2PSogGQmantZClKkJJAeiYwBXyUP/8+xYGbryxl75RF9bU1U/m/njD -cATofIUBZV3xAdm+L7AxE6ReeQ02l0sIR5xFupt5iRxWGsVGQm+luvWKD7C/AJtU -lCLVs2c2SH1I9bWWFc9ok6s41Sw/l4X6lxC+NXKwTRowRq2pCXasgSOyVH9I8z8S -c7bZ2ZXb5aHTP1PJT4v0gi+om3EVCEXPYeZ4mNMs+B/tbO1DJWuRFtCoRLHIchk0 -RXIa+Rj1rahMTjQq/iToRlYIgDgNQrn3FPm7cSp48KLPmJAeE+ObedUrCn3s9dpQ -jOIMQvBKH3NQuUoRb0iNCqebuKLvX6QFX8wHfUNdhNOLTolp3KuA1ZHolUon+SeD -aPia0FxaXnsKA+apkodNWmOttEfSwqsL9vnGgkPTbGBVpR4Po3LqDG14YafkeV6L -vgOywcrBPp2eaSNUeCUKfDEcTgIt26uJCMWHegznTEyUcu1qVO4DweN2FM2vF8un -Hyyy8KVQLcF2rNq1QfN6tADJnxtMnmefFwrrA5ARAbcCkhNEFUbYP2hrwF8bnmgi -qAPp6P7wZFqwseisBO0GlaoL3QG5rI/iRthJRFVaXSIlYUMvX3OKKb/+7YHlN0GN -WDtjkrBTXL7XbCEXjwQfTAoyirHqWLracMj8IXzbvvjKGyIJHqIMW6UbJDvVhPmB -cD/Z0BMN0Ij7T6Hz1WLE2/zciODlx0vn6NeZ2SF8ZlRsTZYWY2MCa7MgE8+24Bsu -NM3sInNo6QFCREyCeYNUc9UcgFsdaoA0qqu0ZTykFOUOG3IE2QKAayKkrdXC+2Rx -z+lpo5nDirQq+m//cI3EJDKgin0okNaUzuqyacT+CMcekluSlRSDsYs037lzE1vv -IdJ0hMqahik7npsUELAUWmqPw02ZGdgv8ix3abm3rm30hF6VsZONjRZxBn6XxU3O -4cE9Tlkn8bJlFiZ2dnlx7qpOsdYjUiZ1whYkvuUmbSVe/9AnEuhrb6QYJT0q1KJR -RHoe/a2rFtnrTn5Pe1LOjXpDjLN0eHvkCyO5sgsOBHwVplOu6yadmBhWFnXW8lAc -Cu7oXp2+GFtJpYWQFGPGfyxS2s3APznG9JCTgttQ0lPWkhZ1//eRIbDwlGH1syrC -oWa9L2CXeefBispeo2XWGob9gcZ1PuSR9X3yZvR5fh7EU6G9zE7NhUzhzVSl7OlV -gm4gPkxx3BQVRXXYOU8rwAPVn0ambD2tJUe2baCME8UI5EUH2DtCAf336xlg/sMH -TbZhlZBaXopT8uGdiETdD6TW4GPus1a1lAZ4TmzkwdSf88J4YpHPHLB7Scppi6Ol -DUdX7oueifDZsF/ZY5/f4MPVw1euZiU4lfnNxII98W2POwj4uwtl8+/TARl+80q7 -vKlwqATBrpl4k6cHItNAf1CdtFBTorikIFpTQ4vryjAVtsZOaELy/nWJG4peiEWk -4iLkqLHA/lc1QjTBWfQeribP4TczANJX/TX7+9P0WEjPoVyXuRaNhoaBCMN7oKR0 -QpMR2sXcA1ioTk0D2+m+9VcMt8QY6Co3IGbQJNnrIHX8xrZR3+xHn5P6iRmMEOWs -TcVv6zdpaVd+UFrTVEI57VwVzQ56jxcKiI84wgrP66anoziJ8gNRtE89A2DbPA7A -kiTC/zuxsYqDfXgaxxIg09YD2fMvybAe0p1exH6LYmlzFq2wt6AfSXbhvI+FQjqe -6hNB8Vtzo1KHLAyKB0/dsLgNcOWsXV+hmlpKATq0Yd0dtMcY6OCTBC6cmvu8OXmL -K59DwwY3D0lp1MickeYbXWDIB4WQ+2mpdmkIjWgI2FNM8tt65vFvruHHhHcCK+lE -x5ikRWJzSoGnXNTe0Zf4DMycTt18V0Q+TUZdBudi5JaeIEE6ooqqaGdA1wKfQHcC -9qxUTNjSady0+GtXliGp5krYc6kaHzie6fSxabp5pgWaUtDRVvLCeQBmqY7bwvc4 -TCy5q/IBke+81zp7UDSY0/tHtOhf6Ssl57X0KzateNrOyUfYjB8qZmXl3A8t12QG -x03eetbHF9LQbq7t2ZqlZ0Z/+23yq3a+kzz4p04leCB5buOS7V7+hn0LRDMhZK12 -iv3cH6NXJqYyGPEXGTWfHu/tghgatJMYuAjbm5ITcrEP4cn9X2+oLIVF59PinQFe -BENpT8dOiT4xUs3icBmDQM7StAWdw+eZHdU/7ny+sOnz66o5o6C7etEJG6vG+j6s -VX7TDQVVdpKg6V49oP2/ZLLw7XGdAKKRZP49WjgNMXIcKWR+JgAPF7ZVEZzE872A -C0fxImZve+G9wuThdWr1fRaWfv8aGlc4VTTom1u2oxZqBijojgVGz8xXizgY2lLN -YwoYGfQfNu4LrnmqoPK+Ig4phxupBTBrcUaC2UzsoujRecrTxfGtRq3+3WAvTmov -YEooWx1K/s0C8+jBlfZ3MDtuJ3ndmNTW+Z6yJ6ip5HGAbVeGFoJvWyTFS0LmSIVC -jwLU2IP9TgKxqNdC7eS2axEcE8bzGIegBley5t8RHNAch/zoD6y7p+p0Bgxvp1if -+1coOtb7OJ5vfOJ4tAMvQHLQEp/PIYbFdI5P9HFBfGzU5ocUcqiF+HMNlkB+WUG/ -ZPl7fNjIjoc37kQ8hJHNUj05YJPrtWh6ZiJlqQGRBlmRJPkAW2YKRDDvsRWJnJPW -QycD4h1ZXIoGs2QJ90/BXAcUB54ostO4+5ZJtWRhEEIk7Yvn7hK7KpQSNjD5rjit -4cUqUe/+vYw3FupQtfGyqu1mVPb5z7Ur0vh2UxJBHm3kgqFEesCvaj38FAyARj0u -LzHZ4Lh9/JXBq9DNaq4dFvOd0hycQ5WKPqqcS/llZXb8QwpYba5Y+pVIyv3KRNFk -Wz3XQmc/a9VG7MK62ii+8IgNlV+DXh3FjjQiwYRdaMdzbsPyU0NrzB1gUSrY/O4G -1WJuWFfSgqfz54hQw4wd3MP6U/IFPfWf7ITi61gK5HQpZOXIv/JW4MWkpv/jzwwn -Xv+bDHBpixNiD63gVVdG5acEus81X5b2srrz81GnuNXvaG9VqKezxyt0JR/zMBCK -Am0kXMf8XSUhNITYce0bk8Rr763muAR3oHVdifo70ENyE0fvZRzKCoTpGL9T5JRl -/JPpJgQ/OdS30FJXnClB0vzq1fLOClexGV9SmuZmq2DSaFNmxQFoM/YEdJuP9tQm -XzmAJLqry/QIr0fPjxfBtCLPOfmw/R+g2eYSQSuP88H4Mdg7hcHh7Ii25LUk6/YN -MRgfOK1+reqvTgoBxPWsfbjyukYVPc2YQqa+uqdr+kfbU+aNHszddopJZUlMvyt5 -SV9rMVUVMPWDtz1PFWDZaE2J7HOrWz6r8ZJPpd/Q+M4Tqxb9KqW+MW2BOVqLarxc -dA+CukFe3jrIN6yc/wa+sNaI/xxzlxf4O8JUgDYfNQQ9DbHTifuWIW2Hs0RIFeeV -4kFa8R/PkUAIZGyuW70E3W5Ye62SkGaHPOvNxUox9nPSY5x07Yp08wVbS+KKdcmD -SPU9QQdUiCxIwC9TBlVBkPq8Jc7LxskzokeOULUae7fCkUaU9R9S8Qz/T7Y9VnH+ -O6mXuZPV46lExg/Tdw4xzi2zo0aJ1cVMhYCAtKGfcMcrl2zxDbLPdl7wU0lHRVS7 -QL91rsS2lGODNNMUKZscF+fecMRTauWqZspw3+dAYTXqupBW7UgM6aISk9OuJkxw -kGvhT3mE3bI77oNwtCfQ8UYrcVUbHEmfj4O8jX+z+hE9XSMgQvLIPO/awV6vi525 -CFNiESp29rQuwtw/8GjGga1XTcCBgNH5nUDyXbX76to2yKdzAShroRaAI/fpLuVY -T0PSonS77v758B1AJUl/FCqCzcCl032bf0RQSlQrx+jy7panOW/LuqVH7vMVD0Ex -34BUPbcpdHMXpGnZowT3TVfCXEtBOdpkyNNkwYMkjdFua5KsJiuWY19HBntnq/jI -oFfcvLB1J7l5bz37elbpPtSB1bztolUlQHycIT4a2yLS8k5IBikTQpIwaP4FLtwS -tb7mp4FxB+7N/ccAKPSkuYlR2ESlStB8pup4ZCBVHA1noTEVS/dTKinIS7lkz9TO -SB/i6He4yil/SRec/eHuDP2i2i7NF6Kf6p+/AfJQi66teTHfw9+cSgZGoiFidF37 -TRJYFNIMZ+wqNaNfp36l2GwPFSeYbszOQbb0XSrPz+SzjRBr0sBxNZOL5FdrNodO -zW8ZVainD1jAf8W1+PjuCCSA8pO0fIE5ERauBFUHJ69UeSrBGwRO1LGOG6YRZtKq -dPm/gHLPXCCgXoTUZXiS5z3W+4mXkmSat/s3OyAH4bHu3uiXm/r+E5WzF5zn2oEx -MBt2WGbZC+YM4+TMK0JVNmCz60e7s5DISwJRPKJMVYuCMj2B98zIsGEOWmhaZAIq -uJU1JKyNlnIVfyO7UduODVQYiEzoi1454zGVnKgWPLqjNl5k7xSLoWckexwoRC6b -OPM7HY43Re74ASHZxKLct2nXHTgqnHKq8inbWXtsEZ7etGUGfvRJBQTIHrlSpYEj -K30wRNMmSs2ygbhBEBsxV1rXA1eehX0qs7Fuav3/mpycuG+QGnocTup6t/Kf0Wc+ -INT0V1b2+PRbgIF5NBljPPhWsMYZM3T5XdHjePQi5qoOQEvo+DWBjnoKlrhpZ5Yd -99em0RbjpUyc4o78l9vs87NbWwR+Dm0SZkmgXv4zL9fQ4jSpVEpxj03a7EpYIpjc -phajWrx0z3cE/VG4ffxWWO0LhHn8M9gPpVEPhxg2mbJQoJ9FFVs1dpGMraxMV8QX -VNf8LjejmzLhDu2KDwy1yxhyR9O9+m7mPsrNP5fdKqvBhw/h40nCKyxXl4N/aH8c -ZfeMaEfClc43lI1ud18muPzQpnTJrPKS6s8KkhNbbJetBsYEDGoH1k0cY0wx/Eyr -MRcIssY6JLhtcva/OtaNANrDkJH/U0GHgj6Y5RFzHMgD5R+D4bBweiaSu1my4l5f -1Uu7at45Qv9l3wArlkhjAYXbQzI0eRuXLVxoxr56Nxl6upaz9TSx4ZN8xb+TGPDT -oh98TYmzXvHbCAqpf3aFbFRBptPzFR9R/IBOrThBP2ZsihwBEweZaDIg7w2s1lCL -EgG7nwagZEK4jTCsrDI0t1b1BI5VEnqk6WH96U+qCICaf/0HtCzpC/or9oG/xt9H -2n8s+Dsp2i63YtX3jEVj+WQ9gyecLt9oDrXkG77Jtc/Sx6MJLfScZOOHOOpQIgJK -KdqmQ0wEwy6NtwK0UFEBn00VZ2+Zu//yCfkxpm2sVsYALikIC4FZwKONcmh7gZ68 -gcj77b7htb+VB9MW6fbqHAjFnZq2gejQyFHK1S7Cagr2bKQeYYYsT9Z7WXR99wzw -EszPPluArs4jjRwjHsQJHqT2DjH0tzPx9icWXMOkoV+Aheu3ElwYhHavKITqWMk7 -4K8yPBcVGYDch1qK0ftxqvFd049KKaNUUMJl06tuX1K/aYTuZUdYdI3KIwzeOoSf -TsySC0SP9nsO11LSfx19kVmYqvBv1lu1fX8MegYd9ymjgcRsPRsnyUYNnIKNHWPS -GdKjuPSQUSeuVpK3NlfUFF8abIY7lZi/pvMiKOLXHR7H38m/BwmLz47JALPuK2cg -UQUJe4AIVB0Lty8ckcgyk9H9riXJx+kX73I7zz5MzhnijIHN1bz1u/tMw02c9CKn -3XMbbFZPO1cmenkurQKPquMVaZ817yhepu10e/gQnVZeiIgKaL9JkmnjmhFyjRfk -7urYSqbqYLNvI9LVBxOu7aVxw5IwIf7cnLNnSVShaY58ZjI3UG0pA67vgGRGC3ED -NJ5yDwcWDm/pypzFUw8ngIstzI9hcFSPffr8OCXyyudPAk28ACo5N1bD92qDs3Fd -Llzi4k9IEWV3f1hJ9PSileqWc0JiuFRMQMiv9rb5utNP5AhwBC4vswMqJH0m7jhj -q9qC1bofsEO94drBtMuwxAC3Vdprgm1s5fIxLEQMUivnkqEsTdEYeRoxsgKWBTw8 -c22Zt5FdRD9PvrgcVTHoxkiqx0UxOAv8PuYkBMCYB2NDXC0WioH1yJpNkVhSUPxu -uT2EGhXs23ANj3bvjh8omRbaGRcJI+T4WHJI72emDiENMIqCcTI0xPZpiONC4BQS -Iv32QMITBPqAP2FzkS8EkzdCeAvTKD4FcY9z2qDrtQxrABv4c6dvCQk/kO6g3Qso -0PuniSvaJGUz3FBJ+OMPG/Giwyp0GxeutNOl/vUZACQPPE4z5aytXP9D8aV3owgR -YeupPnn6TjmFuavbANpLuvO2y/PPfMsxtT48xONkG16V9IegML7GGKvmWW9Tnf2L -Oa48GAlzz8TgDlAKY5Z1J3Z7o64kiwoZnS0ip2KtCjmUPRJFejcO/b4Uix3R7zw3 -uSjP4QM/BjP/wolmyq3j96hcHHN69P+1lQNY9X371bFVnQt578Tk6AjkPJmIzEs9 -xf8gtpuh27E22k1fGXOrSy4tk6SXJJvk3iv9IFlnzpp6muGHwtcxNZpQEIUTGVGc -lml0kYcxg8UJuNEnv15d84Ve100ZaGt//THLrsvChu97H+Lvte9HSfwgDPVNFLAQ -cFadxsYnWOOGKd+sMCxOqn6N6I3cjP2dqJGTAEHSpJl6qdFCbGggWmQHNi6zOT21 -xKh0H4oHgyOpoPIrCLLExHJSuMQhsPiDXlb+ozQ53NI1SLwTArGIfnqdeInKPUUz -AMvP2WnO4ojfnyaNrw2ZB9sNjgdViSC35eddraV4Dm9YNZ0IF3EYXnKK9XAaRnTr -osBH1+mEzOzp0dfiTuXPeuTXkvXNrYYtU+qsYNzBqqlJM9NbTgSYz9NMwg2lE2tG -PL7Betz6hfHF/y5kEVuenHE2p2pnJBhocPcVgMGL0PSqzGN4XnbjfftlKhbKYB2L -43IzbS90lD40jjta7GIC9HGTEPwI2ya+qQ9PMV0KkP7zNiBWhgiAaCKJ8AOBajzP -0gJPogStj81bXg/1bDgoV/QYtpvkcYeirzbNTJAUR/TJrdN1lXVDDZeY3nNLu9Nw -sub8XGQI7b3hjYA7i2l896n/eztcppQbRnL0c1f8keg3z2FrdZ5nLOoc4y3LUHKV -WcGLam7L38xW69COD/6oIPwj4ZYJfLPWzsc2IZaQ4JEF/f0xyj4DrCOaetu2UXCL -7qNkSciQT0sboVBzXsf2yWyA72ReeH+1VG94ODhqTpN3Qeh7bE9VxDqhIC0cfWHa -TCu+d1InP3zVDIgOzl9+AYXYlUgRYLyP6d+pJu18s3X60RaI/Pbwsh7zhBGw/miN -R8qmPRpirO6USedHTdpSQp39UWuq6P2L1FVXR2RncRHuqT9YwPCwn74KRVEBf2dy -aO09ttdvV2z/FlSi4W0ST+57uDr89+UanHTIFcIrentIKP3dr9MLpltb9cOHYmgs -E70YQdcg7ibi1ZMIyBnlSWVLP7qPfdK1ReAsVAUXc5/6GSwPQlWRI2o0+v+ioTKk -uV3RGUjmJS02NzQBf8JVnqzayiZmFoMKgEj8mMzVd4y1xRJERvfxSmYCm1WfXJW5 -aQR8cobWiVVkxwxHlWHH7awQsyv4eQWq14qt7knvS+7YjLaEu/F3AwVQczGQTiX6 -HrpYtoG618Ko6OUlIVtqFHPoaJHc1Ume4FRmBnag2wXb7B52nFKpVV1Qsq37s5DK -i4gzqa4gR2ve7mvqu2MweKRG9a6jbWuIzVtQA6JjfzTqjN6oqE2dK1ZkCO+HOMGq -MT4TCcPOjovISTY2AKRWAS/AugbCUT1ih16lL4neB+bXB/P22+vQ6WCs/mKcH0zu -Ty/qowRnDhNADF2FShoh0FiIsTluhuMZo7bNgCwTHLBbmmFFsB6ZdAp8aRKhOZA+ -LcA92k5VS0inZYvveh+JCr9alPk1MHfut14ieJmPxuXGQ23yIFJCARCl/pHSml1+ -9hp2xVQNYsVc/vL09Hn/j2+BkUYI5MqW89DK0G19Oc8i+TzXshRMWwWckYRHXOto -eTI8zPzBXVAmvJpc1C6ShU5OQOrbptbP33GVizegUXf2qRGjZVrbgrsBpcDxhBD6 -Kumwl74KIAFEVNoEzhoFL95JXm3MMkGc+gWrb3Wm/wUUEkGo1ZsmeUU2f24alDrz -jF11IfZXCDOJem/x5WYSsYR8uE7PfPJtSKiJjByjpqKztbWs3pKdkgZbjcRTixtq -Dml+2jH8a84cG0fy35hQ9hvGsTUseTtp63OUma83LR8usUSgndQy/xcPx+GOfeGC -69TtUlbHkMyy0xh7DAOnfZ3EqkDgmkR1oOc8Q1DtrEdBR+cHsK+CzlN6dVnQzCWX -8W0Gt5JJMZKA0Txi04d9Dji4fHwtIVzk8G9eMhA9VomNJxxg9PljBRNWG1wWb1Fw -ACqvaXpKhMkJR2WW9XFciVHtGSKxRPo1o0ej3nnbA0+LKsgpmyjBx8+E10hRfqZu -XHCDtAUA8BbYKypj6F8Wa6CLehr4t01E7ed+JtysGkzVJBmY+5Hj7H9ngRIQcmEA -K17awAwgt1sVUPI3ZcqGdzcyoouHNyEsq79Wj+zVYaIkbcOcvclgODvRH9lKUiid -HbUm8waNWN36XdPdq+PMICi3qxLPDP7ea4RM5Ym+MyCxOaN0FAlO44C5zCnT08CT -rcE/ddfCAGr2XOYWaL7DGwzV7hb4H2yAUC/w7SaXAu24DRJX7PX++uw0lF08iFzr -4x0sh7qbChe8WsZwCskVzwds5eduVWw8aN8NVrtQ1LVkZvNKfTcTUEJ77U4CJYkf -PqnfZ2IjplLychzj7txM9q28kh2ttLHuzsuPoDiPjdXdFRHKMuPLoN5EY1Zfhf0A -AO2g01Wdpleo9G/sidViFgBWef0V13jJMyv32QjtELCzaQLKrs+cR+VgKEQk8+Rp -lRLq23PWwyoddIyA55tTu59yhhM3Dmm17W3SbIQTBswl4yviltOxbJZoMDs6ulP/ -C3wLBHNEDPFHMf29PUGMxEPxNAMzrTqrbJbpWYJAq8hAjD5WiplSF5Gq4ow1Uyuf -usVU9wEk4J8EFe+aye8xCTHTkclgD5BUeAfbG04cebyOSQ8VjzmmqaB13rgt9iSp -CiGmBfdY9g24LOpjyLzNudPcfYNPcLWF1SF6bY8yzLMfQW9Vb1D3glEunMVDDdJD -FsLH732rLwSoBmFns25jqsymtk1CxpP8kzcYWa/ZD1iK2/34ErWHXQAvOYgHLkoL -QMKRjphXf7SKYvyvKhRYR/KfXy3Ph6KjU9AJEghAgQWRGc6SQp/VfYERDueI30AD -39a/NVn7fY/10q8qkHWT4nW1xufP2K5NodZuTv+q2UwoBlt/pQwiy2D/beamwWoH -SAhE28rlVJDRhguma3qPDhzYwd8J/hDC9wFn5rPp9pKz+MVlNYnB50mfw4C12CyA -8yAzEZ51lMeIe82lFcB3VeWfZkWbUf3vXAUqbudAiwpVa9BhrqINfSN2nsSbM6e7 -2cBujsAFOWYnN+bsc1tjWLu3sIW6CvUIxXuKmeiHaiCs1H/kGkdCQkP3bdrPZmvD -Ix5GnYYbR2v+Vuft1X3Pv+0CmuA81wPZElyw6/MkzPhK8X/BnTE6fSMNZGqejSbH -TDmVdY+1U14zrUvmTmWEjVoRcvcbtzRA2wEmjc/uk7Wm5ufOPGTtPhrSnAVQ5Z6h -U9BGZDBKPUiGfRHW03TS0a/Ii3jNJ7Rz8USQNPOa0NeW+K/sZWdfrcFxpfEV839O -Gp8df1dpZVtgKMj8yaVB7iKGLHC00+9sKy+zj8CpH8KxSokvkIoBbNpT4etbonMb -BQsGvwiFmSa/8I3q+0JOxHx/dAaveN2E4d1lfI6/vad5U9qfewg/jDB5BF02nO0G -CWocAgM6oaZ0wiY4f6aAjrsxfGTGRsT3MvytU9qF+AlRe4zaoKwsKGvVii9wFIgb -rmgWGPUeOP4RNzUNIMtoMXmXUq8w4v7tE3yoFV2Jnc31p9DlZ0VETVcwgAQrcij8 -mWg8euPOxErQbDtav4haAacfGioSk9kaAc61WWJxQ5I/RroxYEowQ2U2eMI46MbG -Gz8q4UnqxYmVQfrxz/g/9MDITVvTP8OuBOWdv6hKwSZGkoQ5WUH3reenZBGGscML -znWkPjabw4cwQjTwHHREBkpnETkrlbCISGD2zYgRhNQ1nhwyM2w9iWzAkXSW9gEc -DMwxm5w0zLZB2H6RZ4psrj7O1mhOCXvRt5ZV5asbz2Q6NIBi1ZhNkDc/xW6QV53j -fMBavM/mSpQD8xdaSiNq1YIFBywbohl3yZpWsrPW3SDERjUNVsi4tMYq3QqB8pMD -TFuCM4SLF+r1Cmq8DYkWvaM7lY/m/F6Rwp2jKiiJQj/qa2I6udabq76XA5xLuuPY -adI9iN5y7fnBqCuC4g/H6yvtkpfBy2M6h6+R8FOgWlnOezk2uT4wsixwyzKb6j4t -Q1P+CSfexSvz+Xbd0e3Oe8iuI/+MzeR5y1BERjzgbTdISwqap2Ux95W/7mBco/Cy -L+9lrM3onwcQCs96g7wM3MplZFEpn1pxPrrpKuMQXlcLlmPu0X1W4q82UOI0qYNv -Dq8QBq0goqDF2XF0L3ciM6dSxpBwzA8O+z1WEYqQ7+QMne3NYA8jIXUhwX65W7fW -67hw0ksODKQeWStbdtqytRkIXqd4k7028xM2xJbN6GItAfCoCyjr4ahfBigg8TzU -HPXtd71dW3uiDIiH+U/YCh+XFkG32N1oXyCHXhXDebSAM3/KE6S/PbyflAVwf06c -td0m4dayCtFTXehXIjRxdw8zQwh+0EcPksFsgL9VZJ1Q7qbm0gT7/0zGWzSXMWGK -fbCLfiJKMFPDDPXFKYa0mGwNriWuRh0KLNXXwHOEIGru09Xp7ND6NNI7Mt+DeLrc -m7mgAob6o95HItEFnFGoPeRmQId24el3/PKiYU5zGyEKhI7zPkuUedtbJ2U/KpSA -OnotNA8eGb1gD4oXKZApp2B0VdMAxL0ZJbpxq09kFFC0REVK43Ll5f1qUN3BsiOl -d5TcwVtjQTCnou25E2L0IbY9iTdi9J9XbWhAEgPQ0fmLGQ7TmVznJxZxMJyQiCVl -ychATQr6yiIXB2u36ci8TP6M2XeE091EeMACjiQuTU/OjxietAoxaXekEbG4JwrR -yimgsYMJWc0FAQjGf5umvvf1jjg2m14ULVHnkj3lbU7Iq3ut6zXzjwEcht66dIUv -GWpSovKAs+JlfnAX4OiX0VKvegGt23ziAd4v3jtbYhUl3eRZVustUz2rpZ1newp3 -PlCAJ7stA06t3sa0nF3s+Bc1fQC5/CNV1a/i70cVTdu73WtTqlBHX6liFDTcplA1 -TJwZZY7lsey0SvuApGK2ZLXxiLSCPzmkUbzG8r0audMEk0ApSjo5p2iMWRyadAax -og6Zdt/dWM1vyNBLBvDNs+qtJRL1KnUUy3/SntlhGuns0ZDTNSGAoxiZBkC4IAX7 -IF5c7U844sWAiVKSx3/b54noLOKIEoNJ69bxT/EvBbWZps0WSSmm85XoGMu513og -fPVpcR35gW9sHR79D5UMMPgF9g2TRpy0wruOGryPqZCeePr14skjsZCsDnz+zbj9 -p0Oz7munWlaxQq/V+C9qVM256/VxX+P2qMpNnMb2ZIgUdiBGhIi6Yl9gnPfSpbnh -X0DuyfVxKDxVL9o+tTTp/VSqx+ZWbvmyBwvzCzxLKgCo4LIIyLmO5C3SzZjStZWJ -6tPC8p0dfeoQxybX/rOjK2nkRhzFYLh1KldKwgyL9NC2WT6+sLXQdC4ve1+6ZZvb -sa3mYQpFh0gVmDxIZ/+JDn3plFqGfPvws6cxNAnP3PfYZqq5HIGyd+YGk4yk4ptu -quPVUadSw2+WSn4OFwfhASFtMJnSpQWMjfreTOongHYtCFk3wUV/a4rNcJSS60kp -j7vq407NXahk0zy7VySY+pL78dkmN3e2qwYcQCBCA1z6NPGVNsUIELzdbedXdEOZ -YnY+7l5DgZZutf7QcXJEvsLSyIgztv87b4+Rkpi4DGLN44X4iGs8O8hjoWKQGvhA -Q5La/n8RXeAjnl/Y0kR68zdcCLaxWkml3mSU9s/Glo0Gz0yV0ODmhA1Dq6Ka/5uD -Zm0VUlaqQ53DAA/0yFJFaA+WLYXBNSGM4ocgvFIyk6A/nWed0Dat+yURBy11uWA/ -/rjbyGpk2RyTxDPhPpmMC2AOZgET0y/rU7hszzGpgIo3rDDvG52RVG9FJI5hrH0a -GRc1N2IougENnxH5kSxV5dp0If8xP1OMNvCVLmIR5h8/Tap8OztaLkTtnCkMPuBN -G1ILRIl7qATyGfGRFVOxtZkCArrqdMaJmg3O9aSQKT6dYiEn0b5nFm/bSlQYyOD2 -MRFIRR+qjiDzVesoCwaAUcDO2hmpum/sY08y6D1N59PKatHyq4Y/J1Kc4PRWv4tj -YGlboKmcUxz76fKBSkRklSh5eTm0fGNEYViFGmOxF2jlE2ly7Q6ZScBWQHvmOLF9 -obqEcANoL/AhkWdW3dSzvPeTf9U2mZnV23DkRQdCoiLbR7YjXwMtc7GjvJZMv8OH -Ox4wvCEJ0n1mke9SSWi9xbQsYMQkUKVsBXW6W8hdsX/Q6xQUPDPnyQ2s8s7nl+nG -+d1Ocjp+sY3Km+qR6kILfDf7tECMWC+eNFAn1VzVSk3uDD+fVQFCqNLDn8edNDMW -XIMpngwEDBM4RjgSXhTy04Y/AHq37czsMJyaQ4cxEyN3RhCzYndClcARG9MNQFZs -Ybv9tuwnwjYC3hVnZdfo7+VKvaNFksaa3IuthWIoUQzPo1hLulcCOkbnQ3Y0QGA7 -iVgVAMjP800VYQ/vi3ZY4uv2ai8JtJdmhz87+M74jTYQWURH9HOk4EamWPOUumja -9i4wmK3nWufnXzf1cxdCiQpSFcviexRLiXuVEOmu04Cr0KMzFSHaLBkwofx2vkbE -R5jmz/SNC8VJzx/U8c66Ez9NR5G9UbvLTYitUSA9lR7IWsbgjn4BJnAeFcAAW2zP -K/+kDkkUZWEMxlBvG+wexTRPYclNSeNpckfRrB/Z3Fm4j6eCF4TeNsnursmBn5C9 -3SK7KC5CkSaoIfRuukHqNSQzjxedDk33qKyTowc5PskPU+7iACypQwgcvGyJL+8k -PwzR7OfiSmgDiJ28Zphw8k/GoL/gEQJPqudzFg9yP7CeWVj9kW+0NSKb2aTWcHpI -ReXlOCoSiDW05kMlIkYxFH6V8RYkpgmCvL3LTgd7d0vGbTM6rSrvl5zw500/AIg9 -y2N22FFOJHZfUiRY9zoGV95Q4sFr3HzMslsq2fmCh1AenvYvOplM6M3VRxwqXOIs -xqBtgsXSRhRXXtT6WhQ6vhel72vUrynBl0ij0rm2kBbTUxLp6EzJaSelMewKAeBf -dGBXDjXUrRhROKAujXuTlgArz26Quuf487598wsDEUBfarFTUrGAAUhuzfpN7TrI -r9L1A0YInQ/Wtg1KsmGV5GR3GL4+77SspQzAyGGtC+DvDsYneJJ+O11UOOayhQNj -pZ3/1e0K3MZUzRsHVJn1sUDgQDFxctecvq2X2L6tb0BAWilBO0m4dVXT7phNY8NN -LBfyI6c/PEac56smPO9YiFWsNMwO3Gup423vC3GvQhOFmt+DDNtKq2cD+SjztqrL -3fLH8/twSInJbMo29MGM+Azd7ZR4OCaK5awwfM0dCr/wV7voNySBMI/j1XH9V8ya -cqqgW/ZUTobnKDvCX6TehdF601Hd/Vw88dUfy1yaVEjGlJ7fDk9NVdNk1xPZVmLt -I6hiHhET0EmAyF4sIqVa/5JJVby4TfkNI39/yesXZpkE6cYfqVJG5ux6/4la3HjZ -VKO7ZLXVoWBcN1va/MaaTUHUq+Sh/lTeOznLzb1N32v3yK1fWqO1d8GQmhLmu/E7 -9bjffOH62WEG+eibVzxp5av8r3sCPYXU56L1EyoUU+RHY1twDT3KhuZW8FJ9x4uE -TJH/6Nx6+8rrXxloe3/28JFpCEyyJUFyFYxTbA7JObrSfVfQVW1u+6FNZL7a7u43 -YqPnwbXOVH+wBXemjSC4wV3ICg5rV2SJamXY91Njp9BllmBsEcgMTOpKGYtUPnhP -vHFyGWxNHBbMe8XB+NdgBYWYoDkR+kTl9Aml8Ei3eGKNYWO4NpE6EKGFgvc1WMI1 -rQwUsI6qhs1TNNJ36Xf71UsXwXY2dWRc7krZevP4cwCWhqZYXf7vYxnPf/OE8vvZ -OYD2yaf6h5UqTB2OXXsBmSmfEp8viPDXOpU0WWbqtfOb1I6JN7mvSfe0sp9tYpUm -89lLfxGZVTQWGt5TD618K2QrfEBfCQbd7QIeDxA8aguldhlsP6SEEj/y22mkiv7E -Ez+aDp6jXVutN4JIHTlEgfIeUSQK/lUzkGhpl1a/IosWs5P7namETBvN4m66QXTf -6IPuZV6rlzxqvoULREsV0Bcvf80kXlyMIqM5O7zTCc4MAoRIwTBiFzPZrw+aJxOG -T3AyVHA5Ft2qy5267SiJXdIMr9b035p0teGUCTyIQDG+pHYxa35HSJRNKDraSDup -Y/cLMTsdkmF0s8U3s6ueD8dBwj3SEamas9uI8LNFJdeexrc6y6VA7ns/ALg8Cggb -hmEK5lGMGbvGiXpYfZOMNSTi9W0d9YCW2x0mjvJFybqtlBYnxx3yS8VECHhr+rTU -yZP7qP7dX3fxLwbvUsXQ8zkj6wNe9jUrEGOyFgBA/cAlcWHbDRhEKF3gEqT47dEk -Iwm5r6Spru4wHG+XbP0rRogqpPYlnatkKDWXDIj03Pyo+8sH8LEqjl2Z/ma+rPMm -ahBLTif7jJTbWXbSGumel9ECmSH04Qy9MKblr1cPpum0EMFA+t6Q5BuIc0C6DuYo -DLzcuhu5rKNW4ixlWDc96PFoWgFRdYPlhTVdyGepYFSuOXFxIe+ckxI/GDFBUheL -IaFYH0ARMIQAxdFu9KYv9j+8N0t/ttB8qr4W/eQzoXtjko6qe9fj2eCRDl1G2CvA -ZXayG6Tw/Xo5KXage1kcJUol4WPrpVldelZio4/70ew1IYpV8kslqbb4t1moX8Fb -g84V9Db5tUGz/WFVc+XmZ7V8adNu4dxTYEpvTAutd9qUgXmW2xjPYYscwsKOYthF -TZ6ozy9vZlVAIGb1eEZe0rqO9rLUdkZRKn3AJ3Xrx37wb022mKAqiDsoVVlOiQhw -Xa1n8FcJgYciX5vU+UGyLE0CrPNODDkglqdqOSThKQKjx+N+4hFH3OqLAZHzv82s -bowulbNynCfcb5eZMkR0Wmk6XSfnJiSOOZZTxuc7tGPXUAcl5bcY/WhdDTltSYBi -CuDKTAew+7fBXJ00s9TUq4h9aEJYMCyqv6Ih3rVYmGMpsh8VnLCikOp0EGp3P1QA -F58NpEwNL94JWKEr3Zs9sYw3xujpdHkFW2NCGGS/vVVy/DIVtt35Q9BIJt4Pro4e -GrznGIqw053HTxetrZklPfXZDx73Z+pW/t14ts9TptoxKVb+5vfy79yydeCVPehP -zY7cX+5OseTMeO/5CqZr/zIJUHw6yHi/jOv4D/X+gkypQUyL7CNXcAe0udfMYwEG -XnqVZMLXpvIMBwrcfQzq3eSMuW/z5W25yQb+wT5YJYYhp/ZX5v8cqUrXF6fsn4ty -GBgcdHDXKA6+fH6IGWCBiOPHUu1F9NEPgWYD6SWarGQwv4kMzXmuhZ2vAp6HlkVV -LrUFpi90FcqBRbqKe8kkK+IR2sGCEWSf4+WOMI0Mr2c+0Pw5QXLstNv1lj3j3D+w -6xyIJWOgjG5PNFP1k3oR2U9XZHpsTC3CVArNPU3OJiliZk2ePm542yL7QfNn1hmo -AjDOmgmp/oHQ3sSC3X4A7U6repWr47ZRFWBHJegsFDM0GiNjjTCIJ1CDMZbrwrFk -kyboFYmN0VKE4I9W70hHuvas2Tmpbcle+xMjAnUawUyxkLt5/cT6q0Q04VJaX5LT -8Wzasyq2fwJH3lrHuhMiZUIJs6zFdWzuM/M5oI3syrAbdS1aJkNGLMqcrkLcKYjM -0LtP/Dyhi78/+U+Ghaw3bUEhT13b29v/EmDEShHMCD3mAsldqfRBdRfgZn5RCvOb -9NdmPWZh5aoMeJSbHQ5CqPkL7CoHADsPo1qrYnZJsDuE7bQ1c9DGJhJPPe9/S4pi -EPRttiwH01bgWyV+lXhjn/XJn2Cmi/tFM52hUsDVa3CT4mnzF920PHW10ofDTH0J -6w98Fqjms2kUDwaxj5jd8Dt++rTEFDTecYkJYgWWeZygxxgFyTtjOqzOQeGZbvwP -kfkIDqWsgABP1ZQPLg8f5CNZxcdml9K8NY2JvgwcGd5ok9Ub4av3TSDAKY7xWeEv -3aQzEQQ6AF7RzvtkYzjnkMaVON+C51DVDmssBlVYgM5c4pEaRZStGtizYjm1F8qg -R7oDQ+KsxMwW26ZsHMzxcgRpT3sDQNHIrGXsvMyBNl643RDsqd7e629GOxDDIQLx -MfY7Fi5AdF7WS5kOrOs5c8BAQTkBnegMiT0YHDXNTwAzmqu010K+u02WIX++6UxD -jjZMP7R/XteaqTq18BlIyDZgolokNaSZUBPV7tDzpJjFbK/xYGAOJ8155y5DXpi8 -Y+mwZGBBZHAtMySMuT5WD8jogICaTDj9evoq8PaWy9PHWtRnPpVu6GgLXcxVcYHO -40JVXAkODqVlJXCf02AmcXKV5jsO/03ZjUcF5bXGZb0e3hkMDycCuNoG12K2SArY -5w+JXeuP8a4DM+r6gn63aeoPFr/xXM+soUQGgU+Xe8C1uW7+g2dQcYa7f+EAVSEP -VBJUF7Cp2EF16W9r7jBr2Dm6bxzGah+en6GIShawyw6SmvObn+qP78R+IaQtWGKt -WazZr5nw56FKjkIkNn1oABf5ahnbjoyai7jGF3nibXdzl+ySbmrOgJXHOaEu6p+o -orH6NV2pblhOaZyjdSvw/2F4ejvgA8LiIhp7A6rG0eWbVkJ0ar4o2+H3m3IJwiQC -7gUnbcqYtFLWwgx3yGik7T9PZakOYMM0h94eBTCX9e2cDp7FYflxrtf+zrTi1xHf -OJuqWDcv+SRdZdV+ruFrXvQFXPbwmRqRQFnTc3vjIsrdZV2+uR8rt54azCWqdbfd -DXn/aLA3cjpj4fWDUpeE/2Zl/tNLEngI5C41BkjppGMF7JUAUbmw8b4fsojfjNxa -B9BUkAW9MAZTVnxGjcKl+mmNhIlWMkCb7CD6gtBkXP122bBFTLZnsvPpYtwsgOG3 -5oEoMn/Ojnvq7Gzo78DPGWaeBR+cc4SzhjAkl8kmDK4xx6kgxBNAZB5dhYCxY9at -kVtzawB9eslMWeWS8r3jrir8IcHrux5DgQ+NVmLkKhwfCQ2r9q23w60G7SdpFG2/ -a5x8/A4AtZI8KTFpPNSNOWtJzylISsJ22yBDgfrMp9a93CsPZZICURLDydoonTb6 -9Ndd2SI/oRRTkqO7UQM8mIpLgJdzOifomyHO3Wtt+lWzCcGWwWKkSYT3ASsDcv0O -VUNa2Blc1n5kiWCnOyWIyvkIwcLOTqHBNLXl6NXdxNeTM4qBIPRgCXY1hhXBuK/n -CooAFkJGE6mk9QCAKVJS/FsZPS3AK53Y8Z8CjkW3/dHGWK0ZZZqohNkppBv7qvbh -O4cBaiROhzIkW8lG6CRP0sar+z9jTMHXDcNh963E5jIWQ80ESDb8f5W+0Ofmp63e -Ilo1gzM3bxXq/La40Rtfh8+jxcxz67lkpnJA+ydiRuL+d3ikIIIw+Z7qDu0+ZqXe -Tj7DVcrzk7Q/cWPM41zUIN7FQJetEbJFYGVuTCCTc+APLEJkTFZxQX4Ku/B8rPfK -jVbW+Eig/YiDvvpv/x1HkuRHwPfElbf6QHyorOH8fF8E3rWnkWu7VSDipMjVfd0K -ldke4ecKJ4P6zxE0ILu+W4gmyz/TexyZWQjphUWhHKbtO86Xo3chKJXOKnLNfbx/ -Tco6gcQTh8/8Qh9gXiV91lmvkj2AyGwqPw/7oeHkg3dtomPO6/CEMDe+kD/F5DC/ -qmbd6tBGAw2yZsMXkbvCiI6VJcsWE1UFRz5RIzkZzPlbQqyPrkcymxtk3juJuj+8 -jr7gcStKiDJQMjdkZ0EbRSmv/3Vb1Zw/RNz7cyccsL0tl6ANGucls+LjvH4s8ETz -Le4lFod1Mqk7KNs/yUSfucuje/W7svW+JR0nuviakNmKAPwUQHl3pWlv6gpFxYGk -3GwOfs3FdA3EFRhK6p4prHM2JRkK/DS0b7nk3BHNd3QC9CIq8P1W1z99ciOagF49 -nGayNRphH2ctulHnOZvSdHQ63eL6mUlXVXmp7A2T043Enq/Yas6gwfiF7odpvYHf -qd8idgFAcwiEYISrBhB3d/Eu6lXuBOPxT6FsZYItwBEnqr7A+9xxPWZ/ksOWYzKb -ofAWxpvrVpizCHoQ6JokpyJRTf4DsOqs7SmvGfB7T621JKFr1MnCRut21r5hBnID -K62vyG+B2nOfI4CChUTvKyH/4xNihYc53fAPi6isoxQ4rYjxLEO7Ks3BSivcqv+K -ZDqAQNYgXCdBySdKL2ZvTXTRvom3VI4pAB3+JWEBVjakl96bht3zJTrqzfCdTHFP -3dyuNeC0QwRmd6eGujtAOm1mVF32+PH+ULr4fi497oy+kpv1Qut7HxR7z7Ibksch -hr/TZrflV+bFlwXZkmtQ9ZLWK1A/srOs7I0JD07VrA96WkPm9ogzv52sJON9aB/Y -do//lJ+EKIsiqnUgCApz43YeqzdYHQ+69S7kxd4GL93v/KdY1WEhFtsC7Q1B3qQX -sszAGHiuwja5lJsWNetZIhNO69N4w4HZvrdGiGQOdgt92aa8RleTjKvQJR7Tk728 -y1tHnWdu8YGLr2qWE6Fk1l3Jsn9tn7aGjK9zrWFJd6qgFWwz3jXFEsUCRC6roT7U -umxLNpES0fIPIqLz0IOvls4zRE3TiEQ8cReqQMjdypbHTUeo1tT7jZvoGAprRuNO -zvg6X9ZVbob61NIie0Rf3J5kQIO/uoZFGiRVep6RQN9wB/d4fAcRld+Ht+SgEufk -bQy1b3VX1E6zjDPaTZyQYMDOoOila0M+JuuZvfVKxFdJOXJsmsS3/PyJYadec4UG -xbSLYof+XUtB1HBKMJG6CyYic+iWR//A3h73Qclwo7g8Eye4smLO+WmJKJ10vrDS -bBnB6a8EtqrXmrDOJtmq3xjz6woyTqibPg9X1V/mGDXQObWFeWMy+2oTMFhew036 -1lGbA0G2SQngGPwdC5fDi26rhRZJ77MRbCFFWpVjRc81SC7k6mw5/M/FBrdyW3tn -4hWpmk5ATi58NOCGVBgG/PEB7QFGvhLf69wXbtaXMblvWB9FWmUXOn19C/kMuB13 -0f+CEonsJnBQ/tawEv2FyXk6JanMQOGOd5nl4DqKrVnCZPDn57Is2jHvic0IHpse -oA/Mmqg5rnjZcPSCoIxygLeIwjnpWy594PJ9aJpGCgZhx8LDQWsdTciuXHESBbRJ -IA47Uxjhs5ggHD4IcAMF/qNvAkVLy3G1QIRGWPLWNDF3vB2f2YmyhP4AMen31Bxw -a444Ei6PKOImhYv03ntNPyri8YNB0R3ITIj6SPr8ziqnzRgq9Ecf8oZTOmdRIiIt -VMy1V0uu5OLcK3SckI57ILrwDfX30M+lRdjaN1hsKJc9/qDW1uWVSdE/KuqoOFBc -61LJ+jL5brUD8L5hitHDeRql8xKnowALEFGi9+GSWEkTv82N7G7krPARBPc+ZwvI -x0gZLTFMIXPb5D8pdqyhZrZMuHjeBbfRz6uBmBXQmXUrAZSFuadcBdltjY+11kVZ -HQEs0/HDEzMZnZ40RxvW/lCaY82ztT+Np8i6ejULgbGkdl132a1XsKCPtAmFC6mI -DEzNMDIWoH09wP5lfehT5qhmInAVVU7R8Bb0N361lb9FALQ+aTABbvsqrU7Hgfam -Du8cHYoqZVQNzgQpXLVBZy7RE4OOkI0wQplwlAiLWUxBN/7/v1KHOBEsgTmfOweu -0mqTVkxxXQa3eHsYh7NxgZASAdbIphga/tbZ+hKDacxZZeSym8/kZE3w4g+bECnk -8T7fpoOtgUAnHlmSTH/1ozXgiYymH5As0Sfcp9bikFRmnkFbCiXVQeJd87iceglY -AQKP46W4jSMu/+MCUWLPwYwFWE5pXzSzlGIhzUuJG3wVX2PVm44CneZqDQP1EidH -x00Z1ZRun8LyRh9sqpLQsJXVDoA/N6hVt84sBuW6YAO2kvC9P/d7GTMWmU2PlCo3 -O6Q6E3yWeLyZ0tMF/yPWB63284Ne+pKa08m7wIfSAmPc/L/9HpCyddUKdrlzET5b -Wo1CnASbXKUK/Xv6sdXYR+8hfh40hUOiKqOAhYoQm9qnEZudZH4GwIxVU+1KhbZP -0mjINbAcwJQa0o9jUIOA8I5mt5S7I+Yz5VcGgG7v0I19KveuCTikbLGZFcbIbtGO -p48T5VRnsdamhBB4p+5YdMUJd8OdB2yiPO8a49fwDlSDiE7M0FoCVQt0/QEneW28 -tzKs/EwZM5wcKuhCtQT147dRTI6C2vzFloufCJp8vp2A44+YB8QSok0R33GRGahM -GfCyJGSmdST9IX2/ACfoorWrUGNs6xHwxTAd5hAZlj2X+bPReATOnqdJvIFGG4mm -uJmQCGtMWSTejxYXMpAzEGnVqB+JTn0wiHuY9iROMuyKoQi4CZVO7oa2aRixcADM -iJNxTzCRMC33FNB6toox0agrhlXvHib72SNQi4U3kCyok7wJxPaRtkhl6yfVQdPT -WPGToz8xoPIq7ZjfoPws65/JopCmJ+g4qsrrpClChtslTBUAnvQujJUkQeWdYjrV -ge3BcPioaylSccAH88iYDe8bJ8OiKCDOYNlcjWo8n3AHRsp+uN2JfN0oU5lpuAVS -XS8a/NQq5b6MfnUDH9P0glIg3Ftz5/o4Ou3YvleP2aoWSTXqUBI+UPHrhMjthcA+ -4J6qZD81XKtEpdGZ/6VEtGUBma6nkhJXRsvpiCMs+3o3gZUK15jvZ+3kya5ey1Wy -/Qb5SCqJQoP1OfoN9yw1eC/IDi20B4ZQDDrGecjdZy2i//4ZdBll/0Pb/KoyPE+p -d+kCrfQ84DcFWeS5806l90bXyO5kWATWWs1F+ZtFhpldLptsmW4BsiTq/9ifBfL9 -SfGfWbaIECkX1awNfnSo4jJ7RK987miJHZH1r2VxQp8/MTk4YIO/FegC7qj6CllO -POl1kWzchdgasYW4T7peRjmAQjG3sELGVIQKlMh9WemJSyUT3x61gqpWN9UWvdH+ -fwZiNLCOvJTctamrJFqku5rfcv6Qe5AGOyek9edCB0yJfkwcNoGTztlJHUjjr/Pa -C/y0UMJ5msh9NeXdqKVAy/UwYhwHWSKdR2955OynG6A6syvWhQgrcz/4krpE8QPj -1LYkUpH0xE2h9Z1BI0oCd1OcqnIyHdpfSVO20f9RIrqb5+p9dfEmLkRmBdCZ2RHT -/xKoiZw8+K+HMwVT3q9n+2McAR3RNPAqqPjIC13NlNzM8W1hbFHagDbE3PJOp23N -lpMFfMz1EMofHGgFqI3pb7KxEw3kU4h2ckg5x/gQaZuyOFusBhHLW9t2tn+/mrUR -GWzepRxDq8+8OEPtf94sQPrRvhxAOMFXXZ6+htNB7YqL2oxvJKt9sJLAf2pi7Tm3 -TnaMU1X20uruMLCmxUDmVMEUrfqf4gNKch2YzJYBv4PcSwOdAxQ0dEgPC4v6Q4bB -PaBDx178YOF1Ok8WihyabeTa8rrqyOZJQPfM/uVTBwz4d6nFEEopFzImtKCOg5SR -17y/blH3n4FUml/pcR4QJ6/Ed5Y9+9+0bfECiDu4P+gPUGe2AWRaHfLors3hJSBc -ggYxD38PajlZXNbACiwutbPYPJcWvya6AXpx9KckKHfEa8uVJvNea57NckbyY4ho -V3mN5TbMMJ4+tZ3W04iTjn1Km9biwbtzl8VMx06RLMucqMruRi94RWQ4Hgx+tTeC -TVXn8s3jPoykPh3aSqLg/yPqUODP7VV+0JDm+JxBEYmrcWFZYR3GdZmPbSh4nW3k -ick+3YQaZ8JwPXY0OhCfIx9jFCbRUq4qUXCvHVi+Ok/+YRIO+IuIMx/vkuWuJHsf -kjl0ex2gKVKs2uDlEGvpS1q3ACEoi8NcqD7RXFrUuMYdhFVMd6P/5cnKE/GC2vqZ -YIpd6Mo8h9ipKZUgpEfdab4AzpSdel/U+5mASF7Rea35LrspDhwlLfaqu06yGM9S -2fVIieH3o0V86CTO4DK/qUJhLjpeInyGp0iBk3wqHwLi3bd/jL+kipS7Fq6yMMdB -08AwaOLqsimkTZraFXXfA2zlHuhN27qIRjq2bJGhv8kyzDrPkgGuVW0G0WzBGTNu -UV1UvFT7fn1VYNoGak8evC5xZiNXjDiO7iKAIMeyIbNYu3to0sXzwWBTCw5mmLLR -YbpgFP45vUJwFCyTkIXvSAE9mY457IINi1A6eziRCfygWeBxoKyiHbKYDudf6ead -M/wulYOfTIfzhIi5Z64PivYrxe8K5qM51bMVcajPh3obc5Y91qHlT8VtS40lt8lj -4mSHFS46hkgO4Hj7rB2LzElVFiXnqlWuNSJk1DCMn8olDrObAo9qE/so5BQCd/WY -muSNwfrHrlvBj0oNgedLuJH+YCk7rtjJZ7wf/fp3FwCE8nzBHWEONe4E6WjNrs2o -EzvqWHr4vJ6csCCmfW0TKidwgLJBmJdeAFTlTx06KIgyiv7XsTYlk1QEJ6iu1x/m -gJ/Hyb8i+aaO8HTmhY2gEskzsAowZh7dQuHdLcl+L3RT0qCQcEIKwfK2BWLKtlIk -DohtXMGAH5N5byEPEQRvrmGYG5MFBv8g8aP+TftAaEESOFteDAwG5xtGl+I0nRlB -cZhcxcBKpWnhLH5tD7HSWShsJLNyEx0QpUWeJt8MjXg6EiysE8hbD1dN9Sv5jbG6 -vxcJdVADddPa0sPfO29R7X4JIVn5f8IcFlshGvUR3FN2+byO+8F38hrBNRlvI67o -MsXVc4i0hcI8zKOFAhmteXmHGicTMGisdDSaDXE5fkesOZzecVAha8KfyEJUJ3VX -gOuYZbyl+d2a72xru8aRULja70JfciIsIg8EbKKH2AGp1dUgESJN7QQYbgyeMqfl -ZFVTDDud5gcxsQZRi2k0++bviKWbfLHNOohuXx7F0rRtJtQ8Wv98ZmEWRChFakl3 -Gw7Zmp8moHZLZaeqGf6IKOmylHOFC1E1U/CvfhS314k5k4EoNN7v9yY1y5M9h5nI -p9/vN/mlrieW/UdOvoa2cKXW0kKOBU6lxXfAFF7D6x4GVNNsQkQx51LIQFwtRQKB -/jZtGhHnQo3GwrdusQzKgcHEM0hSmMH32srHuQ/OFlC2TSxmZ1hh24AFLX71we/P -3xvKbeTuZKnUW+68yp+a92HKgsDmwFJtPp7SQ0ZDBgHZwneDn5LxxaxwNjc39Vb4 -FjWBaXvGodSmaPUvg9/Kkx3XCG1SBHX3K5D4OUG8wPVAna4/H8Otskxv0XIBzogV -YWwSTh5v0h5kxwbERExu7oXI8biwaAxjidNiH1R59N1tL1WH8C8+bI4HibdStBXl -BqLAiVftY/YmJWR/cKrBgyTo5ayZ7T4pm1MDN/BDKhX0pdUmOwKuATWGtrVYU3o1 -LMAdelu1ydanBK5gUgs9G0hTZX9e85X2TfmXrekDT/436H9oFmGvnJYdIClUc4M0 -raTclEJfz3YDoBkSEbatit30xui3hXcjsSeJzTA9vV9cjtG7hgXSOhZ6ZQXevLkX -L5DB81LhcX1+ncfpNKkxtvFm92mO1Il599hntZWKnMt6xYBLSfDXNK6krNfr+YLt -MSUVJDt6sfgML0uftJZZ82TtoSJInVZEaqWatAXWBwDaOdudWDO6th30JPDrtjz7 -0fRxxSInfSeyAYkaFiLJp0ufkFrW7IEi8+3CC03bbf5mf3WoLqHE+eOwLARBjeSO -Hb+Bm3ImIkozDpEz3cklzlCUO4dp8VfSPpsJ9E76sCOXFJgyMRYDp9BkrLCCi+QH -StJHWK7tJt+iYH6s75txMLa5wqLT2u+bvJFOtLr1jj1Ul2OnOeG6FyI+fqDG7d5+ -E27N2d++sRM4vMHmxEwtWRgi3tHeGt3mw94cKkm7QytL769l9dIih1/6qaqszKdK -rbzbo97g+WMmhg2AYkFnZXIfOgL2qbpkKBdva6U20KzgfxGbxxQJg6YFT4sByhhP -Q4FVpaUNbiIEGWgFjY0HHn+w32A6H6u40Z2NpziaIry4UN0R8HtYDQO9ao48Eaaa -/O2zA6ICJOeeIY5dEii9tJSB4xgnirk6pd4UL8VUemMQdlkKor68ZY9fc+OiCCeF -NaaRqPsSgcg+FnBRP9qBhbguw87zyH1oZUXm0UEpS+Gr8HIdRrswZHaJ1Omi1TRF -hMfiK+VqRBrXdhAtU693h9IAA/Ec784uRbh/J3b+QaKXBXUZPt3rOv+U+zI3FGnG -UAQ5lwTAOMqRaxloNunxZ3GwvycmiiJReH+8pO/WLlRxC1nxw8rladReieAbtgAm -4cPfZIj9wdNudGG1rqJOQa0S0mK9vLZ9bTnVXbkYra9ruqCmuuhsojPdHsSJXyWY -Zw2o7W5qv3MzEKLV8Kjk/5QINH14JBCBttdpQ4Wtj6r7u9MArcN5M8xrRyYLDKyr -HyOb61z6T8PZD70GJiufF4P3uTDIKnhKD9k8+e7eCDAq0Izb2YlKqymEbtB6OIZw -j6g0medVpAWrXPEU5p8t5COy/StxGyfuM/1ShL70YfoKF8y0QCR49lBCJjEDw5jW -huFo0yrUT5hjwELZioph74Q/VI9eptnFCrvB0RXIpRP5a/k5OeuWg/RydHr4je4H -4xF+i1+pZr70jIz5omfVJdq/pXZ1lwA/HC81n+CgVC6fctm6ERWsOe98Lx+kRxOM -Qyx09LT+C0+PLQQmEtHynXFglUxShadLnDleerIh2v/Vf9uvgCZAr+1wuObqSY2r -Crx4xh1iV6jiXJ4ZTILXk3XkmSmQfWBAi/WBR0RBDmM6vthyc/8UjMoNXCKK2SmS -FWVMeFB0JLh43MoiAGA4YHe7Qnx4sBGnEBBPKdHR5A3dm4ANZwlzYecvPS9rz56u -Ym/0uEHieNz714n55Kk8y+NU+N6jixZMU1DWIT1NICAFnlWc0luPv3SfQlMPuORf -ZMyFfO1aBVpd7V1gjCeE5OY3JJyg2qQFedTOqDAtWX1sw3PuJ5kAQHRTQt7A1yZ9 -27CAmyIWmjaB9Ya9MBHt6/EMgR0S0XpU3MgF43KQ3knLacv+Z9EnUahuquTKgWOY -GQ1I+JZypv3gIRCnahA/prOupdLoQb3Xp1fMY1f9dKeETD7rW0QxpJEt3KVhLqvU -62NRBEUI/ib2F0/eW9N30hPhukLnj7SHteZRcwtn8sEYTwQcHJw6L8zvrQBNhk9n -Xt3bTTjjeVfUF9POXwXPTHMvkyF11LkKfosglatj8XAsgV68RALFk9Qm33tMe27c -7HkMgIHL0GGv8GgpITgZOcsScEnURZj3MpV01FgumK8RgbdzbECKxpGRvlSLVEYZ -LMiaY31RjGoG6j9sT3h4uGVNA6MzcLqZCzLlIZvSRXkNlxC26Jli9Qjk//PKzf+T -BK+dw9e8nMTxhRo098ZoIG3iOKVOtjClTh1ws0ylcp28rfePtrUW/+WOa1cH/T3u -aceQxGqm6txrjlfDJp7JO9o6uy9jYDBLwPSXHCtCxq/y+zWr0gy1LfsVAoIlfxP9 -VbQNO7YG0ikWdMTYYfGt2rZ/e57Q9LhhQhY4+T7+SsAdsl9naGvB/Q6a8WvIlH+q -QuQvMj3OYvBHdG6WZuNCf/cGIEVanPc3B/YE4PAX5GeFax2RbL0m07J49BWxxfFJ -xyxGyzZmmGChHJ6F3RuervDOvwMcXgML37mtOIVaScRNmKMPvFvGYQp6LNBnD/R7 -5Bq2zsQMD1tREHZOqxhx1lrJ+nMr2R2wBu89wHYxZt4auaAiDIddw/4dmuOchfku -fqVqZ6oNJ6Nyenm3zU1TFPJHfjHA6Yy8gHhJ8bXvFs7+zvqZVcLO2105bEC5CoLX -O3VxmooPzjnwp2oKp9cKG0hECU1gbq50uYJwWRu5WhZgBKsx+NrFHkfAZLT2W3vS -MRTdcw/4A9Cv/MReFM3KqD2eGbdGlkYM0JbqngRgs/yXzbNtsmYsqx6e8QnvuKvc -3ZEH5I3Dtc5LCA+APelD5VK7rq/Lx8WoLpEqnNfMG+vo5BWSV7KxZnWIUISBxSIw -57ekNPOQBdzPQPy2Xra+uIqjlAqMyXx+HHH/NSpjoTBhDoKMP5Gl33ChDbK9lyhq -/glUFrvvJ8bSygRjpfNSeoZFLy28ndwvPfAdwV/VEdMoxUNi1Ls9PA44fEFLlVJU -9E5np+djNNZLsXUbHhGSUiL1yIeaisDqxnnJjHFzD33H4UPcoeASDsWRWheJ/Jb4 -46y6HzdFCU2+TZtErDx3+PYZagisRfTyP81UyQBTeOTkKqWRZwmkvrnyLu4crZ6o -VQi6vJTYRedkbLp6UJ76pNQoS7Uuuxn1BVjP6LCcsIVLRbOSfTNJPvaGnmP2RVBL -3gG0sT0SsF2Httfo1/5dPFjVwaP657Fd/1iVbEIzrVZLHjnDfX9mYiYBd3o7Hbdm -hzoNCjEYYvkI8qNmsdaMaq1UiAY8pOEJ37pLGRWrFsqJc8Z82lfEF13R2DPpdIT0 -Gii23g4ujeMN5dnKJiwftlzUWq2eiFcCuYHGNWztvjiCWHguNO70HG7b7j4KS5U3 -Ks1+M5zOTxdFMv/8d3wm+KUBQQPneDbG/ftDTkDLKL+laKEVX+8j5q0GSQMON7Ye -qa1aNJgiSEFu4z5y0rbHzsaq9/yRGLJfLHt9+Es5YKUWmEGiCiFRrG+vM7elwOQ0 -JK/8Dey26BOo4FPNDiXPzD12ROuwEjW0MUXtMqSWfcm9lVo5Sb1buZyRl+N6zRIw -l0bBeJvzvvQR2/poNNnfs3QC3fQ9gQD/+WTzQCw5LqFFuxiUoP54kr+S4Wp7R9Dt -elxZMI6rnZujZDSQr86S7UEA9lAWiCJv7l93Nr5URH/DJ68807Z0yOr4qDOj+Wqd -1FXdQjFt9MLOHk0O9blIe9hjLroRsmqyVpbs8tr/fpHc0TfUTw4JyBJi3R5hThpx -hBaWThXDwq04qNTv8TEcDgW7/shXl55BYw5fwG5NNPHdiJQl9ney+QnxpYQmxIG9 -OwOdTTgRb8PmaffV8qBXrnxhjmdXsGmTeI0PsEkWnV2+xmEKpSzoi6+P53LTGQqs -H5/bLJC35bbmJ6j7hfFjpU7BJPhxpFfujm/SqoNCIHscYrgdtU35S9OazkkHY8ev -PuhlyioDqHkZ8OpLEO/5Re/Nb/NsnZ8qFVBPbsES2R2GTkA2l+muiC0QavD4X8tx -HgF4GsBX17z3MQb36dOx0fcXWeEMq+EJ7TpSMvYm/ejUN0zCVr8ziIMUsdXZAaBC -rDwqn93P4ILVZIXmwRqqgYXfZfbjV5HROXjUy7ADBtO23NR3sCMLIJKC6ZspmR9s -f/8ibdh4kFRAn3eOQURZkUyVMdZcqkbZEROv0X7nkLIabiI94wBy6AZqxciCWi0e -Ek0E5XtWgZaioH7r6GJCujFHFh7fxH3LPH46qtXUzqilVJf/xZMJzynB3hTNFc9t -DsfRRPrJxpp+O8Hz3FUG67U7R8N/Plne+cQWMGWkjGLse8eTUzjxnSEECLtlMTdc -dfWdoqnnIyYVkzJm6CYeOXeXv5yXzGIb2peExwKWOcszm9eDHbTlPtQ69+nciVMj -oOW/IgbANKwYX0sCUpPa/Bf51D9VbDAx/HjD5ndQky29xeZr3Mhbsk4QntrDWSB6 -0kZEy76CdPrcqcaYIGu7//PiLW4WWB+mTom8vpZ7r7lCMLpU0XeqYhacdJw3dVoW -nIeuWMVpyC0u/lcuH+KJW40hlUsqfjCNimSoc4+XcuzTNxGMwdkMONF0/lGSo1bV -VYihAjPN3qZjeg/qwx2eDzpIwls+0qvh9op/wVRyNCkDIINp1Eg6UH32+Bb6KR7k -9megR/Vu+I2hp3ZNu37LtGP5kFsgduVQzXHF5L8Tpb87ZLnSgnK8eJvU9HvH68wx -Ku2pobRgwp6hlQQB5yQSccu6H2dzr/rPu6k8xWpSl5xOMvphRP0zBipZGULSbi63 -EJXG94+W8FlYwVTrjmDokwUHVTkvMuaq2YOy+6KTbfHl7q3t5lOvJeWRoEhc6q5s -meHZI0uFAh4lQLZWLyRMKxvGoyJZGP/B/bTzlQn/nrhZpQCT8IF6vSqrNgrxYx+a -wMXeX3dwBpd2gnJK5sWz/EjCF5+7EZyWXwHmAoN+de1NsrPNZv2m57TE1vh8CN68 -JNGYatyJTcrwvwlyZPctO0fJZFsz3Nkfh4XZUTpuAiPdRHlG4wCwgOHNqsVLDkAg -R0RYZYPyyGZ4gGj+U/Uidc+ZTpSfi+cVL/tloc45jbYuE3+5cBjslR9iODV40IkK -M0uYLEY3Gtf57q6s4YxlWAE9oCfnX1bjcR0TPh5MIcsH0UDXjcVRVzJkU0A9JInL -laCvrNEuY2fV/GBrsoVIf97aMgwerN6Jxze+1E/IUOGirvy9xfbWXucV6uO9f9W5 -xeUDjKiUEKXJmR8BMXtfbUgWNnmxJ5T4ArXKGEcQ44ZOPFZp2qbl3QVeOvfqpK5Q -V5eYgaciyB5dVIxE+zEz6iQyCepg16Hxun2exALUCIZaRnodu4yLQ5/YSfw0ilGP -6e4HgxulDTiPCwC9SZLdjU5Eo0/kdkcSY3vOdK8aNCTPHllxdDz4al79i2EGSswY -eOoJB6Q7XnKyi9R74zlrOH9IlDtmXtU4gVyDy4EEBSoS6d+VVboAfCATiO8f1ZVF -IhK+N2PLfqLUnNe2voi2dU5kT//HNOgvHibbCbmWbjtKQnGyJQ0Ss7BY5C9hP5b1 -sUDN1g/ZdkbbwLr7drla9giR6QM6AFNMK/8KNVp6JvxrUsVsUJ4he9BcL2hRXfdK -GQNW1Z/Nk9LufG6tMWTW57eeVUessXRHLKw9gjzIRiC0oUDfoNHAmjwhLq5f2zGl -2207IsybOhJTg9okl26HjBQpzykKjcfC6Mhu69NHJ8cLyXygGzhmcSsu0a2shxkb -nHz8KvTjcCiQay3DpTapBWAHjKAOdMiZ66Tz1BSN0NMnermFnLeP95nSTGdz0AMv -i8zGySGoDNgshckKY8LCuSsBmEpjEDfJz+XPeBz0+EAhGWYbqhEG1FtmWcD5SdEV -HIlPEdZ6cY+7LB83RwoOlW0nAYZ0cOFGcAqJjye4SCA42dtKdkFUPoxoniTTmR9a -pUpNX4HyxB30DxOtmZlO2n7nYmQIPt4lh2G+MC7YBQmHnMmXyC0MB2t/okQYPfml -ril92Wywh6Ko1OIIIJPgTfaKicdWY8EaNPOW/f8pp7P6oty5JF6OqO9amUXGkhd0 -HVPrb0IFNkuiWkEpK34rJ7AxQvPzB73YiQ8rkq33JS2+tzOXqy/OlRmpNSGCELRL -OA3vtX2y1qqg7caxCWC7xMzr4k6G1lc2wW3dDE5nlFL6t5ZjfayiMlBARfGEzVWS -3Ok1HVz8o3Vnsegt5odU1MObompSDhi/AtZMtuUx5AQhwFpVK5qzGGUxIxuRVO8d -iB3JQTN3uzPVy801pO9LnzzFoTbmqN7HPJHIwFZhLrjBFhG9KRaPxsI/oB3+fYf+ -3xTV6azEdJjlvs5QmRPCjj8HLs7D/RAdCfYe/Q2AuNunGbJQLnCktX2fJRsmdRHh -O0qV79kvWwfBTAJcMFYMKyV9aP+ZPxuDX4YXz+vwulbpfSjQOaudy6TvFrPmX7T0 -xg/wqu9sgEyyVpA3Fvmm1CasXXGTtY1WpoWB44hA9JYNUXfBELMpuCXAUwhxZj1O -CUwjyNKqYzXOZlet4juXwixgnB7zZRO0+DPr5gGNlcA0NXHrvuZ8SLHawmmyibOX -TeSOR3Hs3mBeNfUxa7bNxGZ6SjpCXmnme4L2A+5WGKphCiqTLJY1T882Lgq/CY6L -Fn60bRWMn1zHCoyAbbXKyJHQoZcr5jFBhfSkBDInUgRoCIKRT+Lw/sheRAcOMzOY -e7HGqFfeALhz4GwRV/DHl25KUHdNUqmZ7mi3fwOeYCDzJxiADwacfTlfgjXugDBj -DrKU2X+IoLAiOs9OqpI6iF3Ld5L0mJYL968/4u9gemdQnPTdWPzbTRlozsx2P9Rm -rUaUk3IGjxMmfNxPh97xrbUp9stzpWjHNOMh16bEz/WhjH3MMAA8twkKdBTDDk+f -uIK/oT/ACT3zS+fUIZnFIJVgHv+MA9VA75NMb+sYW/X9h8axJorAGHXKk7U4GLQf -BsBtdBBZNWKAVk+PkW0NQISn1njVDqqE78fS8ejlfv2V5+uZFAkGKR5kZ6XqWKAj -zuXW6xLFiy+yS7eJee6yn0er3aiBcskwMLIhDFyYykJ+6YLlD3aDeViXJvfWfS+T -GUGLMpcF+Em5DtBSp1dwYzUySGCjTNJObsPXCpGoVYZ+avVAwKPjnuVNv6rQh4hn -kJDjPFu8T4dBCnzqn1f4L/+Uj9NfPJ/GuaCPOtBwbw0KPveoz6U3eZh/ws0E3ane -4x2aD8pikI/yz45HZvz97rmM3Tl7acXBjieq10IPpGNsVJdcJpD/siy5I/5AXXd3 -AvFZyJZITbOA+2RKL/oUKgLrGagchulYM02HSO30/NhxQfYkVRIenqSNtlIHyDNJ -eL+mBEF0nCD76aWbr4lil12IxOVtW7Em5QTqYe+DF3uQ3u0eS1qhr4S24TJcG9Ig -D2qq2Jld0U5g1/XhYkC7SgBEnG0PS0EF4vCN6kV1+jVHL7g2S6tzIrmNNkA0YM6Y -5If4iNqnVd3oJa3myNm10/jWiuo+U+64XJYjU9CIWQ3kmrzCNouyvLJX2Ti9/vRB -UTgpZwc/Soy7OX2KFgA0YRmiOCrBjJ0zt9E98EoNzut6CElNfncE1H+q7g4dzFdt -UlmPCKi0uT9BPYVzc8HorXqiHSLuNYbaxvtrjBkVwji6H7dHl982asiND5PIyCtM -n8yxao3TERX2sY4NbrPG70HWfU9v3+b40+miq4hIIcqRmRFRSj+B0h/0KoROqdAd -IXlPyUWuv4k7sO5U7AaIv5ePNm0x+6FEqsplGNg1NjJYdd4/T0sBRpSwODFOMSLn -1YffwtRX+ZB6PV4G4xXtILm6oOXgook277mOh+qA60lredY3c7LuUNnvi/iPgKEk -l215PsytpjLNp+1HFJ7Z3TaVUwecBleDzHPPTJhQ9FmaJB98ig+htoOPasu7hKEm -Kp8+XsHBs40UYQBxVyIpDsJmQ8PO9QG62c2tkq49Nrpdmu1mZbltdw6yLsk7vuSm -+1fy8y4xvYsEkAKfDW4WkojCLDe3NDONCoQ+zerLq1seFypMUe5CPdZ34yxZ48Dx -uyVfMsAq50V56XSY/W8Aj8cv/xCbdv7p1AJE6+YsIWViUtLXcONrbslnY9xeqMnv -vJcjzdQjMGc+7s2FF9XkYGcQ71ViPfLqYoLiDTezwFgYZGno+IZBOhfay0rnmOKv -TOrj7icDXwH7lfa0nZEOISyXWHsDTDRxpdZj+V4SFKtNsoBCzwpSCzoBv3cFE48T -iIR8cCwVyB6UAJt4ZWmWBcfz22/Z/M++swnOPwrIhGhlSXvU2MvrDKh0G7oHOCCb -q1JOBAYwzs/T73a6S/GXyg8uJT9NTyW9DyK5qRygz74OnLLgzPlXOo4dUvgV47nE -EdY8oswFdasK/NeM0pQLyzKmNclxdBMvuwEB4NKwKFGeNHslsLBkd2YaUuK4Sftk -IbentDQVYwHvnsqRydo9lnEAnIHMDE4kX7uVhUPOGtqzuxEXwHd7g7dLgKyvepkH -QGDuDcgl0wvdWZWo1WtOlvo05uM8wpEZFj3DGyfWXdE5jL+wqa6qQoZ/+fM5YeYG -uQNNfMPYPogIOgD9+feITRYp5/gkN6vVpQi5PY5j9jE8GvmA/9D8QE0TKQ5jGCEI -mDe8jv/3Y8HYkI43UI+vtNrJVv6OKaiavt+SmD1qTLl6dDFujBrqzsPVapngHhoG -nqkAqvD6dquqVs+4wdvvhUFk4aVM54OsyXSNeXlEm1xPhY033QEUDIH0LQHOpk2Z -+2lU1BazjClxHDDy/amLbEin/wHEUm+4XKmOZ4KWlu5DlEPkZRCwAcQiuc/hlvhL -kfatm1rgg6CWC094c4l0Ixt8knY0qwr6mdVXIvRJquSVUkanbYajKBZfY7AWgfsh -iZltiSpqmTIaOqYj03B3JZ/8hgolJ65pWk43Dtu/sl0bF8F/hOcCc81xK2k+/lBi -xzn8dNbTZZiq8uysdhkw0aD30E3zI+MjtJmRQz88F1KD1ExzXbxBVITguP03qnN9 -DOoTJyWYaHM7VhiqZXiAqy6P4OaHwUiWR09zcUtgp8+I+EHhnYiqOoJW4fiL0bEi -umtLeYOvoCqtxOHNZX5qGnyg6ipCIGVfqWyK4EhPOEM9DNVOUQ+79s8o+vcRj58U -hCFpdgzjwTw7mZQNkkUgW46KuwcoyGzZigU1+Y1P4lJLDNoNagWIYPz1Cpk9U5dK -2nkf4CeTKWhPyhK92ULr50T7KaFGBebr3QfrKduPJ6XZw1wmhgYFbh13FmdPPgvv -Yowvf3yZhW46bSqtpuKaJYvs362lQt9QlRQECzrSHkqyNIuUrWTNuMPP1L9uk4j7 -2MhMO050ZRvTKoVLCyGttLLTYFWDJHsSWczlKWiWUAKgfLDdTjaXbjhInZBkRzAq -MDZYnFbTtOm2pK+iuVp4XjV8e+AKCzMbU5GGUoDXH2SpdNot9UWyivKqiqYPrYoK -FBRE6O1cyJZwf05fPmkweKL1RRrUwCHbQz3QmLdAhk0uMEJcM9kc9cOgweqvuqtU -v1xgUzMFKegwWbG9dbLS4pJxgjhMdc+5GyqI2AH14RAyowCEPI0uTxRY2hIcEicI -6iuIL7TZvqk0OHtdZrGjExDH3so41o56K+9Lcm+m5zBmM/XSdS32oqTIDul4grp+ -DmD2W5XH/Xylky1hr/FRLjOsapeTjjE5xsFPZBRORkMfxNLhJb79WvGs+4X+sawF -HBJAW0jtew/rWbhfLCY7N1vKdE9aIIbtShvsVk1xBq3GihtKeb3be7uRpBJUPc+s -C3lHnPdK8Pls8IftD53vIkYKMEZ0JcUSnaO7L4UYPaBB+dDdqey+yBcswpoFA5IP -HDO4+K+q1yG0iWH4f9TnWn8v0bdJpDGu6vqRyA+eaJefFLL1i+/eaPdw6cCXa7yY -+kgCFubg3xVjV4mMdFP1Wjq7CqysWimiIX6o7+Uyto4w2XsYLQfWDI7y7l4DUl0f -icZ0fVU+XYdhJGzrUV7hhdf6eHd3lbXOqbZXplks89SlYQPm6iXV2154zoYDqQ1S -fkJu7KSGSCEFnryfmkQJA6TDIegfUYfhVB8AxM43maoWmn6H1s6FmLntcACCz2+V -FoTHEcZ+5UU0p531oPUhy4g7p0s9iNNbg8uOjCVaJ7uTq7UxYiOUtO9DBD+WH2qT -cU4yMZZ18n+LaQVwP+SdxOCZkH78J7TPzumvSow+Tdj78OcmnbmPGyi5P5U2Y3wm -WzdWjVrfMcsdqoXG/rkVaneswAHmCelTQO+z2bzu95z0zIWiquzN8GftPBtKHr6H -vECGog4kMFuRNy0B8kulBjq4BSoQJkCYgQDRtmxGsO+5EWfn56PZ3fuJ5mWUSYtD -i9oalsjTOXHfBSTBvj9oWtd7gmBTzTiZu1oo/kiCWkTnRVvelKJW6Clk11vK58PC -NdQfh+GN5e9Tpfeq18/PPwVukOst+m6E1kmzFueYu5Vw0YL0Qhqv9PjLtPZaxqZX -yd/U9oLqnDX2+HcGFPsRvsUs/nD/q7oBH06vlU2idgLQmjDg/VEpX0PRQgsu+Mxa -9Zjx72DQwzH6VOxRMe/aeBnngaDyvgVkfJD9B6izLXb1MTTuCUaDyieZif1jaEu1 -Y3zuY89z+6/+XGweiI/JZvVw5MxMWuLUifeNPjOqMfOWqQoAi00N/HGjzff1HIvy -Vw1O+sdguF5lQlILYRSnf6EoxMKbK18FJPH+HW0UpCVgqlIzgfAoOqItEF0GkY3/ -iQzK+EVkp/DISGh3RVeYXsExWkX6P6mgWnroCQMxdVJv0rqGIZoQtCE2jkZW9kom -x1f859VlviXnt4S5pHc6puREGfROlsjD+VCQs5LSL7YmiF/MKro3K1D7rdpRxRfg -jkvUAZyeLPACVFel3grJIKkdaDzE9WKILUNqpOYKkqtgsD0eqTk3xD3AlgC0gjQW -VCSYxqBtPi7OONqDk+2rr17wkDVpZYuaN+2/QVwxytOINHAZRGSXuUeWI+aHKbwe -rOBFtz4mep91KMEeuQwU4NoQl5dBKoS0sQmYi7VHz8IgUI/lHYVLNyRS6B9U//X6 -0L0xLxGEVoXyS3k9j9+10hEzmuM6X9hwVktm1oxYxUXzlnGat9yjAglaQdREYito -iqNG7t6vV9qThz5mxjICLgxSsGeqARs6Ud9pJTqZm3zdRk/TPV6KPxF9U6v14INT -jq/a2AoXwC+lkuzQZ4Wy4xsOOx4eBPVFRsKWtcaxY0pflwUlCaUXxiwTHWp1i/qQ -0looQiJT6MY7z0UxkfqTHQyvTe44gkBBZmoIVRczwYciDFHT1Z0400WoiOKcF1Hg -MklmVUEIwP7d1k7rpE+TVqstpSSmrlfeHd/cHe7MLGQ/4XS/pxVNp7+nkHCXpE3N -hJ46X6x8UEvDmmM3vkaNhSNvUwNz55PqCJPfzpT72N0v/zUaq6X3E38DwCfolsDq -x8tApa46E+7X0Mimpr03+rLR3sG+vSj8yzeSzCeY9Om1PgpwpqwV6RZU4gwOSfVf -i/To7h/ZqxS/0DfkhP+UyDInuJdHWEMrh8lhWWNIDrsXE5K8uu0yxkfyV/1lC5e/ -rzRllQcmHAhjADST1l1eZ/OYZC5tiKAAPoNTqpNx/6vlavHgOmEUs+LqJ/rDRF7G -RGyylnAadWFW9owhfaPGyxWqR2Tzsa/IeVRKaQm0lFpNDhV0ezM1r6Cc9K36+Stc -1be+vtNVmNb15/Wqlzdyh9FSYLF+lE0Xr4M54fb2I8wan6IWZhI0RXfQTiWrQGOR -qqshg2fvFVvWVGlTFml6rENbBBCZzFRcZgrwEWcy5dUmVEWr0ReSDlwZB8tKCawn -hfmyFxNsSgrOT/qqJjDXagcReHAV9DzWmT8e8A1PwZcES7q76+ULyfyK6vyDns1m -crv9j5yDn55CSTIza+L3P7LwTKotPAs15j+CGhLlnu7sGTp/93aGxZbUypzs790E -Ljz6VtMkYm5oPAc3M18Glod0LCSrgfPlDQXzDgyip4SHi7jEoGeGCkygHww69jp/ -PjvAhF/pZOAzaTBYr/diZF5Qz9ggZ6GP0Z86GS4Rdh59Vnmul4MqEbSlYbTWVCUn -eQBo1TYw0krynRSqpwKibmEsgu5kVtg4v5YRnEMiVv6/s6rG6wIh7Y4gPS9tGrEi -ASzM9VLnb8aF5d5aonNGx0EwX29AbKR7GTJoCDrmVqQA1lB2kJXEMmlsb2ru601l -WtXir4lSqUa2fAa6UVu/dnu9zDzzna3REwZjL4kUHzRfNTw2UpThmuFTFDdoyjh+ -vDVAQyD8TImdjYvhJ0QamwZsWKxxdpD6PYpfVxclOgCTjdmuv7/UKMbkKWXkfEPM -fkm2JwVbSuCjjwCM2fZis8VWhMZDN6Jkj3SRFNNP5BwwFR7dnyqDd7vZxBUD8rlm -PihUtjHhkTSUTAU/6pwBtyrbo0vpRwAzEB+xbIRrqxiVnLmt2L0siRoBsyEdrM3Q -GmltIQTSQedPboiSyzwEUICF+RQXEOTY+4VpsGnLKrppgXHwc9avaqSGCYOmgpDm -d08YbJzMqOM7gqPMwAko5VH9S75fPhLO3GQtTS7WFCA+M55FoSQFQMMuHGMKQELd -MWfNHvec5Vf1pJlgwEsZqnzd/hqLD6MZ5NPiGyNthOY4gK2PMpk4s2nfHyu/5hbM -prYLBJmpttq3SEFunXdgeeiz77qW4raz7h7tDYlF3JX7NLT+0njkAbClD+G1/Ws9 -+B+a/3shcVhm11jH+yKQ3TngTUgBLG58rXfHJQm2tGxNUlbt7o+1rUbBUa3Kbpnx -zIVy50fj9QJliSJD01hyNDfGk5QjaJYalO9FXjmAJTXLJ1t9IQchHGNKdnQ6Y5v0 -uLgajEwSrn03T48AwFqq0Sza5zcjvzpo1ubk5QvNQQxLP+dL6i3LL2kTGecy8WUP -DzJpZTS12khezW7uGhTbDR9bAE+3e8vw6QCffkx7S9hO/TKqVAcd9NqFEsvwnfWT -d8RMyUfwDWV7UDwzt2olIUzVnU2sbFJCEr3uT3ODsQHpT5cRXdoPDSQZfsxPRGfQ -suIt0oiegBsn+Tlh0icxZxMpt5sMq9gNuGxcIh5qtCa0weNDhVVs61XlbN0Wr0/P -gyyxQ9wTPK/+j00Y52n8CMvWBcM956PSdUovO/JN9/HFewGegUOOdxRP1NePOMA5 -8zzD7GL4gRXdfUPLiZNyz5ZlPmKTnLIcrhdvQyfRBVhrqeo2K4SNmFBpG2amw1Co -KxDhyAQLNuWRx8z/gooplR7SGiVjML4BDkaVcHsdisSRtZwHruGyIJm5R+HBZJ9k -t/nH+xfku8/2BX1nt8ce1+cNKpfcnRQyiMkm5888NiSKzyyFow8EOSYbMZgFuk4J -/9juZWK/IOv+x60ct6yzg4FetMw74UQNmLvRb1+BOCzjeAqUEq6wEOxzcnrlCsJc -yEdCUF9jRrpRf/cKJrw75f0qIOAerkxxyCufL+GmNyxDPeIn4NarKM3GcLqMr/c5 -va8bLSU2VY+ITXSXMtHlN79J+hSyZIveLw9UhxmL68txkqykSWue3rFmSkyGWOKf -9KAq324dCQ64rrFhKogZtWQKg+xYtnjrcJuJR9h6QXkx8Wsm7qcVbECHrxXEB4Zs -9hcWefDGmX3emNW6gd6NzClmJdhZs1cYnsgxll0GuWm0zq/1hpg625Mauobb8f1R -QPedlG6RZ2c1yyX5Mb2n+kACtug39LWm+LOHaOWcTj15u65+bdtwHK7gA4YNqyMq -jFRFPL+gaX2rv3bJ29hE2B2afcWu47vf8KwTFLuHHq+h2O4MmUjqbtXNoOF7cRY9 -XAIXvKrNPSLGIyb/3sFOc0WUl1IT9f2TrwsFOPLj3D7LDnHK/lIGvdlzYTSu+dqB -YbUqxr0PovN8P13GFg9dj4bzCwVF3lLAM1J/ZrmJ4CXbu3zrs7eTAOYMVgWlRoPf -DF1qqUJ/WgcRgRo/LhqSTGjVUd7L581J9I4q8vMIl8ClpPjzGd0VfUY6GTJUEXK4 -NP+u82RBDamN3vOnhvQGIbbVxOZk0kr/W9VwAbah+OWDQx9j7I3TUQ1P+oRkk9wk -lv/GP/GvNGkio+nDoOulzrNFJV08cL942tJRq0YBG2VQcjzCoWJ9py2/hpD0Poh4 -qV/kaD5QqsDpiAqFWbTCSQz6E+rbHMmvZpHFluLUo8rDWT761FeLhZSFQ3rjFEuD -oNfKV24sYM9GC3wHCdgdJUYE2tv+EdhWRUvM25aEPp1dpKe8urPrAGjYtDfCxAM2 -/671m8QLGlYgwvERky53vqBIAUp//3tR3lxNEihlCUHz0nNCPTZRVhT/29+lCUak -6rVhxww/Bd/tcgwwx7KTnmFK0a1mYpAuSb136fShR9l3J3WPPGFuq9ZYjNvjXLin -it+3wvlRNhGL+G7XoXEVS9DLFH0+CnytG2zQ6Q4cBt9tf1iWwahXIGbfAJltXCat -XOblm1U8s59k0YXqwUccILbmajxD4Y6g3ZjVDBMS4vbQMZG6jpJbHla3mddO/5GH -7sHWwhj9+5EOeDUUfiYpeKPzq4dQNfuVrovNFkA1j9iBuuoG5DombkORagBOMXF0 -N5k9YUZM5KUcL8hSV2Pz0KJNQFazgViRzGK6UbtSX+B0s0iG8YnKwc1igq4/kCz+ -StdTNFzkn3z28bH26/egBKU9/xK4kGIic6PtkD3MO2OoQrBsHQ0TEC9ih6nqKmj6 -yoduCNy9OrnW3OnHAFHnW/wSe0Z7fGLjpnQoUM0Ts75mZmnltigJvLkQmcqzh68B -B3Rfv2jLpjq3YTV6DyXLvwXeS0WEuSRaQsNZ1qxmLzR5826hqKRFL36qyfjc6WWY -yx4qO5wB5cxM8BMDp+fAeQiZg8amwIYvjPWnnUpGTi3+3mIaPk3fovs6czug5X1u -NcRGtiI9xDM4dR20Y7+JttPiz+I+ixWQsEL3AjFMIBxmeWJHvH9wWSMwHFvyGZil -sVoMWhH0TnYPLORxzcT1VsV29HBYyv9aIu470yoTFKCo+rwVFYC3Yrt5nWKAcJce -HXMSOvkmaJcqrwoDIgJX8mKcUkXmBFNJrUbW+QnkN84Y9h+aFFvuEaNbmVbFc5DA -hOpN9zcCWJ4uM0o/R1RagkxuXWj0vT6jzg1YTQJYHj/hBI0Ntp5prmdvHFkx/Fn+ -am00c2txwbEgTc1OiTZDxXfAJwWEiN76rNPXHVGfXfRVHFG3EazWu2/MdgmfBChn -hCOi3Iv2+Xj2AuriZMuT3Vs9VnUOvc8tuStd9EDDgss9Bkl+djG/hGuq38LhspJW -79GkLJPqeFEOjKcDQw== -=jEhB +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 +qBLx2RNdk/20DARMGLTj28IMTS4X/w== +=sXBE -----END PGP MESSAGE----- From fbba9639d6d5b65d62aefe6d716e018c1a67e6c0 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 02:34:42 -0400 Subject: [PATCH 07/46] propellor spin --- config-joey.hs | 2 +- src/Propellor/Property/Docker.hs | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/config-joey.hs b/config-joey.hs index 3bf0111..9d54b51 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -53,7 +53,7 @@ darkstar = host "darkstar.kitenet.net" & Apt.buildDep ["git-annex"] `period` Daily & Docker.configured ! Docker.docked hosts "android-git-annex" - ! Docker.docked hosts "webserver" + & Docker.docked hosts "test" clam :: Host clam = standardSystem "clam.kitenet.net" Unstable "amd64" diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index 8c2f370..de3c64f 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -30,6 +30,8 @@ module Propellor.Property.Docker ( cpuShares, link, ContainerAlias, + restart, + RestartPolicy(..), -- * Internal use chain, ) where @@ -150,7 +152,7 @@ findContainer mhost cid cn mk = case mhost of mkContainer :: ContainerId -> Host -> Maybe Container mkContainer cid@(ContainerId hn _cn) h = Container <$> fromVal (_dockerImage info) - <*> pure (map (\a -> a hn) (_dockerRunParams info)) + <*> pure (map (\mkparam -> mkparam hn) (_dockerRunParams info)) where info = _dockerinfo $ hostInfo h' h' = h @@ -159,6 +161,7 @@ mkContainer cid@(ContainerId hn _cn) h = Container -- name the container in a predictable way so we -- and the user can easily find it later & name (fromContainerId cid) + & restart RestartAlways -- | Causes *any* docker images that are not in use by running containers to -- be deleted. And deletes any containers that propellor has set up @@ -274,6 +277,27 @@ link linkwith calias = genProp "link" $ \hn -> -- Each container has its own alias namespace. type ContainerAlias = String +-- | Restart policy to apply when a container exits. +restart :: RestartPolicy -> Property +restart policy = runProp "restart" (serialize policy) + where + serialize NoRestart = "no" + serialize (RestartOnFailure Nothing) = "on-failure" + serialize (RestartOnFailure n) = "on-failure:" ++ show n + serialize RestartAlways = "always" + +-- | NoRestart makes docker not restart a container when it exits +-- Note that this includes not restarting it on boot! +-- +-- RestartOnFailure will restart the container if it exits nonzero. +-- A max-retry value can be provided to prevent repeated restarts. +-- +-- RestartAlways is the default for docker containers configured by +-- propellor; as well as keeping badly behaved containers running, +-- it ensures that containers get started back up after reboot or +-- after docker is upgraded. +data RestartPolicy = NoRestart | RestartOnFailure (Maybe Int) | RestartAlways + -- | A container is identified by its name, and the host -- on which it's deployed. data ContainerId = ContainerId HostName ContainerName From 9d7a442182a1e0d526f96b422b87353eccc40ae3 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 02:36:08 -0400 Subject: [PATCH 08/46] propellor spin --- src/Propellor/Property/Docker.hs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index de3c64f..b8e751d 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -286,16 +286,16 @@ restart policy = runProp "restart" (serialize policy) serialize (RestartOnFailure n) = "on-failure:" ++ show n serialize RestartAlways = "always" --- | NoRestart makes docker not restart a container when it exits --- Note that this includes not restarting it on boot! --- --- RestartOnFailure will restart the container if it exits nonzero. --- A max-retry value can be provided to prevent repeated restarts. --- --- RestartAlways is the default for docker containers configured by +-- | RestartAlways is the default for docker containers configured by -- propellor; as well as keeping badly behaved containers running, -- it ensures that containers get started back up after reboot or -- after docker is upgraded. +-- +-- NoRestart makes docker not restart a container when it exits +-- Note that this includes not restarting it on boot! +-- +-- RestartOnFailure will restart the container if it exits nonzero. +-- A max-retry value can be provided to prevent too many restarts. data RestartPolicy = NoRestart | RestartOnFailure (Maybe Int) | RestartAlways -- | A container is identified by its name, and the host From 9e3485a13b11a464acaa96a4dc0b7cf177e5d102 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 02:41:47 -0400 Subject: [PATCH 09/46] propellor spin --- src/Propellor/Property/Docker.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index b8e751d..428d2c2 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -161,7 +161,7 @@ mkContainer cid@(ContainerId hn _cn) h = Container -- name the container in a predictable way so we -- and the user can easily find it later & name (fromContainerId cid) - & restart RestartAlways + -- & restart RestartAlways -- | Causes *any* docker images that are not in use by running containers to -- be deleted. And deletes any containers that propellor has set up From 4223e92129999e8e6eb5df847520c8a3edf9b223 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 02:43:13 -0400 Subject: [PATCH 10/46] propellor spin From a0e4c872b6733cba1b539afa43c644103c14d63b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 02:50:50 -0400 Subject: [PATCH 11/46] propellor spin --- src/Propellor/Property/Docker.hs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index 428d2c2..120b51c 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -161,7 +161,6 @@ mkContainer cid@(ContainerId hn _cn) h = Container -- name the container in a predictable way so we -- and the user can easily find it later & name (fromContainerId cid) - -- & restart RestartAlways -- | Causes *any* docker images that are not in use by running containers to -- be deleted. And deletes any containers that propellor has set up @@ -383,7 +382,13 @@ runningContainer cid@(ContainerId hn cn) image runps = containerDesc cid $ prope shim <- liftIO $ Shim.setup (localdir "propellor") (localdir shimdir cid) liftIO $ writeFile (identFile cid) (show ident) ensureProperty $ boolProperty "run" $ runContainer img - (runps ++ ["-i", "-d", "-t"]) + -- Restart by default so container comes up on + -- boot or when docker is upgraded. This is put + -- here, rather than adding a default Property + -- in mkContainer, to avoid changing the ident + -- of existing containers. Any restart property + -- will override it. + ("--restart=always" : runps ++ ["-i", "-d", "-t"]) [shim, "--docker", fromContainerId cid] -- | Called when propellor is running inside a docker container. From d57ecbefbfaf5f776301dc05a7bcc998d47ad49c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 02:52:46 -0400 Subject: [PATCH 12/46] propellor spin From ed07cfee612e930635848167bbfdccf4cb4d85a5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 02:54:29 -0400 Subject: [PATCH 13/46] propellor spin From ddd2031267e13ac47e4990847dd53e536b308e02 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 02:56:26 -0400 Subject: [PATCH 14/46] propellor spin From 93099b862768235d3f9936435f6f65292b8d9b7c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 03:18:52 -0400 Subject: [PATCH 15/46] bugfix --- debian/changelog | 8 ++++++++ src/Propellor/Property.hs | 2 +- src/Propellor/Property/Docker.hs | 3 ++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 012826b..043ef50 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +propellor (0.9.1) UNRELEASED; urgency=medium + + * Docker: Add ability to control when containers restart. + * Docker: Defaut to always restarting containers, so they come back + up after reboots and docker daemon upgrades. + + -- Joey Hess Thu, 23 Oct 2014 03:05:22 -0400 + propellor (0.9.0) unstable; urgency=medium * Avoid encoding the current stable suite in propellor's code, diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs index ce82519..8713604 100644 --- a/src/Propellor/Property.hs +++ b/src/Propellor/Property.hs @@ -135,7 +135,7 @@ host hn = Host hn [] mempty -- -- Can add Properties and RevertableProperties (&) :: IsProp p => Host -> p -> Host -(Host hn ps as) & p = Host hn (ps ++ [toProp p]) (as <> getInfo p) +(Host hn ps is) & p = Host hn (ps ++ [toProp p]) (is <> getInfo p) infixl 1 & diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index 120b51c..358cc8c 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -282,7 +282,7 @@ restart policy = runProp "restart" (serialize policy) where serialize NoRestart = "no" serialize (RestartOnFailure Nothing) = "on-failure" - serialize (RestartOnFailure n) = "on-failure:" ++ show n + serialize (RestartOnFailure (Just n)) = "on-failure:" ++ show n serialize RestartAlways = "always" -- | RestartAlways is the default for docker containers configured by @@ -388,6 +388,7 @@ runningContainer cid@(ContainerId hn cn) image runps = containerDesc cid $ prope -- in mkContainer, to avoid changing the ident -- of existing containers. Any restart property -- will override it. + -- This is a hack. TODO: Move to correct place. ("--restart=always" : runps ++ ["-i", "-d", "-t"]) [shim, "--docker", fromContainerId cid] From 856a4c673cc890b1e2e5ee749bdc70ea6d7f1cb9 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 03:27:40 -0400 Subject: [PATCH 16/46] propellor spin --- debian/changelog | 2 +- src/Propellor/Property.hs | 8 ++++++++ src/Propellor/Property/Docker.hs | 22 +++++++++------------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/debian/changelog b/debian/changelog index 043ef50..9e90877 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,7 +1,7 @@ propellor (0.9.1) UNRELEASED; urgency=medium * Docker: Add ability to control when containers restart. - * Docker: Defaut to always restarting containers, so they come back + * Docker: Default to always restarting containers, so they come back up after reboots and docker daemon upgrades. -- Joey Hess Thu, 23 Oct 2014 03:05:22 -0400 diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs index 8713604..4b95731 100644 --- a/src/Propellor/Property.hs +++ b/src/Propellor/Property.hs @@ -145,6 +145,14 @@ h ! p = h & revert p infixl 1 ! +-- | Like (&), but adds the property as the first property of the host. +-- Normally, property order should not matter, but this is useful +-- when it does. +(&^) :: IsProp p => Host -> p -> Host +(Host hn ps is) &^ p = Host hn ([toProp p] ++ ps) (getInfo p <> is) + +infixl 1 &^ + -- Changes the action that is performed to satisfy a property. adjustProperty :: Property -> (Propellor Result -> Propellor Result) -> Property adjustProperty p f = p { propertySatisfy = f (propertySatisfy p) } diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index 358cc8c..b717fe1 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -19,7 +19,6 @@ module Propellor.Property.Docker ( -- * Container configuration dns, hostname, - name, publish, expose, user, @@ -156,10 +155,14 @@ mkContainer cid@(ContainerId hn _cn) h = Container where info = _dockerinfo $ hostInfo h' h' = h - -- expose propellor directory inside the container + -- Restart by default so container comes up on + -- boot or when docker is upgraded. + &^ restart RestartAlways + -- Expose propellor directory inside the container. & volume (localdir++":"++localdir) - -- name the container in a predictable way so we - -- and the user can easily find it later + -- Name the container in a predictable way so we + -- and the user can easily find it later. This property + -- comes last, so it cannot be overridden. & name (fromContainerId cid) -- | Causes *any* docker images that are not in use by running containers to @@ -219,7 +222,7 @@ dns = runProp "dns" hostname :: String -> Property hostname = runProp "hostname" --- | Set name for container. (Normally done automatically.) +-- | Set name of container. name :: String -> Property name = runProp "name" @@ -382,14 +385,7 @@ runningContainer cid@(ContainerId hn cn) image runps = containerDesc cid $ prope shim <- liftIO $ Shim.setup (localdir "propellor") (localdir shimdir cid) liftIO $ writeFile (identFile cid) (show ident) ensureProperty $ boolProperty "run" $ runContainer img - -- Restart by default so container comes up on - -- boot or when docker is upgraded. This is put - -- here, rather than adding a default Property - -- in mkContainer, to avoid changing the ident - -- of existing containers. Any restart property - -- will override it. - -- This is a hack. TODO: Move to correct place. - ("--restart=always" : runps ++ ["-i", "-d", "-t"]) + (runps ++ ["-i", "-d", "-t"]) [shim, "--docker", fromContainerId cid] -- | Called when propellor is running inside a docker container. From 2a5deb2950e21351d44f4faddbe9800307916044 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 03:28:14 -0400 Subject: [PATCH 17/46] propellor spin From fd0670def7fd2f384cb94a3667e497df9bea19af Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 03:38:50 -0400 Subject: [PATCH 18/46] todo --- doc/todo/docker_todo_list.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/todo/docker_todo_list.mdwn b/doc/todo/docker_todo_list.mdwn index 1321445..72ded42 100644 --- a/doc/todo/docker_todo_list.mdwn +++ b/doc/todo/docker_todo_list.mdwn @@ -1,3 +1,5 @@ * There is no way for a property of a docker container to require some property be met outside the container. For example, some servers need ntp installed for a good date source. +* The SimpleSh was added before `docker exec` existed, and could probably + be eliminated by using that. From 7397a1354cda0e97de6a9b8d58de3c85300baf48 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:09:55 -0400 Subject: [PATCH 19/46] propellor spin From 511adc3b9b7e7e8c7d89e596128320eb3902f19c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:13:38 -0400 Subject: [PATCH 20/46] propellor spin From f3d3a1ffad2f8aed7428014fbe5b5c3d2bf3a966 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:14:19 -0400 Subject: [PATCH 21/46] propellor spin From 7637ea0af9ff4056cbdc16f25016785442d4b97e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:23:25 -0400 Subject: [PATCH 22/46] propellor spin --- debian/changelog | 2 +- src/Propellor/Property.hs | 10 +--------- src/Propellor/Property/Docker.hs | 22 +++++++++++++--------- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/debian/changelog b/debian/changelog index 9e90877..043ef50 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,7 +1,7 @@ propellor (0.9.1) UNRELEASED; urgency=medium * Docker: Add ability to control when containers restart. - * Docker: Default to always restarting containers, so they come back + * Docker: Defaut to always restarting containers, so they come back up after reboots and docker daemon upgrades. -- Joey Hess Thu, 23 Oct 2014 03:05:22 -0400 diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs index 4b95731..ce82519 100644 --- a/src/Propellor/Property.hs +++ b/src/Propellor/Property.hs @@ -135,7 +135,7 @@ host hn = Host hn [] mempty -- -- Can add Properties and RevertableProperties (&) :: IsProp p => Host -> p -> Host -(Host hn ps is) & p = Host hn (ps ++ [toProp p]) (is <> getInfo p) +(Host hn ps as) & p = Host hn (ps ++ [toProp p]) (as <> getInfo p) infixl 1 & @@ -145,14 +145,6 @@ h ! p = h & revert p infixl 1 ! --- | Like (&), but adds the property as the first property of the host. --- Normally, property order should not matter, but this is useful --- when it does. -(&^) :: IsProp p => Host -> p -> Host -(Host hn ps is) &^ p = Host hn ([toProp p] ++ ps) (getInfo p <> is) - -infixl 1 &^ - -- Changes the action that is performed to satisfy a property. adjustProperty :: Property -> (Propellor Result -> Propellor Result) -> Property adjustProperty p f = p { propertySatisfy = f (propertySatisfy p) } diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index b717fe1..358cc8c 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -19,6 +19,7 @@ module Propellor.Property.Docker ( -- * Container configuration dns, hostname, + name, publish, expose, user, @@ -155,14 +156,10 @@ mkContainer cid@(ContainerId hn _cn) h = Container where info = _dockerinfo $ hostInfo h' h' = h - -- Restart by default so container comes up on - -- boot or when docker is upgraded. - &^ restart RestartAlways - -- Expose propellor directory inside the container. + -- expose propellor directory inside the container & volume (localdir++":"++localdir) - -- Name the container in a predictable way so we - -- and the user can easily find it later. This property - -- comes last, so it cannot be overridden. + -- name the container in a predictable way so we + -- and the user can easily find it later & name (fromContainerId cid) -- | Causes *any* docker images that are not in use by running containers to @@ -222,7 +219,7 @@ dns = runProp "dns" hostname :: String -> Property hostname = runProp "hostname" --- | Set name of container. +-- | Set name for container. (Normally done automatically.) name :: String -> Property name = runProp "name" @@ -385,7 +382,14 @@ runningContainer cid@(ContainerId hn cn) image runps = containerDesc cid $ prope shim <- liftIO $ Shim.setup (localdir "propellor") (localdir shimdir cid) liftIO $ writeFile (identFile cid) (show ident) ensureProperty $ boolProperty "run" $ runContainer img - (runps ++ ["-i", "-d", "-t"]) + -- Restart by default so container comes up on + -- boot or when docker is upgraded. This is put + -- here, rather than adding a default Property + -- in mkContainer, to avoid changing the ident + -- of existing containers. Any restart property + -- will override it. + -- This is a hack. TODO: Move to correct place. + ("--restart=always" : runps ++ ["-i", "-d", "-t"]) [shim, "--docker", fromContainerId cid] -- | Called when propellor is running inside a docker container. From 5bfeb3f9aad1108907544deb0b04ccc58b5614c0 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:25:07 -0400 Subject: [PATCH 23/46] Revert "propellor spin" This reverts commit 7637ea0af9ff4056cbdc16f25016785442d4b97e. --- debian/changelog | 2 +- src/Propellor/Property.hs | 10 +++++++++- src/Propellor/Property/Docker.hs | 22 +++++++++------------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/debian/changelog b/debian/changelog index 043ef50..9e90877 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,7 +1,7 @@ propellor (0.9.1) UNRELEASED; urgency=medium * Docker: Add ability to control when containers restart. - * Docker: Defaut to always restarting containers, so they come back + * Docker: Default to always restarting containers, so they come back up after reboots and docker daemon upgrades. -- Joey Hess Thu, 23 Oct 2014 03:05:22 -0400 diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs index ce82519..4b95731 100644 --- a/src/Propellor/Property.hs +++ b/src/Propellor/Property.hs @@ -135,7 +135,7 @@ host hn = Host hn [] mempty -- -- Can add Properties and RevertableProperties (&) :: IsProp p => Host -> p -> Host -(Host hn ps as) & p = Host hn (ps ++ [toProp p]) (as <> getInfo p) +(Host hn ps is) & p = Host hn (ps ++ [toProp p]) (is <> getInfo p) infixl 1 & @@ -145,6 +145,14 @@ h ! p = h & revert p infixl 1 ! +-- | Like (&), but adds the property as the first property of the host. +-- Normally, property order should not matter, but this is useful +-- when it does. +(&^) :: IsProp p => Host -> p -> Host +(Host hn ps is) &^ p = Host hn ([toProp p] ++ ps) (getInfo p <> is) + +infixl 1 &^ + -- Changes the action that is performed to satisfy a property. adjustProperty :: Property -> (Propellor Result -> Propellor Result) -> Property adjustProperty p f = p { propertySatisfy = f (propertySatisfy p) } diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index 358cc8c..b717fe1 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -19,7 +19,6 @@ module Propellor.Property.Docker ( -- * Container configuration dns, hostname, - name, publish, expose, user, @@ -156,10 +155,14 @@ mkContainer cid@(ContainerId hn _cn) h = Container where info = _dockerinfo $ hostInfo h' h' = h - -- expose propellor directory inside the container + -- Restart by default so container comes up on + -- boot or when docker is upgraded. + &^ restart RestartAlways + -- Expose propellor directory inside the container. & volume (localdir++":"++localdir) - -- name the container in a predictable way so we - -- and the user can easily find it later + -- Name the container in a predictable way so we + -- and the user can easily find it later. This property + -- comes last, so it cannot be overridden. & name (fromContainerId cid) -- | Causes *any* docker images that are not in use by running containers to @@ -219,7 +222,7 @@ dns = runProp "dns" hostname :: String -> Property hostname = runProp "hostname" --- | Set name for container. (Normally done automatically.) +-- | Set name of container. name :: String -> Property name = runProp "name" @@ -382,14 +385,7 @@ runningContainer cid@(ContainerId hn cn) image runps = containerDesc cid $ prope shim <- liftIO $ Shim.setup (localdir "propellor") (localdir shimdir cid) liftIO $ writeFile (identFile cid) (show ident) ensureProperty $ boolProperty "run" $ runContainer img - -- Restart by default so container comes up on - -- boot or when docker is upgraded. This is put - -- here, rather than adding a default Property - -- in mkContainer, to avoid changing the ident - -- of existing containers. Any restart property - -- will override it. - -- This is a hack. TODO: Move to correct place. - ("--restart=always" : runps ++ ["-i", "-d", "-t"]) + (runps ++ ["-i", "-d", "-t"]) [shim, "--docker", fromContainerId cid] -- | Called when propellor is running inside a docker container. From 80f5b53f1b7fdc876d5e45df68c29f53bd9666b2 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:26:05 -0400 Subject: [PATCH 24/46] propellor spin --- debian/changelog | 8 -------- doc/todo/docker_todo_list.mdwn | 2 -- src/Propellor/Property.hs | 10 +--------- src/Propellor/Property/Docker.hs | 30 ++++++++++++++---------------- 4 files changed, 15 insertions(+), 35 deletions(-) diff --git a/debian/changelog b/debian/changelog index 9e90877..012826b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,11 +1,3 @@ -propellor (0.9.1) UNRELEASED; urgency=medium - - * Docker: Add ability to control when containers restart. - * Docker: Default to always restarting containers, so they come back - up after reboots and docker daemon upgrades. - - -- Joey Hess Thu, 23 Oct 2014 03:05:22 -0400 - propellor (0.9.0) unstable; urgency=medium * Avoid encoding the current stable suite in propellor's code, diff --git a/doc/todo/docker_todo_list.mdwn b/doc/todo/docker_todo_list.mdwn index 72ded42..1321445 100644 --- a/doc/todo/docker_todo_list.mdwn +++ b/doc/todo/docker_todo_list.mdwn @@ -1,5 +1,3 @@ * There is no way for a property of a docker container to require some property be met outside the container. For example, some servers need ntp installed for a good date source. -* The SimpleSh was added before `docker exec` existed, and could probably - be eliminated by using that. diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs index 4b95731..ce82519 100644 --- a/src/Propellor/Property.hs +++ b/src/Propellor/Property.hs @@ -135,7 +135,7 @@ host hn = Host hn [] mempty -- -- Can add Properties and RevertableProperties (&) :: IsProp p => Host -> p -> Host -(Host hn ps is) & p = Host hn (ps ++ [toProp p]) (is <> getInfo p) +(Host hn ps as) & p = Host hn (ps ++ [toProp p]) (as <> getInfo p) infixl 1 & @@ -145,14 +145,6 @@ h ! p = h & revert p infixl 1 ! --- | Like (&), but adds the property as the first property of the host. --- Normally, property order should not matter, but this is useful --- when it does. -(&^) :: IsProp p => Host -> p -> Host -(Host hn ps is) &^ p = Host hn ([toProp p] ++ ps) (getInfo p <> is) - -infixl 1 &^ - -- Changes the action that is performed to satisfy a property. adjustProperty :: Property -> (Propellor Result -> Propellor Result) -> Property adjustProperty p f = p { propertySatisfy = f (propertySatisfy p) } diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index b717fe1..de3c64f 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -19,6 +19,7 @@ module Propellor.Property.Docker ( -- * Container configuration dns, hostname, + name, publish, expose, user, @@ -155,15 +156,12 @@ mkContainer cid@(ContainerId hn _cn) h = Container where info = _dockerinfo $ hostInfo h' h' = h - -- Restart by default so container comes up on - -- boot or when docker is upgraded. - &^ restart RestartAlways - -- Expose propellor directory inside the container. + -- expose propellor directory inside the container & volume (localdir++":"++localdir) - -- Name the container in a predictable way so we - -- and the user can easily find it later. This property - -- comes last, so it cannot be overridden. + -- name the container in a predictable way so we + -- and the user can easily find it later & name (fromContainerId cid) + & restart RestartAlways -- | Causes *any* docker images that are not in use by running containers to -- be deleted. And deletes any containers that propellor has set up @@ -222,7 +220,7 @@ dns = runProp "dns" hostname :: String -> Property hostname = runProp "hostname" --- | Set name of container. +-- | Set name for container. (Normally done automatically.) name :: String -> Property name = runProp "name" @@ -285,19 +283,19 @@ restart policy = runProp "restart" (serialize policy) where serialize NoRestart = "no" serialize (RestartOnFailure Nothing) = "on-failure" - serialize (RestartOnFailure (Just n)) = "on-failure:" ++ show n + serialize (RestartOnFailure n) = "on-failure:" ++ show n serialize RestartAlways = "always" --- | RestartAlways is the default for docker containers configured by --- propellor; as well as keeping badly behaved containers running, --- it ensures that containers get started back up after reboot or --- after docker is upgraded. --- --- NoRestart makes docker not restart a container when it exits +-- | NoRestart makes docker not restart a container when it exits -- Note that this includes not restarting it on boot! -- -- RestartOnFailure will restart the container if it exits nonzero. --- A max-retry value can be provided to prevent too many restarts. +-- A max-retry value can be provided to prevent repeated restarts. +-- +-- RestartAlways is the default for docker containers configured by +-- propellor; as well as keeping badly behaved containers running, +-- it ensures that containers get started back up after reboot or +-- after docker is upgraded. data RestartPolicy = NoRestart | RestartOnFailure (Maybe Int) | RestartAlways -- | A container is identified by its name, and the host From 45ce3a5e8ccf90e357dbaf6e0152daa4de88b7fd Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:28:10 -0400 Subject: [PATCH 25/46] propellor spin --- config-joey.hs | 2 +- src/Propellor/Property/Docker.hs | 26 +------------------------- 2 files changed, 2 insertions(+), 26 deletions(-) diff --git a/config-joey.hs b/config-joey.hs index 9d54b51..3bf0111 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -53,7 +53,7 @@ darkstar = host "darkstar.kitenet.net" & Apt.buildDep ["git-annex"] `period` Daily & Docker.configured ! Docker.docked hosts "android-git-annex" - & Docker.docked hosts "test" + ! Docker.docked hosts "webserver" clam :: Host clam = standardSystem "clam.kitenet.net" Unstable "amd64" diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index de3c64f..8c2f370 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -30,8 +30,6 @@ module Propellor.Property.Docker ( cpuShares, link, ContainerAlias, - restart, - RestartPolicy(..), -- * Internal use chain, ) where @@ -152,7 +150,7 @@ findContainer mhost cid cn mk = case mhost of mkContainer :: ContainerId -> Host -> Maybe Container mkContainer cid@(ContainerId hn _cn) h = Container <$> fromVal (_dockerImage info) - <*> pure (map (\mkparam -> mkparam hn) (_dockerRunParams info)) + <*> pure (map (\a -> a hn) (_dockerRunParams info)) where info = _dockerinfo $ hostInfo h' h' = h @@ -161,7 +159,6 @@ mkContainer cid@(ContainerId hn _cn) h = Container -- name the container in a predictable way so we -- and the user can easily find it later & name (fromContainerId cid) - & restart RestartAlways -- | Causes *any* docker images that are not in use by running containers to -- be deleted. And deletes any containers that propellor has set up @@ -277,27 +274,6 @@ link linkwith calias = genProp "link" $ \hn -> -- Each container has its own alias namespace. type ContainerAlias = String --- | Restart policy to apply when a container exits. -restart :: RestartPolicy -> Property -restart policy = runProp "restart" (serialize policy) - where - serialize NoRestart = "no" - serialize (RestartOnFailure Nothing) = "on-failure" - serialize (RestartOnFailure n) = "on-failure:" ++ show n - serialize RestartAlways = "always" - --- | NoRestart makes docker not restart a container when it exits --- Note that this includes not restarting it on boot! --- --- RestartOnFailure will restart the container if it exits nonzero. --- A max-retry value can be provided to prevent repeated restarts. --- --- RestartAlways is the default for docker containers configured by --- propellor; as well as keeping badly behaved containers running, --- it ensures that containers get started back up after reboot or --- after docker is upgraded. -data RestartPolicy = NoRestart | RestartOnFailure (Maybe Int) | RestartAlways - -- | A container is identified by its name, and the host -- on which it's deployed. data ContainerId = ContainerId HostName ContainerName From bbec7021f84766d5a783c1f320066b27e04a225b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:31:00 -0400 Subject: [PATCH 26/46] Revert "propellor spin" This reverts commit 45ce3a5e8ccf90e357dbaf6e0152daa4de88b7fd. --- config-joey.hs | 2 +- src/Propellor/Property/Docker.hs | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/config-joey.hs b/config-joey.hs index 3bf0111..9d54b51 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -53,7 +53,7 @@ darkstar = host "darkstar.kitenet.net" & Apt.buildDep ["git-annex"] `period` Daily & Docker.configured ! Docker.docked hosts "android-git-annex" - ! Docker.docked hosts "webserver" + & Docker.docked hosts "test" clam :: Host clam = standardSystem "clam.kitenet.net" Unstable "amd64" diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index 8c2f370..de3c64f 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -30,6 +30,8 @@ module Propellor.Property.Docker ( cpuShares, link, ContainerAlias, + restart, + RestartPolicy(..), -- * Internal use chain, ) where @@ -150,7 +152,7 @@ findContainer mhost cid cn mk = case mhost of mkContainer :: ContainerId -> Host -> Maybe Container mkContainer cid@(ContainerId hn _cn) h = Container <$> fromVal (_dockerImage info) - <*> pure (map (\a -> a hn) (_dockerRunParams info)) + <*> pure (map (\mkparam -> mkparam hn) (_dockerRunParams info)) where info = _dockerinfo $ hostInfo h' h' = h @@ -159,6 +161,7 @@ mkContainer cid@(ContainerId hn _cn) h = Container -- name the container in a predictable way so we -- and the user can easily find it later & name (fromContainerId cid) + & restart RestartAlways -- | Causes *any* docker images that are not in use by running containers to -- be deleted. And deletes any containers that propellor has set up @@ -274,6 +277,27 @@ link linkwith calias = genProp "link" $ \hn -> -- Each container has its own alias namespace. type ContainerAlias = String +-- | Restart policy to apply when a container exits. +restart :: RestartPolicy -> Property +restart policy = runProp "restart" (serialize policy) + where + serialize NoRestart = "no" + serialize (RestartOnFailure Nothing) = "on-failure" + serialize (RestartOnFailure n) = "on-failure:" ++ show n + serialize RestartAlways = "always" + +-- | NoRestart makes docker not restart a container when it exits +-- Note that this includes not restarting it on boot! +-- +-- RestartOnFailure will restart the container if it exits nonzero. +-- A max-retry value can be provided to prevent repeated restarts. +-- +-- RestartAlways is the default for docker containers configured by +-- propellor; as well as keeping badly behaved containers running, +-- it ensures that containers get started back up after reboot or +-- after docker is upgraded. +data RestartPolicy = NoRestart | RestartOnFailure (Maybe Int) | RestartAlways + -- | A container is identified by its name, and the host -- on which it's deployed. data ContainerId = ContainerId HostName ContainerName From 82838a37ab2fbb5cb35b29e9f0c0583cc0eaba9e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:31:14 -0400 Subject: [PATCH 27/46] propellor spin From bdf3e37066a2f01eac7411b77a3b26e3796f5d65 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:33:00 -0400 Subject: [PATCH 28/46] Revert "propellor spin" This reverts commit 80f5b53f1b7fdc876d5e45df68c29f53bd9666b2. --- debian/changelog | 8 ++++++++ doc/todo/docker_todo_list.mdwn | 2 ++ src/Propellor/Property.hs | 10 +++++++++- src/Propellor/Property/Docker.hs | 30 ++++++++++++++++-------------- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/debian/changelog b/debian/changelog index 012826b..9e90877 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +propellor (0.9.1) UNRELEASED; urgency=medium + + * Docker: Add ability to control when containers restart. + * Docker: Default to always restarting containers, so they come back + up after reboots and docker daemon upgrades. + + -- Joey Hess Thu, 23 Oct 2014 03:05:22 -0400 + propellor (0.9.0) unstable; urgency=medium * Avoid encoding the current stable suite in propellor's code, diff --git a/doc/todo/docker_todo_list.mdwn b/doc/todo/docker_todo_list.mdwn index 1321445..72ded42 100644 --- a/doc/todo/docker_todo_list.mdwn +++ b/doc/todo/docker_todo_list.mdwn @@ -1,3 +1,5 @@ * There is no way for a property of a docker container to require some property be met outside the container. For example, some servers need ntp installed for a good date source. +* The SimpleSh was added before `docker exec` existed, and could probably + be eliminated by using that. diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs index ce82519..4b95731 100644 --- a/src/Propellor/Property.hs +++ b/src/Propellor/Property.hs @@ -135,7 +135,7 @@ host hn = Host hn [] mempty -- -- Can add Properties and RevertableProperties (&) :: IsProp p => Host -> p -> Host -(Host hn ps as) & p = Host hn (ps ++ [toProp p]) (as <> getInfo p) +(Host hn ps is) & p = Host hn (ps ++ [toProp p]) (is <> getInfo p) infixl 1 & @@ -145,6 +145,14 @@ h ! p = h & revert p infixl 1 ! +-- | Like (&), but adds the property as the first property of the host. +-- Normally, property order should not matter, but this is useful +-- when it does. +(&^) :: IsProp p => Host -> p -> Host +(Host hn ps is) &^ p = Host hn ([toProp p] ++ ps) (getInfo p <> is) + +infixl 1 &^ + -- Changes the action that is performed to satisfy a property. adjustProperty :: Property -> (Propellor Result -> Propellor Result) -> Property adjustProperty p f = p { propertySatisfy = f (propertySatisfy p) } diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index de3c64f..b717fe1 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -19,7 +19,6 @@ module Propellor.Property.Docker ( -- * Container configuration dns, hostname, - name, publish, expose, user, @@ -156,12 +155,15 @@ mkContainer cid@(ContainerId hn _cn) h = Container where info = _dockerinfo $ hostInfo h' h' = h - -- expose propellor directory inside the container + -- Restart by default so container comes up on + -- boot or when docker is upgraded. + &^ restart RestartAlways + -- Expose propellor directory inside the container. & volume (localdir++":"++localdir) - -- name the container in a predictable way so we - -- and the user can easily find it later + -- Name the container in a predictable way so we + -- and the user can easily find it later. This property + -- comes last, so it cannot be overridden. & name (fromContainerId cid) - & restart RestartAlways -- | Causes *any* docker images that are not in use by running containers to -- be deleted. And deletes any containers that propellor has set up @@ -220,7 +222,7 @@ dns = runProp "dns" hostname :: String -> Property hostname = runProp "hostname" --- | Set name for container. (Normally done automatically.) +-- | Set name of container. name :: String -> Property name = runProp "name" @@ -283,19 +285,19 @@ restart policy = runProp "restart" (serialize policy) where serialize NoRestart = "no" serialize (RestartOnFailure Nothing) = "on-failure" - serialize (RestartOnFailure n) = "on-failure:" ++ show n + serialize (RestartOnFailure (Just n)) = "on-failure:" ++ show n serialize RestartAlways = "always" --- | NoRestart makes docker not restart a container when it exits --- Note that this includes not restarting it on boot! --- --- RestartOnFailure will restart the container if it exits nonzero. --- A max-retry value can be provided to prevent repeated restarts. --- --- RestartAlways is the default for docker containers configured by +-- | RestartAlways is the default for docker containers configured by -- propellor; as well as keeping badly behaved containers running, -- it ensures that containers get started back up after reboot or -- after docker is upgraded. +-- +-- NoRestart makes docker not restart a container when it exits +-- Note that this includes not restarting it on boot! +-- +-- RestartOnFailure will restart the container if it exits nonzero. +-- A max-retry value can be provided to prevent too many restarts. data RestartPolicy = NoRestart | RestartOnFailure (Maybe Int) | RestartAlways -- | A container is identified by its name, and the host From fec304df54556b99003196e6d1003b2165f14f43 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:33:51 -0400 Subject: [PATCH 29/46] propellor spin From ac7b182b5a0f3711414757d05bb461385516e700 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:36:06 -0400 Subject: [PATCH 30/46] propellor spin --- src/Propellor/Property.hs | 10 +--------- src/Propellor/Property/Docker.hs | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs index 4b95731..ce82519 100644 --- a/src/Propellor/Property.hs +++ b/src/Propellor/Property.hs @@ -135,7 +135,7 @@ host hn = Host hn [] mempty -- -- Can add Properties and RevertableProperties (&) :: IsProp p => Host -> p -> Host -(Host hn ps is) & p = Host hn (ps ++ [toProp p]) (is <> getInfo p) +(Host hn ps as) & p = Host hn (ps ++ [toProp p]) (as <> getInfo p) infixl 1 & @@ -145,14 +145,6 @@ h ! p = h & revert p infixl 1 ! --- | Like (&), but adds the property as the first property of the host. --- Normally, property order should not matter, but this is useful --- when it does. -(&^) :: IsProp p => Host -> p -> Host -(Host hn ps is) &^ p = Host hn ([toProp p] ++ ps) (getInfo p <> is) - -infixl 1 &^ - -- Changes the action that is performed to satisfy a property. adjustProperty :: Property -> (Propellor Result -> Propellor Result) -> Property adjustProperty p f = p { propertySatisfy = f (propertySatisfy p) } diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index b717fe1..0e71acd 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -157,7 +157,7 @@ mkContainer cid@(ContainerId hn _cn) h = Container h' = h -- Restart by default so container comes up on -- boot or when docker is upgraded. - &^ restart RestartAlways + -- &^ restart RestartAlways -- Expose propellor directory inside the container. & volume (localdir++":"++localdir) -- Name the container in a predictable way so we From 8d353813bf1e4d0c64f33cf2beed0938eeca92b4 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:39:29 -0400 Subject: [PATCH 31/46] Revert "propellor spin" This reverts commit ac7b182b5a0f3711414757d05bb461385516e700. --- src/Propellor/Property.hs | 10 +++++++++- src/Propellor/Property/Docker.hs | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs index ce82519..4b95731 100644 --- a/src/Propellor/Property.hs +++ b/src/Propellor/Property.hs @@ -135,7 +135,7 @@ host hn = Host hn [] mempty -- -- Can add Properties and RevertableProperties (&) :: IsProp p => Host -> p -> Host -(Host hn ps as) & p = Host hn (ps ++ [toProp p]) (as <> getInfo p) +(Host hn ps is) & p = Host hn (ps ++ [toProp p]) (is <> getInfo p) infixl 1 & @@ -145,6 +145,14 @@ h ! p = h & revert p infixl 1 ! +-- | Like (&), but adds the property as the first property of the host. +-- Normally, property order should not matter, but this is useful +-- when it does. +(&^) :: IsProp p => Host -> p -> Host +(Host hn ps is) &^ p = Host hn ([toProp p] ++ ps) (getInfo p <> is) + +infixl 1 &^ + -- Changes the action that is performed to satisfy a property. adjustProperty :: Property -> (Propellor Result -> Propellor Result) -> Property adjustProperty p f = p { propertySatisfy = f (propertySatisfy p) } diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index 0e71acd..b717fe1 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -157,7 +157,7 @@ mkContainer cid@(ContainerId hn _cn) h = Container h' = h -- Restart by default so container comes up on -- boot or when docker is upgraded. - -- &^ restart RestartAlways + &^ restart RestartAlways -- Expose propellor directory inside the container. & volume (localdir++":"++localdir) -- Name the container in a predictable way so we From 21cc80218adb31c0f4411ba672b5b51a6d110ecd Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:40:32 -0400 Subject: [PATCH 32/46] propellor spin From d3a351e3a0b9fadb1a126bc94143ee6cd410e722 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:41:56 -0400 Subject: [PATCH 33/46] propellor spin From 26bef2486d27b2cde6feda633c6a7509675a3fe5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:42:34 -0400 Subject: [PATCH 34/46] Revert "Revert "propellor spin"" This reverts commit 8d353813bf1e4d0c64f33cf2beed0938eeca92b4. --- src/Propellor/Property.hs | 10 +--------- src/Propellor/Property/Docker.hs | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs index 4b95731..ce82519 100644 --- a/src/Propellor/Property.hs +++ b/src/Propellor/Property.hs @@ -135,7 +135,7 @@ host hn = Host hn [] mempty -- -- Can add Properties and RevertableProperties (&) :: IsProp p => Host -> p -> Host -(Host hn ps is) & p = Host hn (ps ++ [toProp p]) (is <> getInfo p) +(Host hn ps as) & p = Host hn (ps ++ [toProp p]) (as <> getInfo p) infixl 1 & @@ -145,14 +145,6 @@ h ! p = h & revert p infixl 1 ! --- | Like (&), but adds the property as the first property of the host. --- Normally, property order should not matter, but this is useful --- when it does. -(&^) :: IsProp p => Host -> p -> Host -(Host hn ps is) &^ p = Host hn ([toProp p] ++ ps) (getInfo p <> is) - -infixl 1 &^ - -- Changes the action that is performed to satisfy a property. adjustProperty :: Property -> (Propellor Result -> Propellor Result) -> Property adjustProperty p f = p { propertySatisfy = f (propertySatisfy p) } diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index b717fe1..0e71acd 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -157,7 +157,7 @@ mkContainer cid@(ContainerId hn _cn) h = Container h' = h -- Restart by default so container comes up on -- boot or when docker is upgraded. - &^ restart RestartAlways + -- &^ restart RestartAlways -- Expose propellor directory inside the container. & volume (localdir++":"++localdir) -- Name the container in a predictable way so we From c6a488157c31bafcbdea83b93ff7d4d657ce26c4 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:42:53 -0400 Subject: [PATCH 35/46] propellor spin From e6924a894d32697747795bd78d7ee1cad92af5a7 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:46:15 -0400 Subject: [PATCH 36/46] Revert "Revert "Revert "propellor spin""" This reverts commit 26bef2486d27b2cde6feda633c6a7509675a3fe5. --- src/Propellor/Property.hs | 10 +++++++++- src/Propellor/Property/Docker.hs | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs index ce82519..4b95731 100644 --- a/src/Propellor/Property.hs +++ b/src/Propellor/Property.hs @@ -135,7 +135,7 @@ host hn = Host hn [] mempty -- -- Can add Properties and RevertableProperties (&) :: IsProp p => Host -> p -> Host -(Host hn ps as) & p = Host hn (ps ++ [toProp p]) (as <> getInfo p) +(Host hn ps is) & p = Host hn (ps ++ [toProp p]) (is <> getInfo p) infixl 1 & @@ -145,6 +145,14 @@ h ! p = h & revert p infixl 1 ! +-- | Like (&), but adds the property as the first property of the host. +-- Normally, property order should not matter, but this is useful +-- when it does. +(&^) :: IsProp p => Host -> p -> Host +(Host hn ps is) &^ p = Host hn ([toProp p] ++ ps) (getInfo p <> is) + +infixl 1 &^ + -- Changes the action that is performed to satisfy a property. adjustProperty :: Property -> (Propellor Result -> Propellor Result) -> Property adjustProperty p f = p { propertySatisfy = f (propertySatisfy p) } diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index 0e71acd..b717fe1 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -157,7 +157,7 @@ mkContainer cid@(ContainerId hn _cn) h = Container h' = h -- Restart by default so container comes up on -- boot or when docker is upgraded. - -- &^ restart RestartAlways + &^ restart RestartAlways -- Expose propellor directory inside the container. & volume (localdir++":"++localdir) -- Name the container in a predictable way so we From cf1bf23d6cbd5a0dfd57de1a91a3eb2eebea93f7 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:46:45 -0400 Subject: [PATCH 37/46] propellor spin From 857fedc06e18ee3a0fc5099ec692812072574437 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:55:41 -0400 Subject: [PATCH 38/46] propellor spin --- config-joey.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config-joey.hs b/config-joey.hs index 9d54b51..992a8b4 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -53,7 +53,7 @@ darkstar = host "darkstar.kitenet.net" & Apt.buildDep ["git-annex"] `period` Daily & Docker.configured ! Docker.docked hosts "android-git-annex" - & Docker.docked hosts "test" + -- & Docker.docked hosts "test" clam :: Host clam = standardSystem "clam.kitenet.net" Unstable "amd64" From b08cd1040f62dd9af340cb793e45d600c5855b08 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:57:13 -0400 Subject: [PATCH 39/46] propellor spin --- config-joey.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config-joey.hs b/config-joey.hs index 992a8b4..9d54b51 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -53,7 +53,7 @@ darkstar = host "darkstar.kitenet.net" & Apt.buildDep ["git-annex"] `period` Daily & Docker.configured ! Docker.docked hosts "android-git-annex" - -- & Docker.docked hosts "test" + & Docker.docked hosts "test" clam :: Host clam = standardSystem "clam.kitenet.net" Unstable "amd64" From 3af3dcb3b50568f64104a10113ec881e9bd89a27 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 11:59:28 -0400 Subject: [PATCH 40/46] propellor spin From 5c480fc9e7279d76e5fe4dbab8b339a71de3bc67 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 12:00:53 -0400 Subject: [PATCH 41/46] propellor spin From 73a75cbefc242133b921fe7314e596ea12bdfbea Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 12:11:07 -0400 Subject: [PATCH 42/46] Fix loop when a docker host that does not exist was docked. The problem is it fell back to looking for an alias for the bad hostname, but to get the aliases, it needs to know which hosts are docked where, so looped. --- debian/changelog | 1 + src/Propellor/Info.hs | 5 ++++- src/Propellor/Property/Docker.hs | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 9e90877..69a580b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,7 @@ propellor (0.9.1) UNRELEASED; urgency=medium * Docker: Add ability to control when containers restart. * Docker: Default to always restarting containers, so they come back up after reboots and docker daemon upgrades. + * Fix loop when a docker host that does not exist was docked. -- Joey Hess Thu, 23 Oct 2014 03:05:22 -0400 diff --git a/src/Propellor/Info.hs b/src/Propellor/Info.hs index 1b89c00..f44d1de 100644 --- a/src/Propellor/Info.hs +++ b/src/Propellor/Info.hs @@ -80,7 +80,10 @@ aliasMap = M.fromList . concat . map (\h -> map (\aka -> (aka, h)) $ S.toList $ _aliases $ hostInfo h) findHost :: [Host] -> HostName -> Maybe Host -findHost l hn = maybe (findAlias l hn) Just (M.lookup hn (hostMap l)) +findHost l hn = maybe (findAlias l hn) Just (findHostNoAlias l hn) + +findHostNoAlias :: [Host] -> HostName -> Maybe Host +findHostNoAlias l hn = M.lookup hn (hostMap l) findAlias :: [Host] -> HostName -> Maybe Host findAlias l hn = M.lookup hn (aliasMap l) diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index b717fe1..c91530c 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -107,7 +107,7 @@ docked hosts cn = RevertableProperty let cid = ContainerId hn cn ensureProperties [findContainer mhost cid cn $ a cid] - mhost = findHost hosts (cn2hn cn) + mhost = findHostNoAlias hosts (cn2hn cn) setup cid (Container image runparams) = provisionContainer cid From 76ad306aaeb30230f9d1356d079be7693908e661 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 12:12:46 -0400 Subject: [PATCH 43/46] propellor spin From f5b5159f76ef20a5dcf190e6f3d92bea8aae69e1 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 12:28:33 -0400 Subject: [PATCH 44/46] don't need RestartPolicy data type; simplify --- src/Propellor/Property/Docker.hs | 37 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs index c91530c..d9d5f19 100644 --- a/src/Propellor/Property/Docker.hs +++ b/src/Propellor/Property/Docker.hs @@ -29,8 +29,9 @@ module Propellor.Property.Docker ( cpuShares, link, ContainerAlias, - restart, - RestartPolicy(..), + restartAlways, + restartOnFailure, + restartNever, -- * Internal use chain, ) where @@ -157,7 +158,7 @@ mkContainer cid@(ContainerId hn _cn) h = Container h' = h -- Restart by default so container comes up on -- boot or when docker is upgraded. - &^ restart RestartAlways + &^ restartAlways -- Expose propellor directory inside the container. & volume (localdir++":"++localdir) -- Name the container in a predictable way so we @@ -279,26 +280,24 @@ link linkwith calias = genProp "link" $ \hn -> -- Each container has its own alias namespace. type ContainerAlias = String --- | Restart policy to apply when a container exits. -restart :: RestartPolicy -> Property -restart policy = runProp "restart" (serialize policy) - where - serialize NoRestart = "no" - serialize (RestartOnFailure Nothing) = "on-failure" - serialize (RestartOnFailure (Just n)) = "on-failure:" ++ show n - serialize RestartAlways = "always" - --- | RestartAlways is the default for docker containers configured by +-- | This property is enabled by default for docker containers configured by -- propellor; as well as keeping badly behaved containers running, -- it ensures that containers get started back up after reboot or -- after docker is upgraded. --- --- NoRestart makes docker not restart a container when it exits +restartAlways :: Property +restartAlways = runProp "restart" "always" + +-- | Docker will restart the container if it exits nonzero. +-- If a number is provided, it will be restarted only up to that many +-- times. +restartOnFailure :: Maybe Int -> Property +restartOnFailure Nothing = runProp "restart" "on-failure" +restartOnFailure (Just n) = runProp "restart" ("on-failure:" ++ show n) + +-- | Makes docker not restart a container when it exits -- Note that this includes not restarting it on boot! --- --- RestartOnFailure will restart the container if it exits nonzero. --- A max-retry value can be provided to prevent too many restarts. -data RestartPolicy = NoRestart | RestartOnFailure (Maybe Int) | RestartAlways +restartNever :: Property +restartNever = runProp "restart" "no" -- | A container is identified by its name, and the host -- on which it's deployed. From 2b320d2bd93cbecd412af48d3bcfa348ba3fe453 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 23 Oct 2014 13:26:51 -0400 Subject: [PATCH 45/46] propellor spin --- src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs index d480e02..901eba2 100644 --- a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs +++ b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs @@ -130,7 +130,7 @@ androidContainer dockerImage name setupgitannexdir gitannexdir = Docker.containe [ "cd " ++ gitannexdir ++ " && ./standalone/android/buildchroot-inchroot" ] haskellpkgsinstalled = userScriptProperty "builder" - [ "cd " ++ gitannexdir ++ " && ./install-haskell-packages" + [ "cd " ++ gitannexdir ++ " && ./standalone/android/install-haskell-packages" ] osver = System (Debian Testing) "i386" -- once jessie is released, use: (Stable "jessie") From b5ab8a7f9fedc283cd561b8a414748ecee3868fd Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 24 Oct 2014 09:57:52 -0400 Subject: [PATCH 46/46] prep release --- config-joey.hs | 1 - debian/changelog | 4 ++-- propellor.cabal | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/config-joey.hs b/config-joey.hs index 9d54b51..fb90651 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -53,7 +53,6 @@ darkstar = host "darkstar.kitenet.net" & Apt.buildDep ["git-annex"] `period` Daily & Docker.configured ! Docker.docked hosts "android-git-annex" - & Docker.docked hosts "test" clam :: Host clam = standardSystem "clam.kitenet.net" Unstable "amd64" diff --git a/debian/changelog b/debian/changelog index 69a580b..c580b3b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,11 +1,11 @@ -propellor (0.9.1) UNRELEASED; urgency=medium +propellor (0.9.1) unstable; urgency=medium * Docker: Add ability to control when containers restart. * Docker: Default to always restarting containers, so they come back up after reboots and docker daemon upgrades. * Fix loop when a docker host that does not exist was docked. - -- Joey Hess Thu, 23 Oct 2014 03:05:22 -0400 + -- Joey Hess Fri, 24 Oct 2014 09:57:31 -0400 propellor (0.9.0) unstable; urgency=medium diff --git a/propellor.cabal b/propellor.cabal index 5843894..282a5e0 100644 --- a/propellor.cabal +++ b/propellor.cabal @@ -1,5 +1,5 @@ Name: propellor -Version: 0.9.0 +Version: 0.9.1 Cabal-Version: >= 1.6 License: BSD3 Maintainer: Joey Hess