diff --git a/machines/theo-server/deploy/rattail/freetds.conf.mako b/machines/theo-server/deploy/rattail/catapult/freetds.conf.mako similarity index 81% rename from machines/theo-server/deploy/rattail/freetds.conf.mako rename to machines/theo-server/deploy/rattail/catapult/freetds.conf.mako index e21a685..6f7a235 100644 --- a/machines/theo-server/deploy/rattail/freetds.conf.mako +++ b/machines/theo-server/deploy/rattail/catapult/freetds.conf.mako @@ -3,6 +3,7 @@ [catapult-default] host = ${env.catapult_host} port = 2638 + # https://www.freetds.org/userguide/ChoosingTdsProtocol.html tds version = 5.0 # this is to allow for product images up to 8MB text size = 8388608 diff --git a/machines/theo-server/deploy/rattail/odbc.ini b/machines/theo-server/deploy/rattail/catapult/odbc.ini similarity index 100% rename from machines/theo-server/deploy/rattail/odbc.ini rename to machines/theo-server/deploy/rattail/catapult/odbc.ini diff --git a/machines/theo-server/deploy/rattail/locsms/freetds/freetds.conf.mako b/machines/theo-server/deploy/rattail/locsms/freetds/freetds.conf.mako new file mode 100644 index 0000000..0930af1 --- /dev/null +++ b/machines/theo-server/deploy/rattail/locsms/freetds/freetds.conf.mako @@ -0,0 +1,13 @@ +## -*- mode: conf; -*- + +[locsms-default] + host = ${env.locsms_store_server} + % if env.locsms_store_sqlinstance: + instance = ${env.locsms_store_sqlinstance} + % endif + # TODO: the rest of this needs a little polishing + # https://www.freetds.org/userguide/ChoosingTdsProtocol.html + tds version = 7.0 + # tds version = 8.0 + # port = 1433 + # client charset = UTF-8 diff --git a/machines/theo-server/deploy/rattail/locsms/freetds/odbc.ini.mako b/machines/theo-server/deploy/rattail/locsms/freetds/odbc.ini.mako new file mode 100644 index 0000000..b230c65 --- /dev/null +++ b/machines/theo-server/deploy/rattail/locsms/freetds/odbc.ini.mako @@ -0,0 +1,7 @@ +## -*- mode: conf; -*- + +[locsms-default] +Description = LOC SMS +Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so +Servername = locsms-default +Database = ${env.locsms_store_dbname} diff --git a/machines/theo-server/deploy/rattail/locsms/mssql/odbc.ini.mako b/machines/theo-server/deploy/rattail/locsms/mssql/odbc.ini.mako new file mode 100644 index 0000000..e1daae7 --- /dev/null +++ b/machines/theo-server/deploy/rattail/locsms/mssql/odbc.ini.mako @@ -0,0 +1,14 @@ +## -*- mode: conf; -*- + +[locsms-default] +Description = LOC SMS +Driver = ODBC Driver 17 for SQL Server +% if env.locsms_store_sqlinstance: +# note, weird port is for named instance (${env.locsms_store_sqlinstance}) +# https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/connection-string-keywords-and-data-source-names-dsns?view=sql-server-2017 +# https://sqlandme.com/2013/05/01/sql-server-finding-tcp-port-number-sql-instance-is-listening-on/ +Server = ${env.locsms_store_server},49523 +% else: +Server = ${env.locsms_store_server} +% endif +Database = ${env.locsms_store_dbname} diff --git a/machines/theo-server/deploy/theo-common/import-locsms-first.sh.mako b/machines/theo-server/deploy/theo-common/import-locsms-first.sh.mako new file mode 100755 index 0000000..3770979 --- /dev/null +++ b/machines/theo-server/deploy/theo-common/import-locsms-first.sh.mako @@ -0,0 +1,17 @@ +#!/bin/sh -e + +# sanity check +if [ "$USER" != 'rattail' ]; then + echo '' + echo "Please run this script as 'rattail' user:" + echo '' + echo " sudo -u rattail $0" + exit 1 +fi + +cd ${envroot} + +RATTAIL='bin/rattail -c app/quiet.conf -P' + +$RATTAIL import-locsms --no-versioning --warnings +$RATTAIL import-versions --runas locsms --warnings -m "initial data from LOC SMS" diff --git a/machines/theo-server/deploy/theo-common/overnight.sh.mako b/machines/theo-server/deploy/theo-common/overnight.sh.mako index 4228cc0..3441d52 100755 --- a/machines/theo-server/deploy/theo-common/overnight.sh.mako +++ b/machines/theo-server/deploy/theo-common/overnight.sh.mako @@ -28,6 +28,9 @@ $RATTAIL --runas corepos import-corepos-api --delete % elif env.theo_integrates_with == 'catapult': # Catapult -> Theo $RATTAIL --runas catapult import-catapult --delete +% elif env.theo_integrates_with == 'locsms': +# LOC SMS -> Theo +$RATTAIL --runas locsms import-locsms --delete % endif # make sure version data is correct diff --git a/machines/theo-server/deploy/theo-common/pip.conf.mako b/machines/theo-server/deploy/theo-common/pip.conf.mako index 455e802..6bd8886 100644 --- a/machines/theo-server/deploy/theo-common/pip.conf.mako +++ b/machines/theo-server/deploy/theo-common/pip.conf.mako @@ -5,6 +5,8 @@ extra-index-url = https://pypi.rattailproject.org/simple/ % if env.theo_integrates_with == 'catapult': https://${env.restricted_pypi_username}:${env.restricted_pypi_password}@pypi-restricted.rattailproject.org/catapult/ + % elif env.theo_integrates_with == 'locsms': + https://${env.restricted_pypi_username}:${env.restricted_pypi_password}@pypi-restricted.rattailproject.org/locsms/ % endif log-file = ${envroot}/pip.log exists-action = i diff --git a/machines/theo-server/deploy/theo-common/rattail.conf.mako b/machines/theo-server/deploy/theo-common/rattail.conf.mako index b06940e..e0a0e4d 100644 --- a/machines/theo-server/deploy/theo-common/rattail.conf.mako +++ b/machines/theo-server/deploy/theo-common/rattail.conf.mako @@ -12,6 +12,8 @@ integrate_corepos = true % elif env.theo_integrates_with == 'catapult': integrate_catapult = true +% elif env.theo_integrates_with == 'locsms': +integrate_locsms = true % endif @@ -50,6 +52,20 @@ default.url = catapult://${env.catapult_odbc_username}:${env.catapult_odbc_passw % endif +## begin locsms +% if env.theo_integrates_with == 'locsms': + +<%text>############################## +# LOC SMS +<%text>############################## + +[locsms.db] +default.url = mssql://${env.locsms_odbc_username}:${env.locsms_odbc_password}@locsms-default + +## end locsms +% endif + + <%text>############################## # rattail <%text>############################## @@ -90,6 +106,8 @@ script_location = rattail.db:alembic version_locations = rattail_corepos.db:alembic/versions rattail.db:alembic/versions % elif env.theo_integrates_with == 'catapult': version_locations = rattail_onager.db:alembic/versions rattail.db:alembic/versions +% elif env.theo_integrates_with == 'locsms': +version_locations = rattail_luckysmores.db:alembic/versions rattail.db:alembic/versions % else: version_locations = rattail.db:alembic/versions % endif diff --git a/machines/theo-server/deploy/theo-common/upgrade.sh.mako b/machines/theo-server/deploy/theo-common/upgrade.sh.mako index b5bfb06..84bfecc 100755 --- a/machines/theo-server/deploy/theo-common/upgrade.sh.mako +++ b/machines/theo-server/deploy/theo-common/upgrade.sh.mako @@ -82,6 +82,30 @@ $PIP install $QUIET --editable . ## end catapult % endif +## begin locsms +% if env.theo_integrates_with == 'locsms': + +# luckysmores +cd $SRC/luckysmores +git pull $QUIET +find . -name '*.pyc' -delete +$PIP install $QUIET --editable . + +# rattail-luckysmores +cd $SRC/rattail-luckysmores +git pull $QUIET +find . -name '*.pyc' -delete +$PIP install $QUIET --editable . + +# tailbone-locsms +cd $SRC/tailbone-locsms +git pull $QUIET +find . -name '*.pyc' -delete +$PIP install $QUIET --editable . + +## end locsms +% endif + # theo cd $SRC/theo git pull $QUIET @@ -96,6 +120,8 @@ $PIP install $QUIET --editable . $PIP install $QUIET --upgrade --upgrade-strategy eager tailbone-theo[app,corepos] % elif env.theo_integrates_with == 'catapult': $PIP install $QUIET --upgrade --upgrade-strategy eager tailbone-theo[app,catapult] +% elif env.theo_integrates_with == 'locsms': +$PIP install $QUIET --upgrade --upgrade-strategy eager tailbone-theo[app,locsms] % else: $PIP install $QUIET --upgrade --upgrade-strategy eager tailbone-theo[app] % endif diff --git a/machines/theo-server/fabenv.py.dist b/machines/theo-server/fabenv.py.dist index ed83a71..b764f84 100644 --- a/machines/theo-server/fabenv.py.dist +++ b/machines/theo-server/fabenv.py.dist @@ -29,6 +29,7 @@ env.timezone = 'America/Chicago' env.theo_integrates_with = None #env.theo_integrates_with = 'corepos' #env.theo_integrates_with = 'catapult' +#env.theo_integrates_with = 'locsms' # default admin user credentials for Theo web app env.theo_admin_username = 'username' @@ -91,3 +92,33 @@ env.catapult_host = 'INSTANCE.catapultweboffice.com' # these credentials are used to access the ODBC DSN for ECRS Catapult env.catapult_odbc_username = 'username' env.catapult_odbc_password = 'password' + + +############################## +# LOC SMS +############################## + +# this is the hostname (or IP) for your SMS store server +env.locsms_store_server = 'locsms-server.example.com' + +# this is your SMS SQL Server "instance" name, if applicable +env.locsms_store_sqlinstance = None +#env.locsms_store_sqlinstance = 'SQLEXPRESS' + +# this is your SMS DB name +env.locsms_store_dbname = 'STORESQL' + +# these credentials are used to access the ODBC DSN for LOC SMS +env.locsms_odbc_username = 'username' +env.locsms_odbc_password = 'password' + +# which ODBC driver to use? note that 'mssql' is generally recommended where +# possible, however is not selected by default b/c it is not open source, and +# can be trickier to get working in some situations +# https://docs.sqlalchemy.org/en/13/dialects/mssql.html#driver-unicode-support +# cf. also this issue at https://github.com/microsoft/msphpsql/issues/1112 +env.locsms_odbc_driver = 'freetds' +#env.locsms_odbc_driver = 'mssql' + +# if using the 'mssql' driver, you must also accept its EULA +env.mssql_driver_accept_eula = False diff --git a/machines/theo-server/fabfile.py b/machines/theo-server/fabfile.py index 98c6de1..65954d9 100644 --- a/machines/theo-server/fabfile.py +++ b/machines/theo-server/fabfile.py @@ -76,9 +76,27 @@ def bootstrap_base(c): # which cause it to use too much memory, so we use a more stable branch from rattail_fabric2 import freetds freetds.install_from_source(c, user='rattail', branch='Branch-1_2') - deploy(c, 'rattail/freetds.conf.mako', '/usr/local/etc/freetds.conf', + deploy(c, 'rattail/catapult/freetds.conf.mako', '/usr/local/etc/freetds.conf', use_sudo=True, context={'env': env}) - deploy(c, 'rattail/odbc.ini', '/etc/odbc.ini', use_sudo=True) + deploy(c, 'rattail/catapult/odbc.ini', '/etc/odbc.ini', use_sudo=True) + + # locsms extras + elif env.theo_integrates_with == 'locsms': + apt.install(c, 'unixodbc', 'unixodbc-dev') + + # mssql odbc + if env.locsms_odbc_driver == 'mssql': + from rattail_fabric2 import mssql + mssql.install_mssql_odbc(c, accept_eula=env.mssql_driver_accept_eula) + deploy(c, 'rattail/locsms/mssql/odbc.ini.mako', '/etc/odbc.ini', + use_sudo=True, context={'env': env}) + + else: # freetds odbc + apt.install(c, 'tdsodbc') + deploy(c, 'rattail/locsms/freetds/freetds.conf.mako', '/etc/freetds/freetds.conf', + use_sudo=True, context={'env': env}) + deploy(c, 'rattail/locsms/freetds/odbc.ini.mako', '/etc/odbc.ini', + use_sudo=True, context={'env': env}) @task @@ -134,6 +152,8 @@ def install_theo_app(c, envname, production, port, from_source=False, pkgname = 'tailbone-theo[app,corepos]' elif env.theo_integrates_with == 'catapult': pkgname = 'tailbone-theo[app,catapult]' + elif env.theo_integrates_with == 'locsms': + pkgname = 'tailbone-theo[app,locsms]' else: pkgname = 'tailbone-theo[app]' c.sudo("bash -c 'PIP_CONFIG_FILE={0}/pip.conf cd {0} && bin/pip install {1}'".format(envroot, pkgname), @@ -180,6 +200,10 @@ def install_theo_app(c, envname, production, port, from_source=False, deploy(c, 'theo-common/import-catapult-first.sh.mako', '{}/app/import-catapult-first.sh'.format(envroot), use_sudo=True, owner='rattail:', mode='0755', context={'envroot': envroot}) + elif env.theo_integrates_with == 'locsms': + deploy(c, 'theo-common/import-locsms-first.sh.mako', '{}/app/import-locsms-first.sh'.format(envroot), + use_sudo=True, owner='rattail:', mode='0755', + context={'envroot': envroot}) # theo db if not postgresql.db_exists(c, dbname): @@ -213,6 +237,9 @@ def install_theo_app(c, envname, production, port, from_source=False, elif env.theo_integrates_with == 'catapult': c.sudo("bash -c 'cd {} && bin/rattail -c app/quiet.conf --runas theo make-user --no-password catapult'".format(envroot), user='rattail') + elif env.theo_integrates_with == 'locsms': + c.sudo("bash -c 'cd {} && bin/rattail -c app/quiet.conf --runas theo make-user --no-password locsms'".format(envroot), + user='rattail') # supervisor deploy(c, 'theo-common/supervisor.conf.mako', '/etc/supervisor/conf.d/{}.conf'.format(safename), @@ -247,11 +274,17 @@ def install_theo_source(c, envroot): install_source_package(c, envroot, 'tailbone-corepos') # catapult - if env.theo_integrates_with == 'catapult': + elif env.theo_integrates_with == 'catapult': install_source_package(c, envroot, 'onager', restricted=True) install_source_package(c, envroot, 'rattail-onager', restricted=True) install_source_package(c, envroot, 'tailbone-onager', restricted=True) + # locsms + elif env.theo_integrates_with == 'locsms': + install_source_package(c, envroot, 'luckysmores', restricted=True) + install_source_package(c, envroot, 'rattail-luckysmores', restricted=True) + install_source_package(c, envroot, 'tailbone-locsms', restricted=True) + # theo install_source_package(c, envroot, 'theo')