diff --git a/test/manage.py b/test/manage.py new file mode 100644 index 0000000..d41a202 --- /dev/null +++ b/test/manage.py @@ -0,0 +1,4 @@ +#!/usr/bin/python +from migrate.versioning.shell import main + +main(url='postgres://jan:heyyou97@localhost:5432/jan',repository='ormaptest_repo') diff --git a/test/ormaptest.py b/test/ormaptest.py new file mode 100644 index 0000000..c516d2e --- /dev/null +++ b/test/ormaptest.py @@ -0,0 +1,32 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +from sqlalchemy import * + +meta = BoundMetaData('postgres://jan:heyyou97@localhost:5432/jan') +domains_table = Table('domains', meta, autoload=True) +records_table = Table('records', meta, autoload=True) + +class Domain(object): + def __repr__(self): + return "%s(%r,%r)" % ( + self.__class__.__name__, self.id, self.name) + +class Record(object): + def __repr__(self): + return "%s(%r,%r,%r)" % ( + self.__class__.__name__, self.id, self.domain_id, self.domain) + +recordmapper = mapper(Record, records_table) +domainmapper = mapper(Domain, domains_table, properties = { + 'records': relation(Record, backref='domain') + }) + +session = create_session() +query = session.query(Domain) + +domain = query.get_by(name='dittberner.info') +if domain: + print domain.records + +session.flush() diff --git a/test/ormaptest_repo/README b/test/ormaptest_repo/README new file mode 100644 index 0000000..c698f65 --- /dev/null +++ b/test/ormaptest_repo/README @@ -0,0 +1,4 @@ +This is a database migration repository. + +More information at +http://trac.erosson.com/migrate diff --git a/test/ormaptest_repo/__init__.py b/test/ormaptest_repo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/ormaptest_repo/manage.py b/test/ormaptest_repo/manage.py new file mode 100644 index 0000000..07fc07a --- /dev/null +++ b/test/ormaptest_repo/manage.py @@ -0,0 +1,4 @@ +#!/usr/bin/python +from migrate.versioning.shell import main + +main(repository='ormaptest_repo') diff --git a/test/ormaptest_repo/migrate.cfg b/test/ormaptest_repo/migrate.cfg new file mode 100644 index 0000000..2fd5f29 --- /dev/null +++ b/test/ormaptest_repo/migrate.cfg @@ -0,0 +1,20 @@ +[db_settings] +# Used to identify which repository this database is versioned under. +# You can use the name of your project. +repository_id=OR Mapping Test + +# The name of the database table used to track the schema version. +# This name shouldn't already be used by your project. +# If this is changed once a database is under version control, you'll need to +# change the table name in each database too. +version_table=migrate_version + +# When committing a change script, Migrate will attempt to generate the +# sql for all supported databases; normally, if one of them fails - probably +# because you don't have that database installed - it is ignored and the +# commit continues, perhaps ending successfully. +# Databases in this list MUST compile successfully during a commit, or the +# entire commit will fail. List the databases your application will actually +# be using to ensure your updates to that database work properly. +# This must be a list; example: ['postgres','sqlite'] +required_dbs=[] diff --git a/test/ormaptest_repo/versions/1/1.py b/test/ormaptest_repo/versions/1/1.py new file mode 100644 index 0000000..932d025 --- /dev/null +++ b/test/ormaptest_repo/versions/1/1.py @@ -0,0 +1,14 @@ +from sqlalchemy import * +from migrate import * + +meta = BoundMetaData(migrate_engine) +account = Table('account', meta, + Column('id', Integer, primary_key=True), + Column('login', String(40)), + Column('passwd', String(40))) + +def upgrade(): + account.create() + +def downgrade(): + account.drop() diff --git a/test/ormaptest_repo/versions/2/2.py b/test/ormaptest_repo/versions/2/2.py new file mode 100644 index 0000000..675e033 --- /dev/null +++ b/test/ormaptest_repo/versions/2/2.py @@ -0,0 +1,11 @@ +from sqlalchemy import * +from migrate import * + +meta = BoundMetaData(migrate_engine) +account = Table('account', meta) + +def upgrade(): + account.drop() + +def downgrade(): + account.create() diff --git a/test/ormaptest_repo/versions/3/3.py b/test/ormaptest_repo/versions/3/3.py new file mode 100644 index 0000000..8d41742 --- /dev/null +++ b/test/ormaptest_repo/versions/3/3.py @@ -0,0 +1,45 @@ +from sqlalchemy import * +from migrate import * + +meta = BoundMetaData(migrate_engine) +supermasters = Table('supermasters', meta, + Column('ip', String(25), nullable=False), + Column('nameserver', String(255), nullable=False), + Column('account', String(40)), +) +domains = Table('domains', meta, + Column('id', Integer, primary_key=True), + Column('name', String(255), nullable=False), + Column('master', String(20)), + Column('last_check', Integer), + Column('type', String(6), nullable=False), + Column('notified_serial', Integer), + Column('account', String(40)), + UniqueConstraint('name', name='name_index') +) + +records = Table('records', meta, + Column('id', Integer, primary_key=True), + Column('domain_id', Integer), + Column('name', String(255)), + Column('type', String(6)), + Column('content', String(255)), + Column('ttl', Integer), + Column('prio', Integer), + Column('change_date', Integer), + ForeignKeyConstraint(['domain_id'], ['domains.id'], + ondelete='CASCADE', name='domain_exists') +) +Index('domain_id', records.c.domain_id) +Index('nametype_index', records.c.name, records.c.type) +Index('rec_name_index', records.c.name) + +def upgrade(): + supermasters.create() + domains.create() + records.create() + +def downgrade(): + records.drop() + domains.drop() + supermasters.drop() diff --git a/test/ormaptest_repo/versions/__init__.py b/test/ormaptest_repo/versions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/test.sql b/test/test.sql new file mode 100644 index 0000000..0c6806b --- /dev/null +++ b/test/test.sql @@ -0,0 +1,293 @@ +-- +-- Data for Name: domains; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY domains (id, name, master, last_check, "type", notified_serial, account) FROM stdin; +3 artist-michael.de \N \N MASTER 2005081501 \N +4 blumendeko-wiebach.de \N \N MASTER 2005081701 \N +5 cblicht.de \N \N MASTER 2006031901 \N +6 centrum-warenhaus-dresden.de \N \N MASTER 2005090301 \N +7 dancewarriors.de \N \N MASTER 2005081701 \N +9 douth-hiphop.de \N \N MASTER 2005081701 \N +10 efs-sohland.de \N \N MASTER 2005092001 \N +11 ferien-am-stausee.de \N \N MASTER 2005081701 \N +12 frank-schmidt-online.de \N \N MASTER 2006091901 \N +13 freie-musikschule-sohland.de \N \N MASTER 2005081701 \N +14 hondaracingclub.de \N \N MASTER 2005081701 \N +15 jesusgemeindesohland.de \N \N MASTER 2006031901 \N +16 jugendwoche2006.de \N \N MASTER 2006051701 \N +17 katja-schumann.de \N \N MASTER 2006031901 \N +18 ortodontia.de \N \N MASTER 2005101702 \N +19 ostmodern.org \N \N MASTER 2006022001 \N +20 peschel-maler.de \N \N MASTER 2006112800 \N +21 purity-now.de \N \N MASTER 2006083001 \N +22 regionalverkehr.net \N \N MASTER 2005121201 \N +23 rundkino-dresden.de \N \N MASTER 2006112400 \N +24 scheune-sohland.de \N \N MASTER 2006030102 \N +25 spare-beatz.de \N \N MASTER 2005090501 \N +26 tntlive.de \N \N MASTER 2006100401 \N +27 wagner-sound.de \N \N MASTER 2005081701 \N +28 winproject.de \N \N MASTER 2006100302 \N +29 zahnspange-schubert.de \N \N MASTER 2005101702 \N +1 jan-dittberner.de \N \N MASTER 2006031902 \N +8 dittberner.info \N \N MASTER 0 \N +2 gnuviech-server.de \N \N MASTER 2007010301 \N +\. + + +-- +-- Data for Name: records; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY records (id, domain_id, name, "type", content, ttl, prio, change_date) FROM stdin; +1 1 jan-dittberner.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006031902 10000 7200 1209600 86400 86400 0 \N +2 1 jan-dittberner.de NS ns1.gnuviech-server.de 86400 0 \N +3 1 jan-dittberner.de NS ns10.schlundtech.de 86400 0 \N +4 1 jan-dittberner.de A 81.169.155.87 86400 0 \N +5 1 jan-dittberner.de MX gnuviech.info 86400 5 \N +6 1 jan-dittberner.de TXT v=spf1 a mx 86400 0 \N +7 1 *.jan-dittberner.de CNAME www.jan-dittberner.de 86400 0 \N +8 1 www.jan-dittberner.de A 81.169.155.87 86400 0 \N +10 2 gnuviech-server.de NS ns1.gnuviech-server.de 86400 0 \N +11 2 gnuviech-server.de NS ns10.schlundtech.de 86400 0 \N +12 2 gnuviech-server.de A 81.169.155.87 86400 0 \N +13 2 gnuviech-server.de MX gnuviech.info 86400 5 \N +14 2 gnuviech-server.de TXT v=spf1 a mx 86400 0 \N +19 2 shell.gnuviech-server.de A 88.198.45.203 86400 0 \N +15 2 ns1.gnuviech-server.de A 88.198.120.250 86400 0 \N +21 3 artist-michael.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005081501 86400 7200 1209600 86400 86400 0 \N +22 3 artist-michael.de NS ns1.gnuviech-server.de 86400 0 \N +23 3 artist-michael.de NS ns10.schlundtech.de 86400 0 \N +24 3 artist-michael.de A 81.169.155.87 86400 0 \N +25 3 artist-michael.de MX gnuviech.info 86400 5 \N +26 3 artist-michael.de TXT v=spf1 a mx 86400 0 \N +27 3 www.artist-michael.de A 81.169.155.87 86400 0 \N +28 3 *.artist-michael.de CNAME www.artist-michael.de 86400 0 \N +29 4 blumendeko-wiebach.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005081701 86400 7200 1209600 86400 86400 0 \N +30 4 blumendeko-wiebach.de NS ns1.gnuviech-server.de 86400 0 \N +31 4 blumendeko-wiebach.de NS ns10.schlundtech.de 86400 0 \N +32 4 blumendeko-wiebach.de A 81.169.155.87 86400 0 \N +33 4 blumendeko-wiebach.de MX gnuviech.info 86400 5 \N +34 4 blumendeko-wiebach.de TXT v=spf1 a mx 86400 0 \N +35 4 www.blumendeko-wiebach.de A 81.169.155.87 86400 0 \N +36 4 *.blumendeko-wiebach.de CNAME www.blumendeko-wiebach.de 86400 0 \N +37 5 cblicht.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006031901 86400 7200 1209600 86400 86400 0 \N +38 5 cblicht.de NS ns1.gnuviech-server.de 86400 0 \N +39 5 cblicht.de NS ns10.schlundtech.de 86400 0 \N +40 5 cblicht.de A 81.169.155.87 86400 0 \N +41 5 cblicht.de MX gnuviech.info 86400 5 \N +42 5 cblicht.de TXT v=spf1 a mx 86400 0 \N +43 5 www.cblicht.de A 81.169.155.87 86400 0 \N +44 5 *.cblicht.de CNAME www.cblicht.de 86400 0 \N +45 6 centrum-warenhaus-dresden.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005090301 86400 7200 1209600 86400 86400 0 \N +46 6 centrum-warenhaus-dresden.de NS ns1.gnuviech-server.de 86400 0 \N +47 6 centrum-warenhaus-dresden.de NS ns10.schlundtech.de 86400 0 \N +48 6 centrum-warenhaus-dresden.de A 81.169.155.87 86400 0 \N +49 6 centrum-warenhaus-dresden.de MX gnuviech.info 86400 5 \N +50 6 centrum-warenhaus-dresden.de TXT v=spf1 a mx 86400 0 \N +51 6 www.centrum-warenhaus-dresden.de A 81.169.155.87 86400 0 \N +52 6 *.centrum-warenhaus-dresden.de CNAME www.centrum-warenhaus-dresden.de 86400 0 \N +53 7 dancewarriors.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005081701 86400 7200 1209600 86400 86400 0 \N +54 7 dancewarriors.de NS ns1.gnuviech-server.de 86400 0 \N +55 7 dancewarriors.de NS ns10.schlundtech.de 86400 0 \N +56 7 dancewarriors.de A 81.169.155.87 86400 0 \N +57 7 dancewarriors.de MX gnuviech.info 86400 5 \N +58 7 dancewarriors.de TXT v=spf1 a mx 86400 0 \N +59 7 www.dancewarriors.de A 81.169.155.87 86400 0 \N +60 7 *.dancewarriors.de CNAME www.dancewarriors.de 86400 0 \N +70 9 douth-hiphop.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005081701 86400 7200 1209600 86400 86400 0 \N +71 9 douth-hiphop.de NS ns1.gnuviech-server.de 86400 0 \N +72 9 douth-hiphop.de NS ns10.schlundtech.de 86400 0 \N +73 9 douth-hiphop.de A 81.169.155.87 86400 0 \N +74 9 douth-hiphop.de MX gnuviech.info 86400 5 \N +75 9 douth-hiphop.de TXT v=spf1 a mx 86400 0 \N +76 9 www.douth-hiphop.de A 81.169.155.87 86400 0 \N +77 9 *.douth-hiphop.de CNAME www.douth-hiphop.de 86400 0 \N +78 10 efs-sohland.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005092001 86400 7200 1209600 86400 86400 0 \N +79 10 efs-sohland.de NS ns1.gnuviech-server.de 86400 0 \N +80 10 efs-sohland.de NS ns10.schlundtech.de 86400 0 \N +81 10 efs-sohland.de A 81.169.155.87 86400 0 \N +82 10 efs-sohland.de MX gnuviech.info 86400 5 \N +83 10 efs-sohland.de TXT v=spf1 a mx 86400 0 \N +84 10 www.efs-sohland.de A 81.169.155.87 86400 0 \N +85 10 *.efs-sohland.de CNAME www.efs-sohland.de 86400 0 \N +86 11 ferien-am-stausee.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005081701 86400 7200 1209600 86400 86400 0 \N +87 11 ferien-am-stausee.de NS ns1.gnuviech-server.de 86400 0 \N +88 11 ferien-am-stausee.de NS ns10.schlundtech.de 86400 0 \N +89 11 ferien-am-stausee.de A 81.169.155.87 86400 0 \N +90 11 ferien-am-stausee.de MX gnuviech.info 86400 5 \N +91 11 ferien-am-stausee.de TXT v=spf1 a mx 86400 0 \N +92 11 www.ferien-am-stausee.de A 81.169.155.87 86400 0 \N +93 11 *.ferien-am-stausee.de CNAME www.ferien-am-stausee.de 86400 0 \N +94 12 frank-schmidt-online.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006091901 86400 7200 1209600 86400 86400 0 \N +95 12 frank-schmidt-online.de NS ns1.gnuviech-server.de 86400 0 \N +96 12 frank-schmidt-online.de NS ns10.schlundtech.de 86400 0 \N +97 12 frank-schmidt-online.de A 81.169.155.87 86400 0 \N +98 12 frank-schmidt-online.de MX gnuviech.info 86400 5 \N +99 12 frank-schmidt-online.de TXT v=spf1 a mx 86400 0 \N +100 12 www.frank-schmidt-online.de A 81.169.155.87 86400 0 \N +101 12 *.frank-schmidt-online.de CNAME www.frank-schmidt-online.de 86400 0 \N +102 13 freie-musikschule-sohland.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005081701 86400 7200 1209600 86400 86400 0 \N +103 13 freie-musikschule-sohland.de NS ns1.gnuviech-server.de 86400 0 \N +104 13 freie-musikschule-sohland.de NS ns10.schlundtech.de 86400 0 \N +105 13 freie-musikschule-sohland.de A 81.169.155.87 86400 0 \N +106 13 freie-musikschule-sohland.de MX gnuviech.info 86400 5 \N +107 13 freie-musikschule-sohland.de TXT v=spf1 a mx 86400 0 \N +108 13 www.freie-musikschule-sohland.de A 81.169.155.87 86400 0 \N +109 13 *.freie-musikschule-sohland.de CNAME www.freie-musikschule-sohland.de 86400 0 \N +110 14 hondaracingclub.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005081701 86400 7200 1209600 86400 86400 0 \N +111 14 hondaracingclub.de NS ns1.gnuviech-server.de 86400 0 \N +112 14 hondaracingclub.de NS ns10.schlundtech.de 86400 0 \N +113 14 hondaracingclub.de A 81.169.155.87 86400 0 \N +114 14 hondaracingclub.de MX gnuviech.info 86400 5 \N +115 14 hondaracingclub.de TXT v=spf1 a mx 86400 0 \N +116 14 www.hondaracingclub.de A 81.169.155.87 86400 0 \N +117 14 *.hondaracingclub.de CNAME www.hondaracingclub.de 86400 0 \N +118 15 jesusgemeindesohland.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006031901 86400 7200 1209600 86400 86400 0 \N +119 15 jesusgemeindesohland.de NS ns1.gnuviech-server.de 86400 0 \N +120 15 jesusgemeindesohland.de NS ns10.schlundtech.de 86400 0 \N +121 15 jesusgemeindesohland.de A 81.169.155.87 86400 0 \N +122 15 jesusgemeindesohland.de MX gnuviech.info 86400 5 \N +123 15 jesusgemeindesohland.de TXT v=spf1 a mx 86400 0 \N +124 15 www.jesusgemeindesohland.de A 81.169.155.87 86400 0 \N +125 15 *.jesusgemeindesohland.de CNAME www.jesusgemeindesohland.de 86400 0 \N +126 16 jugendwoche2006.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006051701 86400 7200 1209600 86400 86400 0 \N +127 16 jugendwoche2006.de NS ns1.gnuviech-server.de 86400 0 \N +128 16 jugendwoche2006.de NS ns10.schlundtech.de 86400 0 \N +129 16 jugendwoche2006.de A 81.169.155.87 86400 0 \N +130 16 jugendwoche2006.de MX gnuviech.info 86400 5 \N +131 16 jugendwoche2006.de TXT v=spf1 a mx 86400 0 \N +132 16 www.jugendwoche2006.de A 81.169.155.87 86400 0 \N +133 16 *.jugendwoche2006.de CNAME www.jugendwoche2006.de 86400 0 \N +134 17 katja-schumann.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006031901 86400 7200 1209600 86400 86400 0 \N +135 17 katja-schumann.de NS ns1.gnuviech-server.de 86400 0 \N +136 17 katja-schumann.de NS ns10.schlundtech.de 86400 0 \N +137 17 katja-schumann.de A 81.169.155.87 86400 0 \N +138 17 katja-schumann.de MX gnuviech.info 86400 5 \N +139 17 katja-schumann.de TXT v=spf1 a mx 86400 0 \N +140 17 www.katja-schumann.de A 81.169.155.87 86400 0 \N +141 17 *.katja-schumann.de CNAME www.katja-schumann.de 86400 0 \N +142 18 ortodontia.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005101702 86400 7200 1209600 86400 86400 0 \N +143 18 ortodontia.de NS ns1.gnuviech-server.de 86400 0 \N +144 18 ortodontia.de NS ns10.schlundtech.de 86400 0 \N +145 18 ortodontia.de A 81.169.155.87 86400 0 \N +146 18 ortodontia.de MX gnuviech.info 86400 5 \N +147 18 ortodontia.de TXT v=spf1 a mx 86400 0 \N +148 18 www.ortodontia.de A 81.169.155.87 86400 0 \N +149 18 *.ortodontia.de CNAME www.ortodontia.de 86400 0 \N +150 19 ostmodern.org SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006022001 86400 7200 1209600 86400 86400 0 \N +151 19 ostmodern.org NS ns1.gnuviech-server.de 86400 0 \N +152 19 ostmodern.org NS ns10.schlundtech.de 86400 0 \N +153 19 ostmodern.org A 81.169.155.87 86400 0 \N +154 19 ostmodern.org MX gnuviech.info 86400 5 \N +155 19 ostmodern.org TXT v=spf1 a mx 86400 0 \N +156 19 www.ostmodern.org A 81.169.155.87 86400 0 \N +157 19 *.ostmodern.org CNAME www.ostmodern.org 86400 0 \N +158 20 peschel-maler.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006112800 86400 7200 1209600 86400 86400 0 \N +159 20 peschel-maler.de NS ns1.gnuviech-server.de 86400 0 \N +160 20 peschel-maler.de NS ns10.schlundtech.de 86400 0 \N +161 20 peschel-maler.de A 81.169.155.87 86400 0 \N +162 20 peschel-maler.de MX gnuviech.info 86400 5 \N +163 20 peschel-maler.de TXT v=spf1 a mx 86400 0 \N +164 20 www.peschel-maler.de A 81.169.155.87 86400 0 \N +165 20 *.peschel-maler.de CNAME www.peschel-maler.de 86400 0 \N +166 21 purity-now.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006083001 86400 7200 1209600 86400 86400 0 \N +167 21 purity-now.de NS ns1.gnuviech-server.de 86400 0 \N +168 21 purity-now.de NS ns10.schlundtech.de 86400 0 \N +169 21 purity-now.de A 81.169.155.87 86400 0 \N +170 21 purity-now.de MX gnuviech.info 86400 5 \N +171 21 purity-now.de TXT v=spf1 a mx 86400 0 \N +172 21 www.purity-now.de A 81.169.155.87 86400 0 \N +173 21 *.purity-now.de CNAME www.purity-now.de 86400 0 \N +174 22 regionalverkehr.net SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005121201 86400 7200 1209600 86400 86400 0 \N +175 22 regionalverkehr.net NS ns1.gnuviech-server.de 86400 0 \N +176 22 regionalverkehr.net NS ns10.schlundtech.de 86400 0 \N +177 22 regionalverkehr.net A 81.169.155.87 86400 0 \N +178 22 regionalverkehr.net MX gnuviech.info 86400 5 \N +179 22 regionalverkehr.net TXT v=spf1 a mx 86400 0 \N +180 22 www.regionalverkehr.net A 81.169.155.87 86400 0 \N +181 22 *.regionalverkehr.net CNAME www.regionalverkehr.net 86400 0 \N +182 23 rundkino-dresden.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006112400 86400 7200 1209600 86400 86400 0 \N +183 23 rundkino-dresden.de NS ns1.gnuviech-server.de 86400 0 \N +184 23 rundkino-dresden.de NS ns10.schlundtech.de 86400 0 \N +185 23 rundkino-dresden.de A 81.169.155.87 86400 0 \N +186 23 rundkino-dresden.de MX gnuviech.info 86400 5 \N +187 23 rundkino-dresden.de TXT v=spf1 a mx 86400 0 \N +188 23 www.rundkino-dresden.de A 81.169.155.87 86400 0 \N +189 23 *.rundkino-dresden.de CNAME www.rundkino-dresden.de 86400 0 \N +190 24 scheune-sohland.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006030102 86400 7200 1209600 86400 86400 0 \N +191 24 scheune-sohland.de NS ns1.gnuviech-server.de 86400 0 \N +192 24 scheune-sohland.de NS ns10.schlundtech.de 86400 0 \N +193 24 scheune-sohland.de A 81.169.155.87 86400 0 \N +194 24 scheune-sohland.de MX mail.gnuviech.info 86400 5 \N +195 24 scheune-sohland.de TXT v=spf1 a mx 86400 0 \N +196 24 www.scheune-sohland.de A 81.169.155.87 86400 0 \N +197 24 *.scheune-sohland.de CNAME www.scheune-sohland.de 86400 0 \N +198 25 spare-beatz.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005090501 86400 7200 1209600 86400 86400 0 \N +199 25 spare-beatz.de NS ns1.gnuviech-server.de 86400 0 \N +200 25 spare-beatz.de NS ns10.schlundtech.de 86400 0 \N +201 25 spare-beatz.de A 81.169.155.87 86400 0 \N +202 25 spare-beatz.de MX gnuviech.info 86400 5 \N +203 25 spare-beatz.de TXT v=spf1 a mx 86400 0 \N +204 25 www.spare-beatz.de A 81.169.155.87 86400 0 \N +205 25 *.spare-beatz.de CNAME www.spare-beatz.de 86400 0 \N +206 26 tntlive.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006100401 10000 7200 1209600 86400 86400 0 \N +207 26 tntlive.de NS ns1.gnuviech-server.de 86400 0 \N +208 26 tntlive.de NS ns10.schlundtech.de 86400 0 \N +209 26 tntlive.de A 81.169.155.87 86400 0 \N +210 26 tntlive.de MX gnuviech.info 86400 5 \N +211 26 tntlive.de TXT v=spf1 a mx 86400 0 \N +212 26 *.tntlive.de CNAME www.tntlive.de 86400 0 \N +213 26 www.tntlive.de A 81.169.155.87 86400 0 \N +214 27 wagner-sound.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005081701 86400 7200 1209600 86400 86400 0 \N +215 27 wagner-sound.de NS ns1.gnuviech-server.de 86400 0 \N +216 27 wagner-sound.de NS ns10.schlundtech.de 86400 0 \N +217 27 wagner-sound.de A 81.169.155.87 86400 0 \N +218 27 wagner-sound.de MX gnuviech.info 86400 5 \N +219 27 wagner-sound.de TXT v=spf1 a mx 86400 0 \N +220 27 www.wagner-sound.de A 81.169.155.87 86400 0 \N +221 27 *.wagner-sound.de CNAME www.wagner-sound.de 86400 0 \N +222 28 winproject.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2006100302 10000 7200 1209600 86400 86400 0 \N +223 28 winproject.de NS ns1.gnuviech-server.de 86400 0 \N +224 28 winproject.de NS ns10.schlundtech.de 86400 0 \N +225 28 winproject.de A 81.169.155.87 86400 0 \N +226 28 winproject.de MX gnuviech.info 86400 5 \N +227 28 winproject.de TXT v=spf1 a mx 86400 0 \N +228 28 *.winproject.de CNAME www.winproject.de 86400 0 \N +229 28 www.winproject.de A 81.169.155.87 86400 0 \N +230 29 zahnspange-schubert.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2005101702 86400 7200 1209600 86400 86400 0 \N +231 29 zahnspange-schubert.de NS ns1.gnuviech-server.de 86400 0 \N +232 29 zahnspange-schubert.de NS ns10.schlundtech.de 86400 0 \N +233 29 zahnspange-schubert.de A 81.169.155.87 86400 0 \N +234 29 zahnspange-schubert.de MX gnuviech.info 86400 5 \N +235 29 zahnspange-schubert.de TXT v=spf1 a mx 86400 0 \N +236 29 www.zahnspange-schubert.de A 81.169.155.87 86400 0 \N +237 29 *.zahnspange-schubert.de CNAME www.zahnspange-schubert.de 86400 0 \N +61 8 dittberner.info SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 0 10800 3600 604800 86400 86400 0 1166699628 +69 8 www.dittberner.info A 81.169.155.87 86400 0 1166699628 +67 8 *.dittberner.info CNAME www.dittberner.info 86400 0 1166699628 +66 8 dittberner.info TXT v=spf1 a mx -all 86400 0 1166699628 +65 8 dittberner.info MX gnuviech.info 86400 5 1166699628 +64 8 dittberner.info A 81.169.155.87 86400 0 1166699628 +63 8 dittberner.info NS ns10.schlundtech.de 86400 0 1166699628 +62 8 dittberner.info NS ns1.gnuviech-server.de 86400 0 1166699628 +17 2 hetzgnu.gnuviech-server.de A 88.198.120.250 86400 0 2006122203 +18 2 jabber.gnuviech-server.de A 88.198.120.250 86400 0 2006122203 +20 2 *.gnuviech-server.de CNAME gnuviech-server.de 86400 0 2007010301 +16 2 www.gnuviech-server.de A 88.198.120.250 86400 0 2007010301 +9 2 gnuviech-server.de SOA ns1.gnuviech-server.de hostmaster.gnuviech.info 2007010301 10000 7200 1209600 86400 86400 0 2007010301 +\. + + +-- +-- Data for Name: supermasters; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY supermasters (ip, nameserver, account) FROM stdin; +\. + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/testdb/addclient.py b/testdb/addclient.py new file mode 100644 index 0000000..264a8ed --- /dev/null +++ b/testdb/addclient.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# +# Copyright (c) 2007 Jan Dittberner +# $Id$ +# +import getopt, sys +from gnuviechadmin.dblayer import * + +def usage(): + print """Usage information: + ===================== + %(process)s -h|--help + - prints this help text + + %(process)s --firstname= --lastname= \ + --address1= --town= --zipcode= \ + [--address2=] [--country=] [--state=] \ + [--active=true|false] [--phone=] [--mobile=] + - adds a new client + """ % {'process': sys.argv[0]} + +if __name__ == "__main__": + try: + (options, args) = getopt.getopt(sys.argv[1:], "h", + ['help', + 'firstname=', 'lastname=', 'address1=', + 'town=', 'zipcode=', 'address2=', + 'country=', 'state=', 'active=', + 'phone=', 'mobile=']) + except getopt.GetoptError: + usage() + sys.exit(1) + + if (not options or + dict(options).has_key('-h') or + dict(options).has_key('--help') or + not dict(options).has_key('--firstname') or + not dict(options).has_key('--lastname') or + not dict(options).has_key('--address1') or + not dict(options).has_key('--town') or + not dict(options).has_key('--zipcode') or + not dict(options)['--firstname'].strip() or + not dict(options)['--lastname'].strip() or + not dict(options)['--address1'].strip() or + not dict(options)['--town'].strip() or + not dict(options)['--zipcode'].strip()): + usage() + sys.exit(1) + + po = dict(options) + for key in po.keys(): + po[key] = po[key].strip() + client = Client() + client.firstname = po['--firstname'] + client.lastname = po['--lastname'] + client.address1 = po['--address1'] + client.town = po['--town'] + client.zipcode = po['--zipcode'] + if po.has_key('--active'): + client.active = (po['--active'] == 'true') + else: + client.active = True + if po.has_key('--address2') and po['--address2']: + client.address2 = po['--address2'] + if po.has_key('--country') and po['--country']: + client.country = po['--country'] + if po.has_key('--state') and po['--state']: + client.state = po['--state'] + if po.has_key('--phone') and po['--phone']: + client.phone = po['--phone'] + if po.has_key('--mobile') and po['--mobile']: + client.mobile = po['--mobile'] + session.save(client) + session.flush() diff --git a/testdb/adddomain.py b/testdb/adddomain.py new file mode 100644 index 0000000..6ec1d1b --- /dev/null +++ b/testdb/adddomain.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# +# Copyright (c) 2007 Jan Dittberner +# $Id$ +# +import getopt, sys +from gnuviechadmin.dblayer import * + +def usage(): + print """Usage information: + ===================== + %(process)s -h|--help + - prints this help text + + %(process)s --domain= --sysuser= --type=MASTER|SLAVE \ + [[--ns=] [--mx=] [--a=] ...] + - adds a new domain + """ % {'process': sys.argv[0]} + +if __name__ == "__main__": + try: + (options, args) = getopt.getopt(sys.argv[1:], "h", + ['help', + 'domain=', 'sysuser=', + 'type=', 'ns=', 'mx=', 'a=']) + except getopt.GetoptError: + usage() + sys.exit(1) + + if (not options or + dict(options).has_key('-h') or + dict(options).has_key('--help') or + not dict(options).has_key('--domain') or + not dict(options).has_key('--sysuser') or + not dict(options)['--sysuser'].strip() or + not dict(options)['--domain'].strip()): + usage() + sys.exit(1) + + po = {} + for (key, value) in options: + if po.has_key(key): + po[key].append(value.strip()) + else: + po[key] = [value.strip()] + + # fetch the sysuser + query = session.query(SysUser) + sysuser = query.get_by(name = po['--sysuser'][0]) + if not sysuser: + print "Invalid system user" + allsysusers = query.get_by(name = '*') + if allsysusers: + print "Valid system users are:\n%s" % ("\n".join(allsysusers)) + else: + print "No system users defined yet." + sys.exit(1) + + print sysuser.domains diff --git a/testdb/addpopuser.py b/testdb/addpopuser.py new file mode 100644 index 0000000..0b23a06 --- /dev/null +++ b/testdb/addpopuser.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# +# Copyright (c) 2007 Jan Dittberner +# $Id$ +# +import getopt, sys +from gnuviechadmin.dblayer import * + +def usage(): + print """Usage information: + ===================== + %(process)s -h|--help + - prints this help text + + %(process)s --domain= [--password=] + - adds a new pop user for the given domain + - if the optional password is ommitted a generated one is used + - the password is checked using cracklib + - if the password is too weak a generated one is used + """ % {'process': sys.argv[0]} + +if __name__ == "__main__": + try: + (options, args) = getopt.getopt(sys.argv[1:], "h", ['help', 'password=', 'domain=']) + except getopt.GetoptError: + usage() + sys.exit(1) + + if (not options or + dict(options).has_key('-h') or + dict(options).has_key('--help') or + not dict(options).has_key('--domain') or + not dict(options)['--domain'].strip()): + usage() + sys.exit(1) + + # specify the domain + query = session.query(Domain) + domain = query.get_by(name = dict(options)['--domain'].strip()) + if not domain: + print "Invalid Domain" + print "valid domains are:\n%s" % ("\n".join(query.get())) + sys.exit(1) + + print domain.popaccounts diff --git a/testdb/addsysuser.py b/testdb/addsysuser.py new file mode 100644 index 0000000..9524d1e --- /dev/null +++ b/testdb/addsysuser.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# +# Copyright (c) 2007 Jan Dittberner +# $Id$ +# +import getopt, sys +from gnuviechadmin.dblayer import * + +def usage(): + print """Usage information: + ===================== + %(process)s -h|--help + - prints this help text + + %(process)s --type=admin|reseller|client --clientid= \ + [--name=] [--home=] [--shell=] [--password] \ + [--sysuid=] + - adds a new system user + """ % {'process': sys.argv[0]} + +if __name__ == "__main__": + try: + (options, args) = getopt.getopt(sys.argv[1:], "h", + ['help', + 'type=', 'clientid=', 'name=', 'home=', + 'shell=', 'password=', 'sysuid=']) + except getopt.GetoptError: + usage() + sys.exit(1) + + if (not options or + dict(options).has_key('-h') or + dict(options).has_key('--help') or + not dict(options).has_key('--type') or + not dict(options).has_key('--clientid') or + not dict(options)['--type'].strip() or + not dict(options)['--clientid'].strip() or + not dict(options)['--type'].strip() in ('admin', 'reseller', 'client')): + usage() + sys.exit(1) + + query = session.query(Client) + client = query.get_by(clientid = dict(options)['--clientid'].strip()) + if not client: + print "Invalid client" + allclients = query.select() + if allclients: + print "Valid clients are:\n- %s" % "\n- ".join([str(client) for client in allclients]) + else: + print "No clients defined yet." + sys.exit(1) + + print client.sysusers diff --git a/testdb/dbschema/gnuviechadmin/README b/testdb/dbschema/gnuviechadmin/README new file mode 100644 index 0000000..c698f65 --- /dev/null +++ b/testdb/dbschema/gnuviechadmin/README @@ -0,0 +1,4 @@ +This is a database migration repository. + +More information at +http://trac.erosson.com/migrate diff --git a/testdb/dbschema/gnuviechadmin/__init__.py b/testdb/dbschema/gnuviechadmin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/testdb/dbschema/gnuviechadmin/manage.py b/testdb/dbschema/gnuviechadmin/manage.py new file mode 100644 index 0000000..2a4458c --- /dev/null +++ b/testdb/dbschema/gnuviechadmin/manage.py @@ -0,0 +1,4 @@ +#!/usr/bin/python +from migrate.versioning.shell import main + +main(repository='gnuviechadmin') diff --git a/testdb/dbschema/gnuviechadmin/migrate.cfg b/testdb/dbschema/gnuviechadmin/migrate.cfg new file mode 100644 index 0000000..f9aecdf --- /dev/null +++ b/testdb/dbschema/gnuviechadmin/migrate.cfg @@ -0,0 +1,20 @@ +[db_settings] +# Used to identify which repository this database is versioned under. +# You can use the name of your project. +repository_id=GNUViech Admin + +# The name of the database table used to track the schema version. +# This name shouldn't already be used by your project. +# If this is changed once a database is under version control, you'll need to +# change the table name in each database too. +version_table=migrate_version + +# When committing a change script, Migrate will attempt to generate the +# sql for all supported databases; normally, if one of them fails - probably +# because you don't have that database installed - it is ignored and the +# commit continues, perhaps ending successfully. +# Databases in this list MUST compile successfully during a commit, or the +# entire commit will fail. List the databases your application will actually +# be using to ensure your updates to that database work properly. +# This must be a list; example: ['postgres','sqlite'] +required_dbs=[] diff --git a/testdb/dbschema/gnuviechadmin/versions/1/1.py b/testdb/dbschema/gnuviechadmin/versions/1/1.py new file mode 100644 index 0000000..fb9fa29 --- /dev/null +++ b/testdb/dbschema/gnuviechadmin/versions/1/1.py @@ -0,0 +1,33 @@ +# setup tables for spamassassin +from sqlalchemy import * +from migrate import * + +meta = BoundMetaData(migrate_engine) +domains = Table('domains', meta, autoload = True) +mailalias = Table( + 'mailalias', meta, + Column('mailaliasid', Integer, primary_key = True), + Column('domainid', Integer, ForeignKey('domains.id'), nullable = False), + Column('email', String(255), nullable = False), + Column('target', TEXT, nullable = False), + UniqueConstraint('email', 'domainid')) + +mailpassword = Table( + 'mailpassword', meta, + Column('id', String(18), primary_key = True), + Column('domainid', Integer, ForeignKey('domains.id'), nullable = False), + Column('uid', Integer, nullable = False), + Column('gid', Integer, nullable = False), + Column('home', String(255), nullable = False), + Column('cryptpass', String(34), nullable = False), + Column('clearpass', String(64), nullable = False), + Column('spamcheck', Boolean, default = False), + Column('sajunkscore', Integer)) + +def upgrade(): + mailalias.create() + mailpassword.create() + +def downgrade(): + mailpassword.drop() + mailalias.drop() diff --git a/testdb/dbschema/gnuviechadmin/versions/2/2.py b/testdb/dbschema/gnuviechadmin/versions/2/2.py new file mode 100644 index 0000000..b6d96f9 --- /dev/null +++ b/testdb/dbschema/gnuviechadmin/versions/2/2.py @@ -0,0 +1,40 @@ +from sqlalchemy import * +from migrate import * + +meta = BoundMetaData(migrate_engine) +client_table = Table( + 'client', meta, + Column('clientid', Integer, primary_key = True), + Column('firstname', String(40), nullable = False), + Column('lastname', String(40), nullable = False), + Column('address1', String(40), nullable = False), + Column('address2', String(40)), + Column('country', String(40)), + Column('town', String(50), nullable = False), + Column('zipcode', String(5), nullable = False), + Column('state', String(40)), + Column('active', Boolean, default = False, nullable = False), + Column('phone', String(20)), + Column('mobile', String(20))) + +sysuser_table = Table( + 'sysuser', meta, + Column('sysuserid', Integer, primary_key = True), + Column('name', String(12), nullable = False), + Column('type', Integer, default = 0, nullable = False), + Column('home', String(128)), + Column('shell', Boolean), + Column('password', String(64)), + Column('clientid', Integer, ForeignKey('client.clientid'), + nullable = False), + Column('toupdate', Boolean, default = False, nullable = False), + Column('md5pass', String(34)), + Column('sysuid', Integer)) + +def upgrade(): + client_table.create() + sysuser_table.create() + +def downgrade(): + sysuser_table.drop() + client_table.drop() diff --git a/testdb/dbschema/gnuviechadmin/versions/3/3.py b/testdb/dbschema/gnuviechadmin/versions/3/3.py new file mode 100644 index 0000000..452a7b8 --- /dev/null +++ b/testdb/dbschema/gnuviechadmin/versions/3/3.py @@ -0,0 +1,17 @@ +from sqlalchemy import * +from migrate import * +import migrate.changeset + +meta = BoundMetaData(migrate_engine) +sysuser = Table('sysuser', meta, autoload = True) +domains = Table('domains', meta, autoload = True) +sysuidrefcol = Column('sysuserid', Integer, + ForeignKey('sysuser.sysuserid'), + nullable = False) + +def upgrade(): + sysuidrefcol.create(domains) + +def downgrade(): + col = domains.c.sysuserid + col.drop() diff --git a/testdb/dbschema/gnuviechadmin/versions/__init__.py b/testdb/dbschema/gnuviechadmin/versions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/testdb/dbschema/initdb.sh b/testdb/dbschema/initdb.sh new file mode 100755 index 0000000..8fc12c7 --- /dev/null +++ b/testdb/dbschema/initdb.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +dirname=$(pwd) +dbname=testdb +dbuser=jan +dbpassword=heyyou97 +reponame=gnuviechadmin +dburl=postgres://$dbuser:$dbpassword@localhost:5432/$dbname + +sudo su - postgres -c "createdb -O $dbuser -E UTF-8 $dbname" +sudo su - postgres -c "psql $dbname < $dirname/initdb.sql" + +#migrate create $reponame "GNUViech Admin" +migrate version_control $dburl $reponame +migrate manage manage.py --repository=$reponame --url=$dburl +python manage.py upgrade diff --git a/testdb/dbschema/initdb.sql b/testdb/dbschema/initdb.sql new file mode 100644 index 0000000..6c44fb9 --- /dev/null +++ b/testdb/dbschema/initdb.sql @@ -0,0 +1,188 @@ +-- initial schema setup for postgresql + +-- spamassassin bayes storage + +CREATE PROCEDURAL LANGUAGE plpgsql; + +SET search_path = public, pg_catalog; + +CREATE TABLE bayes_expire ( + id integer NOT NULL default '0', + runtime integer NOT NULL default '0' +) WITHOUT OIDS; + +CREATE INDEX bayes_expire_idx1 ON bayes_expire (id); + +CREATE TABLE bayes_global_vars ( + variable varchar(30) NOT NULL default '', + value varchar(200) NOT NULL default '', + PRIMARY KEY (variable) +) WITHOUT OIDS; + +INSERT INTO bayes_global_vars VALUES ('VERSION','3'); + +CREATE TABLE bayes_seen ( + id integer NOT NULL default '0', + msgid varchar(200) NOT NULL default '', + flag character(1) NOT NULL default '', + PRIMARY KEY (id,msgid) +) WITHOUT OIDS; + +CREATE TABLE bayes_token ( + id integer NOT NULL default '0', + token bytea NOT NULL default '', + spam_count integer NOT NULL default '0', + ham_count integer NOT NULL default '0', + atime integer NOT NULL default '0', + PRIMARY KEY (id,token) +) WITHOUT OIDS; + +CREATE INDEX bayes_token_idx1 ON bayes_token (token); + +CREATE TABLE bayes_vars ( + id serial NOT NULL, + username varchar(200) NOT NULL default '', + spam_count integer NOT NULL default '0', + ham_count integer NOT NULL default '0', + token_count integer NOT NULL default '0', + last_expire integer NOT NULL default '0', + last_atime_delta integer NOT NULL default '0', + last_expire_reduce integer NOT NULL default '0', + oldest_token_age integer NOT NULL default '2147483647', + newest_token_age integer NOT NULL default '0', + PRIMARY KEY (id) +) WITHOUT OIDS; + +CREATE UNIQUE INDEX bayes_vars_idx1 ON bayes_vars (username); + +CREATE OR REPLACE FUNCTION greatest_int (integer, integer) + RETURNS INTEGER + IMMUTABLE STRICT + AS 'SELECT CASE WHEN $1 < $2 THEN $2 ELSE $1 END;' + LANGUAGE SQL; + +CREATE OR REPLACE FUNCTION least_int (integer, integer) + RETURNS INTEGER + IMMUTABLE STRICT + AS 'SELECT CASE WHEN $1 < $2 THEN $1 ELSE $2 END;' + LANGUAGE SQL; + +CREATE OR REPLACE FUNCTION put_tokens(inuserid INTEGER, + intokenary BYTEA[], + inspam_count INTEGER, + inham_count INTEGER, + inatime INTEGER) +RETURNS VOID AS ' +DECLARE + _token BYTEA; + new_tokens INTEGER := 0; +BEGIN + for i in array_lower(intokenary, 1) .. array_upper(intokenary, 1) + LOOP + _token := intokenary[i]; + UPDATE bayes_token + SET spam_count = greatest_int(spam_count + inspam_count, 0), + ham_count = greatest_int(ham_count + inham_count, 0), + atime = greatest_int(atime, inatime) + WHERE id = inuserid + AND token = _token; + IF NOT FOUND THEN + -- we do not insert negative counts, just return true + IF NOT (inspam_count < 0 OR inham_count < 0) THEN + INSERT INTO bayes_token (id, token, spam_count, ham_count, atime) + VALUES (inuserid, _token, inspam_count, inham_count, inatime); + IF FOUND THEN + new_tokens := new_tokens + 1; + END IF; + END IF; + END IF; + END LOOP; + + IF new_tokens > 0 AND inatime > 0 THEN + UPDATE bayes_vars + SET token_count = token_count + new_tokens, + newest_token_age = greatest_int(newest_token_age, inatime), + oldest_token_age = least_int(oldest_token_age, inatime) + WHERE id = inuserid; + ELSEIF new_tokens > 0 AND NOT inatime > 0 THEN + UPDATE bayes_vars + SET token_count = token_count + new_tokens + WHERE id = inuserid; + ELSEIF NOT new_tokens > 0 AND inatime > 0 THEN + UPDATE bayes_vars + SET newest_token_age = greatest_int(newest_token_age, inatime), + oldest_token_age = least_int(oldest_token_age, inatime) + WHERE id = inuserid; + END IF; + RETURN; +END; +' LANGUAGE 'plpgsql'; + +-- tables for spamassassin auto-whitelists + +CREATE TABLE awl ( + username varchar(100) NOT NULL default '', + email varchar(200) NOT NULL default '', + ip varchar(10) NOT NULL default '', + count bigint default '0', + totscore float default '0' +); +CREATE UNIQUE INDEX awl_pkey ON awl (username,email,ip); + +-- tables for spamassassin user preferences + +CREATE TABLE userpref ( + prefid bigserial NOT NULL unique primary key, + username varchar(100) NOT NULL, + preference varchar(30) NOT NULL, + value varchar(100) NOT NULL +); +CREATE INDEX userpref_username_idx ON userpref(username); + +-- tables for powerdns + +CREATE TABLE domains ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL UNIQUE, + master VARCHAR(20) DEFAULT NULL, + last_check INT DEFAULT NULL, + type VARCHAR(6) NOT NULL, + notified_serial INT DEFAULT NULL, + account VARCHAR(40) DEFAULT NULL +); + +CREATE TABLE records ( + id SERIAL PRIMARY KEY, + domain_id INT DEFAULT NULL, + name VARCHAR(255) DEFAULT NULL, + type VARCHAR(6) DEFAULT NULL, + content VARCHAR(255) DEFAULT NULL, + ttl INT DEFAULT NULL, + prio INT DEFAULT NULL, + change_date INT DEFAULT NULL, + CONSTRAINT domain_exists + FOREIGN KEY(domain_id) REFERENCES domains(id) + ON DELETE CASCADE +); + +CREATE INDEX rec_name_index ON records(name); +CREATE INDEX nametype_index ON records(name, type); +CREATE INDEX domain_id ON records(domain_id); + +CREATE TABLE supermasters ( + ip VARCHAR(25) NOT NULL, + nameserver VARCHAR(255) NOT NULL, + account VARCHAR(40) DEFAULT NULL +); + +GRANT ALL ON supermasters TO jan; +GRANT ALL ON domains TO jan; +GRANT ALL ON domains_id_seq TO jan; +GRANT ALL ON records TO jan; +GRANT ALL ON records_id_seq TO jan; + +-- GRANT SELECT ON supermasters TO pdns; +-- GRANT ALL ON domains TO pdns; +-- GRANT ALL ON domains_id_seq TO pdns; +-- GRANT ALL ON records TO pdns; +-- GRANT ALL ON records_id_seq TO pdns; diff --git a/testdb/dbschema/manage.py b/testdb/dbschema/manage.py new file mode 100644 index 0000000..f19965e --- /dev/null +++ b/testdb/dbschema/manage.py @@ -0,0 +1,4 @@ +#!/usr/bin/python +from migrate.versioning.shell import main + +main(url='postgres://jan:heyyou97@localhost:5432/testdb',repository='gnuviechadmin') diff --git a/testdb/gnuviechadmin/__init__.py b/testdb/gnuviechadmin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/testdb/gnuviechadmin/dblayer.py b/testdb/gnuviechadmin/dblayer.py new file mode 100644 index 0000000..c9d3fb5 --- /dev/null +++ b/testdb/gnuviechadmin/dblayer.py @@ -0,0 +1,23 @@ +from sqlalchemy import * +from entities import * + +db = create_engine('postgres://jan:heyyou97@localhost:5432/testdb') + +metadata = BoundMetaData(db) + +domains_table = Table('domains', metadata, autoload = True) +sysuser_table = Table('sysuser', metadata, autoload = True) +mailpassword_table = Table('mailpassword', metadata, autoload = True) +client_table = Table('client', metadata, autoload = True) + +popaccountmapper = mapper(PopAccount, mailpassword_table) + +domainmapper = mapper(Domain, domains_table) +domainmapper.add_property('popaccounts', relation(PopAccount)) + +sysusermapper = mapper(SysUser, sysuser_table) + +clientmapper = mapper(Client, client_table) +clientmapper.add_property('sysusers', relation(SysUser)) + +session = create_session() diff --git a/testdb/gnuviechadmin/entities.py b/testdb/gnuviechadmin/entities.py new file mode 100644 index 0000000..8d406a3 --- /dev/null +++ b/testdb/gnuviechadmin/entities.py @@ -0,0 +1,46 @@ +class Client(object): + def __repr__(self): + return "%s(clientid=%s,firstname=%s,lastname=%s)" % \ + (self.__class__.__name__, + self.clientid, + self.firstname, + self.lastname) + +class PopAccount(object): + def __repr__(self): + return "%s(%s,%d,%d,%d,%s,%s,%s)" % \ + (self.__class__.__name__, + self.id, + self.domainid, + self.uid, + self.gid, + self.home, + self.cryptpass, + self.clearpass) + +class SysUser(object): + def __repr__(self): + return "%s(%d,%s,%d,%s,%s,%s,%d,%d,%s,%d)" % \ + (self.__class__.__name__, + self.sysuserid, + self.name, + self.type, + self.home, + self.shell, + self.password, + self.clientid, + self.toupdate, + self.md5pass, + self.sysuid) + +class Domain(object): + def __repr__(self): + return "%s(%d,%s,%s,%s,%s,%s,%s)" % \ + (self.__class__.__name__, + self.id, + self.name, + self.master, + self.last_check, + self.type, + self.notified_serial, + self.account)