Makefile | 12 +- mirrormanager.spec.in | 6 - server/mirrormanager/controllers.py | 118 ++++++++++++++++++-- server/mirrormanager/model.py | 2 server/mirrormanager/schema_updates/update_1_4_0.py | 29 ++++ server/mirrormanager/templates/adminview.kid | 27 +++- server/start-mirrormanager.py | 35 ----- 7 files changed, 163 insertions(+), 66 deletions(-)
New commits: commit 37afb6dec36d647c3a402d302337743df4b6a4e3 Author: Matt Domsch Matt_Domsch@dell.com Date: Sun Oct 31 22:43:28 2010 -0500
fix update_1_4_0 to compile
diff --git a/server/mirrormanager/schema_updates/update_1_4_0.py b/server/mirrormanager/schema_updates/update_1_4_0.py index 362872b..32b96f0 100644 --- a/server/mirrormanager/schema_updates/update_1_4_0.py +++ b/server/mirrormanager/schema_updates/update_1_4_0.py @@ -1,5 +1,5 @@ -from mirrormanager.model import Location, FileGroup, Site -from sqlobject import BoolCol +from mirrormanager.model import Location, FileGroup +from sqlobject import SQLObject, BoolCol, IntCol
# upgrade methodology borrowed from # http://www.mail-archive.com/sqlobject-discuss@lists.sourceforge.net/msg04714... @@ -25,18 +25,18 @@ def update():
if 'email_on_drop' not in OldSite.sqlmeta.columns and \ 'email_on_add' not in OldSite.sqlmeta.columns: - OldSite.addColumn(changeSchema=True, BoolCol("emailOnDrop", default=False)) - OldSite.addColumn(changeSchema=True, BoolCol("emailOnAdd", default=False)) + OldSite.addColumn(BoolCol("emailOnDrop", default=False), changeSchema=True) + OldSite.addColumn(BoolCol("emailOnAdd", default=False), changeSchema=True) for s in OldSite.select(): s.emailOnDrop=False s.emailOnAdd=False
if 'dns_country_host' not in OldHost.sqlmeta.columns: - OldHost.addColumn(changeSchema=True, BoolCol("dnsCountryHost", default=False)) + OldHost.addColumn(BoolCol("dnsCountryHost", default=False), changeSchema=True) for h in OldHost.select(): h.dnsCountryHost = False
if 'sortorder' not in OldVersion.sqlmeta.columns: - OldVersion.addColumn(changeSchema=True, IntCol("sortorder")) + OldVersion.addColumn(IntCol("sortorder"), changeSchema=True) for v in OldVersion.select(): v.sortorder = v.id
commit 120b4bade321f53b5149462b7b2c9faf6d90c7a3 Author: Matt Domsch Matt_Domsch@dell.com Date: Sun Oct 31 22:42:56 2010 -0500
spec: fix changelog order
diff --git a/mirrormanager.spec.in b/mirrormanager.spec.in index ccdc58d..a04ee26 100644 --- a/mirrormanager.spec.in +++ b/mirrormanager.spec.in @@ -152,6 +152,9 @@ Matt Domsch (8): mirrorlist-server: use WSGIDaemonProcess for mirrorlist_client.wsgi mirrormanager.wsgi run 4 instances per app server (up from 2)
+* Mon Oct 26 2009 Matt Domsch mdomsch@fedoraproject.org - 1.3.3-2 +- add patch to fix confirm delete from webui + * Thu Sep 28 2009 Matt Domsch mdomsch@fedoraproject.org - 1.3.3-1 - initial setup patches from BJ Dierkes - simpler mirrormanager.initial, README.rpm_setup, prod.cfg @@ -160,9 +163,6 @@ Matt Domsch (8): * Thu Sep 28 2009 Matt Domsch mdomsch@fedoraproject.org - 1.3.2-1 - add BGP ASN lookups
-* Mon Oct 26 2009 Matt Domsch mdomsch@fedoraproject.org - 1.3.3-2 -- add patch to fix confirm delete from webui - * Fri Sep 18 2009 Matt Domsch mdomsch@fedoraproject.org - 1.3.1-1 - fix publiclist html - fix Host netblock creation via web UI
commit b16b28a93b383031943818c397db5c8a29070986 Author: Matt Domsch Matt_Domsch@dell.com Date: Sun Oct 31 22:42:17 2010 -0500
fix Makefile chdir/cd fix again
diff --git a/Makefile b/Makefile index 78aa713..2a6e53f 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ -RELEASE_DATE := "11-Sep-2010" +RELEASE_DATE := "31-Oct-2010" RELEASE_MAJOR := 1 -RELEASE_MINOR := 3 -RELEASE_EXTRALEVEL := .7 +RELEASE_MINOR := 4 +RELEASE_EXTRALEVEL := .0 RELEASE_NAME := mirrormanager RELEASE_VERSION := $(RELEASE_MAJOR).$(RELEASE_MINOR)$(RELEASE_EXTRALEVEL) RELEASE_STRING := $(RELEASE_NAME)-$(RELEASE_VERSION) @@ -28,7 +28,7 @@ $(RELEASE_PY): sed -e 's/##VERSION##/$(RELEASE_VERSION)/' $(RELEASE_PY).in > $(RELEASE_PY)
prep: $(SPEC) $(RELEASE_PY) - chdir server ; python setup.py egg_info + cd server ; python setup.py egg_info echo 'db_module=mirrormanager.model' > server/mirrormanager.egg-info/sqlobject.txt echo 'history_dir=$$base/mirrormanager/sqlobject-history' >> server/mirrormanager.egg-info/sqlobject.txt sync ; sync ; sync @@ -60,13 +60,13 @@ rpm: tarball $(SPEC) mkdir -p $${tmp_dir}/{BUILD,RPMS,SRPMS,SPECS,SOURCES} ; \ cp $(TARBALL) $${tmp_dir}/SOURCES ; \ cp $(SPEC) $${tmp_dir}/SPECS ; \ - pushd $${tmp_dir} > /dev/null 2>&1; \ + cd $${tmp_dir} > /dev/null 2>&1; \ rpmbuild -ba --define "_topdir $${tmp_dir}" \ --define "_source_filedigest_algorithm 0" \ --define "_binary_filedigest_algorithm 0" \ --define "dist %{nil}" \ SPECS/mirrormanager.spec ; \ - popd > /dev/null 2>&1; \ + cd - > /dev/null 2>&1; \ cp $${tmp_dir}/RPMS/noarch/* $${tmp_dir}/SRPMS/* . ; \ rm -rf $${tmp_dir} ; \ rpmlint *.rpm *.spec
commit d3abedcd63b3acdcc9b46e48bb84a83a8fa3c87c Author: Matt Domsch Matt_Domsch@dell.com Date: Sun Oct 31 21:58:36 2010 -0500
controllers: update Site, Host, SimpleDbObject, add Location and LocationHost controllers
Site: add a 'search' function. Host: add dnsCountryHost field SimpleDbObject: handle tg_errors drop unneeded /0/ from create and new URLs Location and LocationHost: create new controllers
diff --git a/server/mirrormanager/controllers.py b/server/mirrormanager/controllers.py index e0f7fd9..12ea1e9 100644 --- a/server/mirrormanager/controllers.py +++ b/server/mirrormanager/controllers.py @@ -170,6 +170,13 @@ class SiteController(controllers.Controller, identity.SecureResource, content): site.del_downstream_site(dsite) raise turbogears.redirect("/site/%s" % site.id)
+ @expose(format='json') + def search(self, name): + """Called by the LocationHost controller AutoCompleteWidget.""" + if not name: return dict() + results = Site.select(LIKE(Site.q.name, "%"+name+"%")) + sites = [ s.name for s in results ] + return dict(sites=sites)
############################################## class SiteAdminFields(widgets.WidgetsList): @@ -314,6 +321,7 @@ class HostFields(widgets.WidgetsList): asn = widgets.TextField("asn", label="ASN", default='', validator=validators.Int, help_text="Autonomous System Number, used in BGP routing tables.") asn_clients = widgets.CheckBox('asn_clients', label="ASN Clients?", default=True, help_text="Serve all clients from the same ASN. Used for ISPs, companies, or schools, not personal networks.") robot_email = widgets.TextField(validator=validators.All(validators.UnicodeString,validators.Email), help_text="email address, will receive notice of upstream content updates") + dnsCountryHost = widgets.CheckBox(help_text="use host in <country-code>.<domain> DNS entries") comment = widgets.TextField(validator=validators.Any(validators.UnicodeString, validators.Empty), help_text="text, anything else you'd like a public end user to know about your mirror")
host_form = widgets.TableForm(fields=HostFields(), @@ -326,6 +334,7 @@ class HostController(controllers.Controller, identity.SecureResource, content): disabled_fields = [] if not identity.in_group(admin_group): disabled_fields.append('admin_active') + disabled_fields.append('dnsCountryHost')
if host is not None: site = host.my_site() @@ -805,22 +814,24 @@ class SimpleDbObjectController(controllers.Controller, identity.SecureResource, myClass = None url_prefix=None
- def get(self, id): + def get(self, id, tg_errors=None): v = self.myClass.get(id) return dict(values=v)
@expose(template="mirrormanager.templates.boringform") - def new(self, **kwargs): + def new(self, tg_errors=None, **kwargs):
- submit_action = "/%s/0/create" % self.url_prefix + submit_action = "/%s/create" % self.url_prefix return dict(form=self.form, values=None, action=submit_action, page_title=self.page_title)
- def create(self, **kwargs): + + def create(self, tg_errors=None, **kwargs): try: obj = self.myClass(**kwargs) - except: # probably sqlite IntegrityError but we can't catch that for some reason... - turbogears.flash("Error: Object already exists") - raise redirect("/%s/0/new" % self.url_prefix) + except: + if tg_errors is not None: + turbogears.flash("Error: %s" % createErrorString(tg_errors)) + raise redirect("/%s/new" % self.url_prefix) turbogears.flash("Success: Object created.") turbogears.redirect("/adminview")
@@ -829,14 +840,17 @@ class SimpleDbObjectController(controllers.Controller, identity.SecureResource, submit_action = "/%s/%s/update" % (self.url_prefix, obj.id) return dict(form=self.form, values=obj, action=submit_action, page_title=self.page_title)
- def update(self, obj, **kwargs): + def update(self, obj, tg_errors=None, **kwargs): + if tg_errors is not None: + turbogears.flash("Error: %s" % createErrorString(tg_errors)) + raise redirect("/adminview") obj.set(**kwargs) obj.sync() submit_action = "/%s/%s/update" % (self.url_prefix, obj.id) return dict(form=self.form, values=obj, action=submit_action, page_title=self.page_title)
@expose(template="mirrormanager.templates.boringdeleteform") - def delete(self, obj, **kwargs): + def delete(self, obj, tg_errors=None, **kwargs): confirmed = kwargs.get('confirmed', None) confirm_delete_form = widgets.TableForm(fields=ConfirmDeleteFields(), submit_text="Yes, really delete it!") if confirmed: @@ -1047,6 +1061,90 @@ class CountryContinentRedirectController(SimpleDbObjectController): def update(self, obj, **kwargs): return SimpleDbObjectController.update(self, obj, **kwargs)
+######################################################### +# Location +######################################################### +class LocationFields(widgets.WidgetsList): + name = widgets.TextField(validator=validators.All(validators.NotEmpty, validators.UnicodeString), label="Location Name") + +location_form = widgets.TableForm(fields=LocationFields(), submit_text="Create Location") + +class LocationController(SimpleDbObjectController): + page_title = "Location" + myClass = Location + url_prefix="location" + form = location_form + + @expose(template="mirrormanager.templates.boringform") + @validate(form=form) + @error_handler(SimpleDbObjectController.new) + def create(self, tg_errors=None, **kwargs): + SimpleDbObjectController.create(self, tg_errors, **kwargs) + + @expose(template="mirrormanager.templates.boringform") + @validate(form=form) + @error_handler() + def update(self, obj, tg_errors=None, **kwargs): + return SimpleDbObjectController.update(self, obj, tg_errors, **kwargs) + + @expose(template="mirrormanager.templates.boringdeleteform") + def delete(self, obj, tg_errors=None, **kwargs): + confirmed = kwargs.get('confirmed', None) + confirm_delete_form = widgets.TableForm(fields=ConfirmDeleteFields(), submit_text="Yes, really delete it!") + if confirmed: + turbogears.flash("%s has been deleted." % obj.name) + obj.destroySelf() + turbogears.redirect("/adminview") + else: + form = confirm_delete_form + page_title = "Item Deletion" + submit_action = "/%s/%s/delete?confirmed=1" % (self.url_prefix, obj.id) + return dict(form=form, values=obj, action=submit_action, page_title=page_title) + + +######################################################### +# LocationHosts +######################################################### +class LocationHostFields(widgets.WidgetsList): + locationName = widgets.Label(label="Location Name") + siteName = widgets.AutoCompleteField(label="Site Name", + search_controller=tg.url('/site/search'), + search_param='name', result_name='sites', + validator=validators.AutoCompleteValidator()) + +location_host_form = widgets.TableForm(fields=LocationHostFields(), submit_text="Create Location / Host Mapping") + +class LocationHostController(SimpleDbObjectController): + page_title = "Location / Host" + myClass = Location + url_prefix="locationhosts" + form = location_host_form + + @expose(template="mirrormanager.templates.boringform") + @validate(form=form) + @error_handler(SimpleDbObjectController.new) + def create(self, tg_errors=None, **kwargs): + SimpleDbObjectController.create(self, tg_errors, **kwargs) + + @expose(template="mirrormanager.templates.boringform") + @validate(form=form) + @error_handler() + def update(self, obj, tg_errors=None, **kwargs): + return SimpleDbObjectController.update(self, obj, tg_errors, **kwargs) + + @expose(template="mirrormanager.templates.boringdeleteform") + def delete(self, obj, tg_errors=None, **kwargs): + confirmed = kwargs.get('confirmed', None) + confirm_delete_form = widgets.TableForm(fields=ConfirmDeleteFields(), submit_text="Yes, really delete it!") + if confirmed: + turbogears.flash("%s has been deleted." % obj.name) + obj.destroySelf() + turbogears.redirect("/adminview") + else: + form = confirm_delete_form + page_title = "Item Deletion" + submit_action = "/%s/%s/delete?confirmed=1" % (self.url_prefix, obj.id) + return dict(form=form, values=obj, action=submit_action, page_title=page_title)
@@ -1071,6 +1169,7 @@ class Root(controllers.RootController): repository = RepositoryController() repository_redirect = RepositoryRedirectController() country_continent_redirect = CountryContinentRedirectController() + location = LocationController() from mirrormanager.xmlrpc import XmlrpcController xmlrpc = XmlrpcController()
@@ -1106,6 +1205,7 @@ class Root(controllers.RootController): "netblocks":HostNetblock.select(orderBy='host_id'), "repository_redirects":RepositoryRedirect.select(orderBy='fromRepo'), "country_continent_redirects":CountryContinentRedirect.select(orderBy='country'), + "locations":Location.select(orderBy='name'), }
@expose(template="mirrormanager.templates.rsync_acl", format="plain", content_type="text/plain")
commit 6266d222dd1a5492e036fc97a843a57a6790e3e0 Author: Matt Domsch Matt_Domsch@dell.com Date: Sun Oct 31 21:57:30 2010 -0500
adminview: add [Add] buttons to object types
diff --git a/server/mirrormanager/templates/adminview.kid b/server/mirrormanager/templates/adminview.kid index e7be89c..c559d9d 100644 --- a/server/mirrormanager/templates/adminview.kid +++ b/server/mirrormanager/templates/adminview.kid @@ -26,8 +26,7 @@ Nothing to see here, move along. </ul> </div> <div id="Arches"> -<h3>Arches</h3> -<a href="${tg.url('/arch/0/new')}">[Add]</a> +<h3>Arches <a href="${tg.url('/arch/0/new')}">[Add]</a></h3>
<ul> <li py:for="arch in arches"> @@ -36,8 +35,7 @@ Nothing to see here, move along. </ul> </div> <div id="Products"> -<h3>Products</h3> -<a href="${tg.url('/product/0/new')}">[Add]</a> +<h3>Products <a href="${tg.url('/product/0/new')}">[Add]</a></h3> <ul> <li py:for="p in products"> <span py:replace="p.name">Product</span> <a href="${tg.url('/product/'+str(p.id)+'/delete')}">[Delete]</a> @@ -45,8 +43,7 @@ Nothing to see here, move along. </ul> </div> <div id="Versions"> -<h3>Versions</h3> -<a href="${tg.url('/version/0/new')}">[Add]</a> +<h3>Versions <a href="${tg.url('/version/0/new')}">[Add]</a></h3> <ul> <li py:for="v in versions"> <a href="${tg.url('/version/'+str(v.id)+'/')}"> @@ -77,8 +74,7 @@ Nothing to see here, move along. </ul> </div> <div id="Embargoed Countries"> -<h3>Embargoed Counries</h3> -<a href="${tg.url('/embargoed_country/0/new')}">[Add]</a> +<h3>Embargoed Counries <a href="${tg.url('/embargoed_country/0/new')}">[Add]</a></h3> <ul> <li py:for="cc in embargoed_countries"> <span py:replace="cc.country_code">Country Code</span> <a href="${tg.url('/embargoed_country/'+str(cc.id)+'/delete')}">[Delete]</a> @@ -112,6 +108,21 @@ Nothing to see here, move along. </li> </ul> </div> +<div id="Locations"> +<h3>Locations <a href="${tg.url('/location/new')}">[Add]</a></h3> +<ul> + <li py:for="l in locations"> <a href="${tg.url('/location/'+str(l.id)+'/')}"><span py:replace="l.name">Location</span></a> + <a href="${tg.url('/location/%s/delete' % (l.id))}">[Delete]</a> + + <UL> + <li py:for="h in l.hosts"> + <a href="${tg.url('/host/' + str(h.id))}"><span py:replace="h.name">Host name</span></a> + <a href="${tg.url('/location/%s/%s/delete' % (l.id,h.id))}">[Delete]</a> + </li> + </UL> + </li> +</ul> +</div> </div> </body> </html>
commit 4ff484ce766bee63258ae2ff4f3b454ff961787d Author: Matt Domsch Matt_Domsch@dell.com Date: Sun Oct 31 21:47:27 2010 -0500
SCHEMA CHANGE: add Version.sortorder and Host.dnsCountryHost
diff --git a/server/mirrormanager/model.py b/server/mirrormanager/model.py index b1fb792..ec02c2f 100644 --- a/server/mirrormanager/model.py +++ b/server/mirrormanager/model.py @@ -191,6 +191,7 @@ class Host(SQLObject): internet2_clients = BoolCol(default=False) asn = IntCol(default=None) asn_clients = BoolCol(default=True) + dnsCountryHost = BoolCol(default=False) countries_allowed = MultipleJoin('HostCountryAllowed') netblocks = MultipleJoin('HostNetblock', orderBy='netblock') acl_ips = MultipleJoin('HostAclIp', orderBy='ip') @@ -637,6 +638,7 @@ class Version(SQLObject): display = BoolCol(default=True) display_name = UnicodeCol(default=None) ordered_mirrorlist = BoolCol(default=True) + sortorder = IntCol()
class Directory(SQLObject): diff --git a/server/mirrormanager/schema_updates/update_1_4_0.py b/server/mirrormanager/schema_updates/update_1_4_0.py index cc9f074..362872b 100644 --- a/server/mirrormanager/schema_updates/update_1_4_0.py +++ b/server/mirrormanager/schema_updates/update_1_4_0.py @@ -9,6 +9,15 @@ class OldSite(SQLObject): fromDatabase = True table = 'site'
+class OldHost(SQLObject): + class sqlmeta: + fromDatabase = True + table = 'host' + +class OldVersion(SQLObject): + class sqlmeta: + fromDatabase = True + table = 'version'
def update(): Location.createTable(ifNotExists=True) @@ -18,6 +27,16 @@ def update(): 'email_on_add' not in OldSite.sqlmeta.columns: OldSite.addColumn(changeSchema=True, BoolCol("emailOnDrop", default=False)) OldSite.addColumn(changeSchema=True, BoolCol("emailOnAdd", default=False)) - for s in Site.select(): + for s in OldSite.select(): s.emailOnDrop=False s.emailOnAdd=False + + if 'dns_country_host' not in OldHost.sqlmeta.columns: + OldHost.addColumn(changeSchema=True, BoolCol("dnsCountryHost", default=False)) + for h in OldHost.select(): + h.dnsCountryHost = False + + if 'sortorder' not in OldVersion.sqlmeta.columns: + OldVersion.addColumn(changeSchema=True, IntCol("sortorder")) + for v in OldVersion.select(): + v.sortorder = v.id
commit 31c955cf8e4485b505f51c5a38b6f7292ac5c33d Author: Matt Domsch Matt_Domsch@dell.com Date: Sun Oct 31 21:46:35 2010 -0500
remove start-mirrormanager.py, use mirrormanager.wsgi instead
diff --git a/server/start-mirrormanager.py b/server/start-mirrormanager.py deleted file mode 100755 index 5b32f84..0000000 --- a/server/start-mirrormanager.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/python -__requires__ = 'TurboGears[future]' -import pkg_resources -pkg_resources.require("TurboGears") - -import turbogears -from turbogears import startup - -import cherrypy -cherrypy.lowercase_api = True - -from os.path import * -import sys -from fedora.tg.util import enable_csrf - -# first look on the command line for a desired config file, -# if it's not on the command line, then -# look for setup.py in this directory. If it's not there, this script is -# probably installed -if len(sys.argv) > 1: - turbogears.update_config(configfile=sys.argv[1], - modulename="mirrormanager.config") -elif exists(join(dirname(__file__), "setup.py")): - turbogears.update_config(configfile="dev.cfg", - modulename="mirrormanager.config") -else: - turbogears.update_config(configfile="prod.cfg", - modulename="mirrormanager.config") - -startup.call_on_startup.append(enable_csrf) - -from mirrormanager.controllers import Root -import mirrormanager.mirrorlist - -turbogears.start_server(Root())
mirrormanager-commits@lists.fedorahosted.org