server/serverctl.py
author Julien Cristau <julien.cristau@logilab.fr>
Tue, 16 Sep 2014 18:01:51 +0200
changeset 9948 798ab1216523
parent 9890 57e2cffa6329
child 9984 793377697c81
permissions -rw-r--r--
[test] Make test_undo_api less random The order in which hooks are run is not predictable if they have the same 'order' attribute, which is the case for SetOwnershipHook and SetInitialStateHook. So don't assume in_state will be set before created_by.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9797
4e640ab62f51 [tests/checkintegrity] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9759
diff changeset
     1
# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5410
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5967
8deedfeb7846 cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5814
diff changeset
    18
"""cubicweb-ctl commands and command handlers specific to the repository"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
    20
__docformat__ = 'restructuredtext en'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
4718
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4670
diff changeset
    22
# *ctl module should limit the number of import to be imported as quickly as
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4670
diff changeset
    23
# possible (for cubicweb-ctl reactivity, necessary for instance for usable bash
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4670
diff changeset
    24
# completion). So import locally in command helpers.
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
    25
import sys
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    26
import os
7457
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
    27
import logging
8233
9b9180969892 [c-c] use subprocess instead of os.system to start repository
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7815
diff changeset
    28
import subprocess
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    29
6867
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
    30
from logilab.common import nullobject
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
    31
from logilab.common.configuration import Configuration, merge_options
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
    32
from logilab.common.shellutils import ASK, generate_password
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    33
2790
968108e16066 move underline_title to toolsutils
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2711
diff changeset
    34
from cubicweb import AuthenticationError, ExecutionError, ConfigurationError
968108e16066 move underline_title to toolsutils
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2711
diff changeset
    35
from cubicweb.toolsutils import Command, CommandHandler, underline_title
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
    36
from cubicweb.cwctl import CWCTL, check_options_consistency, ConfigureInstanceCommand
2105
92ea410806fe refactor sources configuration, add source to sources when using a cube defining
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1980
diff changeset
    37
from cubicweb.server import SOURCE_TYPES
8350
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
    38
from cubicweb.server.repository import Repository
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
    39
from cubicweb.server.serverconfig import (
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
    40
    USER_OPTIONS, ServerConfiguration, SourceConfiguration,
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
    41
    ask_source_config, generate_source_config)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    42
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    43
# utility functions ###########################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    44
7112
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
    45
def source_cnx(source, dbname=None, special_privs=False, interactive=True):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    46
    """open and return a connection to the system database defined in the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
    given server.serverconfig
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    48
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    49
    from getpass import getpass
6060
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    50
    from logilab.database import get_connection, get_db_helper
4218
deb2dcffb301 [cwctl] reset-admin-pwd was failing when db-host was not set
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 4212
diff changeset
    51
    dbhost = source.get('db-host')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    52
    if dbname is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    53
        dbname = source['db-name']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    54
    driver = source['db-driver']
6060
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    55
    dbhelper = get_db_helper(driver)
7112
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
    56
    if interactive:
5754
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
    57
        print '-> connecting to %s database' % driver,
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
    58
        if dbhost:
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
    59
            print '%s@%s' % (dbname, dbhost),
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
    60
        else:
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
    61
            print dbname,
6060
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    62
    if dbhelper.users_support:
7112
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
    63
        if not interactive or (not special_privs and source.get('db-user')):
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
    64
            user = source.get('db-user', os.environ.get('USER', ''))
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
    65
            if interactive:
6060
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    66
                print 'as', user
6860
a0dbf6135c72 [db-create] we should always ask db user that should be used when special privileges are required
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6779
diff changeset
    67
            password = source.get('db-password')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    68
        else:
7112
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
    69
            print
6060
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    70
            if special_privs:
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    71
                print 'WARNING'
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    72
                print ('the user will need the following special access rights '
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    73
                       'on the database:')
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    74
                print special_privs
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    75
                print
6072
9d83b214066a [db-create] fix bug introduced by 6060:353bec342e2a (we ask for user while in non verbose mode)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6060
diff changeset
    76
            default_user = source.get('db-user', os.environ.get('USER', ''))
9d83b214066a [db-create] fix bug introduced by 6060:353bec342e2a (we ask for user while in non verbose mode)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6060
diff changeset
    77
            user = raw_input('Connect as user ? [%r]: ' % default_user)
6860
a0dbf6135c72 [db-create] we should always ask db user that should be used when special privileges are required
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6779
diff changeset
    78
            user = user.strip() or default_user
a0dbf6135c72 [db-create] we should always ask db user that should be used when special privileges are required
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6779
diff changeset
    79
            if user == source.get('db-user'):
6939
8fa55cf2a8cb [c-c] fix crash on delete instance + potential others when user don't specify db user's password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6867
diff changeset
    80
                password = source.get('db-password')
6072
9d83b214066a [db-create] fix bug introduced by 6060:353bec342e2a (we ask for user while in non verbose mode)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6060
diff changeset
    81
            else:
9d83b214066a [db-create] fix bug introduced by 6060:353bec342e2a (we ask for user while in non verbose mode)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6060
diff changeset
    82
                password = getpass('password: ')
6060
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    83
    else:
353bec342e2a [db create] don't ask user/password if the underlying db doesn't support it (eg sqlite)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5990
diff changeset
    84
        user = password = None
4180
9fb0d06926cc more extra_args cleanup
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4177
diff changeset
    85
    extra_args = source.get('db-extra-arguments')
9fb0d06926cc more extra_args cleanup
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4177
diff changeset
    86
    extra = extra_args and {'extra_args': extra_args} or {}
4837
54969eec48eb misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
    87
    cnx = get_connection(driver, dbhost, dbname, user, password=password,
54969eec48eb misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
    88
                         port=source.get('db-port'),
54969eec48eb misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
    89
                         **extra)
4845
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    90
    try:
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    91
        cnx.logged_user = user
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    92
    except AttributeError:
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    93
        # C object, __slots__
4848
41f84eea63c9 rename logilab.db into logilab.database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4845
diff changeset
    94
        from logilab.database import _SimpleConnectionWrapper
4845
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    95
        cnx = _SimpleConnectionWrapper(cnx)
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    96
        cnx.logged_user = user
4837
54969eec48eb misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
    97
    return cnx
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    98
136
ff51a18c66a3 ask less questions on instance creation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
    99
def system_source_cnx(source, dbms_system_base=False,
7112
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
   100
                      special_privs='CREATE/DROP DATABASE', interactive=True):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   101
    """shortcut to get a connextion to the instance system database
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   102
    defined in the given config. If <dbms_system_base> is True,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   103
    connect to the dbms system database instead (for task such as
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   104
    create/drop the instance database)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   105
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   106
    if dbms_system_base:
4848
41f84eea63c9 rename logilab.db into logilab.database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4845
diff changeset
   107
        from logilab.database import get_db_helper
4831
c5aec27c1bf7 [repo] use logilab.db instead of lgc.adbh/lgc.db/lgc.sqlgen/indexer, test new date extranction functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   108
        system_db = get_db_helper(source['db-driver']).system_database()
7112
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
   109
        return source_cnx(source, system_db, special_privs=special_privs,
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
   110
                          interactive=interactive)
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
   111
    return source_cnx(source, special_privs=special_privs,
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
   112
                      interactive=interactive)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   113
7112
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
   114
def _db_sys_cnx(source, special_privs, interactive=True):
6860
a0dbf6135c72 [db-create] we should always ask db user that should be used when special privileges are required
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6779
diff changeset
   115
    """return a connection on the RDMS system table (to create/drop a user or a
a0dbf6135c72 [db-create] we should always ask db user that should be used when special privileges are required
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6779
diff changeset
   116
    database)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   117
    """
2417
18a14c23413c should ensure lgc is configured to not use mx to avoid error if backend module is missing mx support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2107
diff changeset
   118
    import logilab.common as lgp
4848
41f84eea63c9 rename logilab.db into logilab.database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4845
diff changeset
   119
    from logilab.database import get_db_helper
2417
18a14c23413c should ensure lgc is configured to not use mx to avoid error if backend module is missing mx support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2107
diff changeset
   120
    lgp.USE_MX_DATETIME = False
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   121
    driver = source['db-driver']
4831
c5aec27c1bf7 [repo] use logilab.db instead of lgc.adbh/lgc.db/lgc.sqlgen/indexer, test new date extranction functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   122
    helper = get_db_helper(driver)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   123
    # connect on the dbms system base to create our base
6860
a0dbf6135c72 [db-create] we should always ask db user that should be used when special privileges are required
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6779
diff changeset
   124
    cnx = system_source_cnx(source, True, special_privs=special_privs,
7112
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
   125
                            interactive=interactive)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   126
    # disable autocommit (isolation_level(1)) because DROP and
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   127
    # CREATE DATABASE can't be executed in a transaction
7577
9892937d9041 [all] remove pattern "try: function() except AttributeError: pass" (closes #1787966)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 7569
diff changeset
   128
    set_isolation_level = getattr(cnx, 'set_isolation_level', None)
9892937d9041 [all] remove pattern "try: function() except AttributeError: pass" (closes #1787966)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 7569
diff changeset
   129
    if set_isolation_level is not None:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   130
        # set_isolation_level() is psycopg specific
7577
9892937d9041 [all] remove pattern "try: function() except AttributeError: pass" (closes #1787966)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 7569
diff changeset
   131
        set_isolation_level(0)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   132
    return cnx
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   133
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   134
def repo_cnx(config):
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   135
    """return a in-memory repository and a repoapi connection to it"""
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   136
    from cubicweb import repoapi
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   137
    from cubicweb.server.utils import manager_userpasswd
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   138
    try:
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9457
diff changeset
   139
        login = config.default_admin_config['login']
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9457
diff changeset
   140
        pwd = config.default_admin_config['password']
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   141
    except KeyError:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   142
        login, pwd = manager_userpasswd()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   143
    while True:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   144
        try:
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   145
            repo = repoapi.get_repository(config=config)
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   146
            cnx = repoapi.connect(repo, login, password=pwd)
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   147
            return repo, cnx
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   148
        except AuthenticationError:
2394
92bba46b853f [cw-ctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2107
diff changeset
   149
            print '-> Error: wrong user/password.'
1682
36bd5cba09de must reset cubes before next authentication
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents: 1469
diff changeset
   150
            # reset cubes else we'll have an assertion error on next retry
36bd5cba09de must reset cubes before next authentication
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents: 1469
diff changeset
   151
            config._cubes = None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   152
        login, pwd = manager_userpasswd()
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   153
3904
dc7d315165fc default_instance id should also be available when silently rebuilding soures file
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3893
diff changeset
   154
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   155
# repository specific command handlers ########################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   156
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   157
class RepositoryCreateHandler(CommandHandler):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   158
    cmdname = 'create'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   159
    cfgname = 'repository'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   160
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   161
    def bootstrap(self, cubes, automatic=False, inputlevel=0):
5967
8deedfeb7846 cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5814
diff changeset
   162
        """create an instance by copying files from the given cube and by asking
8deedfeb7846 cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5814
diff changeset
   163
        information necessary to build required configuration files
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   164
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   165
        config = self.config
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   166
        if not automatic:
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   167
            print underline_title('Configuring the repository')
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   168
            config.input_config('email', inputlevel)
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   169
            # ask for pyro configuration if pyro is activated and we're not
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   170
            # using a all-in-one config, in which case this is done by the web
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   171
            # side command handler
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   172
            if config.pyro_enabled() and config.name != 'all-in-one':
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   173
                config.input_config('pyro', inputlevel)
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   174
            print '\n'+underline_title('Configuring the sources')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   175
        sourcesfile = config.sources_file()
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   176
        # hack to make Method('default_instance_id') usable in db option defs
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   177
        # (in native.py)
6299
51a9494b5efb [sqlite] quick hacks to fix #1251873 and #1251874
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6184
diff changeset
   178
        sconfig = SourceConfiguration(config,
3904
dc7d315165fc default_instance id should also be available when silently rebuilding soures file
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3893
diff changeset
   179
                                      options=SOURCE_TYPES['native'].options)
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   180
        if not automatic:
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   181
            sconfig.input_config(inputlevel=inputlevel)
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   182
            print
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   183
        sourcescfg = {'system': sconfig}
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   184
        if automatic:
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   185
            # XXX modify a copy
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   186
            password = generate_password()
7155
4bab50b02927 [cwctl] refactor ui messages aiming for consistency and simplicity
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 7140
diff changeset
   187
            print '-> set administrator account to admin / %s' % password
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   188
            USER_OPTIONS[1][1]['default'] = password
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   189
            sconfig = Configuration(options=USER_OPTIONS)
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   190
        else:
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   191
            sconfig = Configuration(options=USER_OPTIONS)
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   192
            sconfig.input_config(inputlevel=inputlevel)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   193
        sourcescfg['admin'] = sconfig
2105
92ea410806fe refactor sources configuration, add source to sources when using a cube defining
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1980
diff changeset
   194
        config.write_sources_file(sourcescfg)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   195
        # remember selected cubes for later initialization of the database
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   196
        config.write_bootstrap_cubes_file(cubes)
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   197
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   198
    def postcreate(self, automatic=False, inputlevel=0):
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   199
        if automatic:
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   200
            CWCTL.run(['db-create', '--automatic', self.config.appid])
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   201
        elif ASK.confirm('Run db-create to create the system database ?'):
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   202
            CWCTL.run(['db-create', '--config-level', str(inputlevel),
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   203
                       self.config.appid])
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   204
        else:
2395
e3093fc12a00 [cw-ctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2394
diff changeset
   205
            print ('-> nevermind, you can do it later with '
e3093fc12a00 [cw-ctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2394
diff changeset
   206
                   '"cubicweb-ctl db-create %s".' % self.config.appid)
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   207
6867
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   208
ERROR = nullobject()
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   209
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   210
def confirm_on_error_or_die(msg, func, *args, **kwargs):
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   211
    try:
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   212
        return func(*args, **kwargs)
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8669
diff changeset
   213
    except Exception as ex:
6867
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   214
        print 'ERROR', ex
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   215
        if not ASK.confirm('An error occurred while %s. Continue anyway?' % msg):
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   216
            raise ExecutionError(str(ex))
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   217
    return ERROR
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   218
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   219
class RepositoryDeleteHandler(CommandHandler):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   220
    cmdname = 'delete'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   221
    cfgname = 'repository'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   222
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   223
    def cleanup(self):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   224
        """remove instance's configuration and database"""
4848
41f84eea63c9 rename logilab.db into logilab.database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4845
diff changeset
   225
        from logilab.database import get_db_helper
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9457
diff changeset
   226
        source = self.config.system_source_config
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   227
        dbname = source['db-name']
4831
c5aec27c1bf7 [repo] use logilab.db instead of lgc.adbh/lgc.db/lgc.sqlgen/indexer, test new date extranction functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   228
        helper = get_db_helper(source['db-driver'])
2615
1ea41b7c0836 F [dialog] offer to create backup. refactor to use l.c.shellutils.ASK
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2507
diff changeset
   229
        if ASK.confirm('Delete database %s ?' % dbname):
6299
51a9494b5efb [sqlite] quick hacks to fix #1251873 and #1251874
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6184
diff changeset
   230
            if source['db-driver'] == 'sqlite':
6867
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   231
                if confirm_on_error_or_die(
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   232
                    'deleting database file %s' % dbname,
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   233
                    os.unlink, source['db-name']) is not ERROR:
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   234
                    print '-> database %s dropped.' % dbname
6299
51a9494b5efb [sqlite] quick hacks to fix #1251873 and #1251874
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6184
diff changeset
   235
                return
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   236
            user = source['db-user'] or None
6867
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   237
            cnx = confirm_on_error_or_die('connecting to database %s' % dbname,
6939
8fa55cf2a8cb [c-c] fix crash on delete instance + potential others when user don't specify db user's password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6867
diff changeset
   238
                                          _db_sys_cnx, source, 'DROP DATABASE')
6867
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   239
            if cnx is ERROR:
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   240
                return
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   241
            cursor = cnx.cursor()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   242
            try:
6867
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   243
                if confirm_on_error_or_die(
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   244
                    'dropping database %s' % dbname,
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   245
                    cursor.execute, 'DROP DATABASE "%s"' % dbname) is not ERROR:
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   246
                    print '-> database %s dropped.' % dbname
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   247
                # XXX should check we are not connected as user
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   248
                if user and helper.users_support and \
2615
1ea41b7c0836 F [dialog] offer to create backup. refactor to use l.c.shellutils.ASK
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2507
diff changeset
   249
                       ASK.confirm('Delete user %s ?' % user, default_is_yes=False):
6867
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   250
                    if confirm_on_error_or_die(
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   251
                        'dropping user %s' % user,
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   252
                        cursor.execute, 'DROP USER %s' % user) is not ERROR:
f691757792f9 [c-c delete] closes #1433117 and other flavours where we don't want to crash on error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6863
diff changeset
   253
                        print '-> user %s dropped.' % user
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   254
                cnx.commit()
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7764
diff changeset
   255
            except BaseException:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   256
                cnx.rollback()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   257
                raise
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   258
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   259
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   260
class RepositoryStartHandler(CommandHandler):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   261
    cmdname = 'start'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   262
    cfgname = 'repository'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   263
5814
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   264
    def start_server(self, config):
8233
9b9180969892 [c-c] use subprocess instead of os.system to start repository
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7815
diff changeset
   265
        command = ['cubicweb-ctl', 'start-repository']
5814
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   266
        if config.debugmode:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   267
            command.append('--debug')
8233
9b9180969892 [c-c] use subprocess instead of os.system to start repository
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7815
diff changeset
   268
        command.append('--loglevel')
9b9180969892 [c-c] use subprocess instead of os.system to start repository
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7815
diff changeset
   269
        command.append(config['log-threshold'].lower())
5814
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   270
        command.append(config.appid)
8233
9b9180969892 [c-c] use subprocess instead of os.system to start repository
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7815
diff changeset
   271
        subprocess.call(command)
6778
7dd4835d5198 properly tell we've started an instance (close #1391262)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6700
diff changeset
   272
        return 1
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   273
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   274
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   275
class RepositoryStopHandler(CommandHandler):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   276
    cmdname = 'stop'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   277
    cfgname = 'repository'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   278
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   279
    def poststop(self):
5814
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   280
        """if pyro is enabled, ensure the repository is correctly unregistered
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   281
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   282
        if self.config.pyro_enabled():
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   283
            from cubicweb.server.repository import pyro_unregister
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   284
            pyro_unregister(self.config)
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   285
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   286
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   287
# repository specific commands ################################################
3954
56a8b14d68aa properly fail if user has entered wrong connection information for the system database, closes #549136
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3904
diff changeset
   288
5754
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   289
def createdb(helper, source, dbcnx, cursor, **kwargs):
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   290
    if dbcnx.logged_user != source['db-user']:
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   291
        helper.create_database(cursor, source['db-name'], source['db-user'],
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   292
                               source['db-encoding'], **kwargs)
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   293
    else:
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   294
        helper.create_database(cursor, source['db-name'],
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   295
                               dbencoding=source['db-encoding'], **kwargs)
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   296
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   297
class CreateInstanceDBCommand(Command):
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   298
    """Create the system database of an instance (run after 'create').
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   299
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   300
    You will be prompted for a login / password to use to connect to
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   301
    the system database.  The given user should have almost all rights
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   302
    on the database (ie a super user on the DBMS allowed to create
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   303
    database, users, languages...).
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   304
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   305
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   306
      the identifier of the instance to initialize.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   307
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   308
    name = 'db-create'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   309
    arguments = '<instance>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   310
    min_args = max_args = 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   311
    options = (
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   312
        ('automatic',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   313
         {'short': 'a', 'action' : 'store_true',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   314
          'default': False,
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   315
          'help': 'automatic mode: never ask and use default answer to every '
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   316
          'question. this may require that your login match a database super '
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   317
          'user (allowed to create database & all).',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   318
          }),
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   319
        ('config-level',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   320
         {'short': 'l', 'type' : 'int', 'metavar': '<level>',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   321
          'default': 0,
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   322
          'help': 'configuration level (0..2): 0 will ask for essential '
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   323
          'configuration parameters only while 2 will ask for all parameters',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   324
          }),
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   325
        ('create-db',
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   326
         {'short': 'c', 'type': 'yn', 'metavar': '<y or n>',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   327
          'default': True,
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   328
          'help': 'create the database (yes by default)'
7112
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7061
diff changeset
   329
          }),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   330
        )
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   331
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   332
    def run(self, args):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   333
        """run the command with its specific arguments"""
4848
41f84eea63c9 rename logilab.db into logilab.database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4845
diff changeset
   334
        from logilab.database import get_db_helper
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   335
        check_options_consistency(self.config)
2969
d95f23a0fc3b F add --automatic/-a option to run db-create without user input
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2851
diff changeset
   336
        automatic = self.get('automatic')
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   337
        appid = args.pop()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   338
        config = ServerConfiguration.config_for(appid)
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9457
diff changeset
   339
        source = config.system_source_config
4197
5446c74189b6 quick and dirty fix to avoid crash when running db-create command with an sqlite source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4180
diff changeset
   340
        dbname = source['db-name']
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   341
        driver = source['db-driver']
4831
c5aec27c1bf7 [repo] use logilab.db instead of lgc.adbh/lgc.db/lgc.sqlgen/indexer, test new date extranction functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   342
        helper = get_db_helper(driver)
4197
5446c74189b6 quick and dirty fix to avoid crash when running db-create command with an sqlite source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4180
diff changeset
   343
        if driver == 'sqlite':
5585
e1cbf6b304ea [sqlite] fix crash on db-create with sqlite abd unexistent database due to missing paren in logical expression (closes #909604)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5553
diff changeset
   344
            if os.path.exists(dbname) and (
e1cbf6b304ea [sqlite] fix crash on db-create with sqlite abd unexistent database due to missing paren in logical expression (closes #909604)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5553
diff changeset
   345
                automatic or
e1cbf6b304ea [sqlite] fix crash on db-create with sqlite abd unexistent database due to missing paren in logical expression (closes #909604)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5553
diff changeset
   346
                ASK.confirm('Database %s already exists. Drop it?' % dbname)):
4197
5446c74189b6 quick and dirty fix to avoid crash when running db-create command with an sqlite source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4180
diff changeset
   347
                os.unlink(dbname)
5754
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   348
        elif self.config.create_db:
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   349
            print '\n'+underline_title('Creating the system database')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   350
            # connect on the dbms system base to create our base
6939
8fa55cf2a8cb [c-c] fix crash on delete instance + potential others when user don't specify db user's password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6867
diff changeset
   351
            dbcnx = _db_sys_cnx(source, 'CREATE/DROP DATABASE and / or USER',
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   352
                                interactive=not automatic)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   353
            cursor = dbcnx.cursor()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   354
            try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   355
                if helper.users_support:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   356
                    user = source['db-user']
2969
d95f23a0fc3b F add --automatic/-a option to run db-create without user input
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2851
diff changeset
   357
                    if not helper.user_exists(cursor, user) and (automatic or \
d95f23a0fc3b F add --automatic/-a option to run db-create without user input
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2851
diff changeset
   358
                           ASK.confirm('Create db user %s ?' % user, default_is_yes=False)):
6939
8fa55cf2a8cb [c-c] fix crash on delete instance + potential others when user don't specify db user's password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6867
diff changeset
   359
                        helper.create_user(source['db-user'], source.get('db-password'))
2394
92bba46b853f [cw-ctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2107
diff changeset
   360
                        print '-> user %s created.' % user
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   361
                if dbname in helper.list_databases(cursor):
2969
d95f23a0fc3b F add --automatic/-a option to run db-create without user input
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2851
diff changeset
   362
                    if automatic or ASK.confirm('Database %s already exists -- do you want to drop it ?' % dbname):
7564
1d64c8d33156 [server] "overrule" case insensitivity of database name (closes: #611294)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7342
diff changeset
   363
                        cursor.execute('DROP DATABASE "%s"' % dbname)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   364
                    else:
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   365
                        print ('you may want to run "cubicweb-ctl db-init '
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   366
                               '--drop %s" manually to continue.' % config.appid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   367
                        return
5754
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   368
                createdb(helper, source, dbcnx, cursor)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   369
                dbcnx.commit()
4197
5446c74189b6 quick and dirty fix to avoid crash when running db-create command with an sqlite source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4180
diff changeset
   370
                print '-> database %s created.' % dbname
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7764
diff changeset
   371
            except BaseException:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   372
                dbcnx.rollback()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   373
                raise
6860
a0dbf6135c72 [db-create] we should always ask db user that should be used when special privileges are required
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6779
diff changeset
   374
        cnx = system_source_cnx(source, special_privs='CREATE LANGUAGE',
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   375
                                interactive=not automatic)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   376
        cursor = cnx.cursor()
4886
18a1735c283c [db creation] fix some bugs introduced by the migration to logilab.database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4848
diff changeset
   377
        helper.init_fti_extensions(cursor)
7479
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   378
        cnx.commit()
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   379
        # postgres specific stuff
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   380
        if driver == 'postgres':
7479
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   381
            # install plpythonu/plpgsql languages
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   382
            langs = ('plpythonu', 'plpgsql')
3115
29262ba01464 minimal steps to have cw running on windows
Aurélien Campéas
parents: 2969
diff changeset
   383
            for extlang in langs:
7479
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   384
                if automatic or ASK.confirm('Create language %s ?' % extlang):
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   385
                    try:
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   386
                        helper.create_language(cursor, extlang)
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8669
diff changeset
   387
                    except Exception as exc:
7479
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   388
                        print '-> ERROR:', exc
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   389
                        print '-> could not create language %s, some stored procedures might be unusable' % extlang
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   390
                        cnx.rollback()
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   391
                    else:
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   392
                        cnx.commit()
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   393
        print '-> database for instance %s created and necessary extensions installed.' % appid
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   394
        print
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   395
        if automatic:
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   396
            CWCTL.run(['db-init', '--automatic', '--config-level', '0',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   397
                       config.appid])
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   398
        elif ASK.confirm('Run db-init to initialize the system database ?'):
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   399
            CWCTL.run(['db-init', '--config-level',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   400
                       str(self.config.config_level), config.appid])
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   401
        else:
2395
e3093fc12a00 [cw-ctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2394
diff changeset
   402
            print ('-> nevermind, you can do it later with '
3893
74f216b69628 fix buglet
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3835
diff changeset
   403
                   '"cubicweb-ctl db-init %s".' % config.appid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   404
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   405
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   406
class InitInstanceCommand(Command):
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   407
    """Initialize the system database of an instance (run after 'db-create').
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   408
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   409
    Notice this will be done using user specified in the sources files, so this
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   410
    user should have the create tables grant permissions on the database.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   411
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   412
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   413
      the identifier of the instance to initialize.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   414
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   415
    name = 'db-init'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   416
    arguments = '<instance>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   417
    min_args = max_args = 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   418
    options = (
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   419
        ('automatic',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   420
         {'short': 'a', 'action' : 'store_true',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   421
          'default': False,
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   422
          'help': 'automatic mode: never ask and use default answer to every '
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   423
          'question.',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   424
          }),
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   425
        ('config-level',
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   426
         {'short': 'l', 'type': 'int', 'default': 1,
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   427
          'help': 'level threshold for questions asked when configuring '
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   428
          'another source'
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   429
          }),
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   430
        ('drop',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   431
         {'short': 'd', 'action': 'store_true',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   432
          'default': False,
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   433
          'help': 'insert drop statements to remove previously existant '
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   434
          'tables, indexes... (no by default)'
7030
d48c6b0158b9 allow configuring the level of the configuration settings for cw-ctl add-source and db-init (which may call add-source)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6939
diff changeset
   435
          }),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   436
        )
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   437
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   438
    def run(self, args):
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   439
        check_options_consistency(self.config)
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   440
        print '\n'+underline_title('Initializing the system database')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   441
        from cubicweb.server import init_repository
5586
aabe082fee02 [c-c] use logilab.database, not lgc.db
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5585
diff changeset
   442
        from logilab.database import get_connection
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   443
        appid = args[0]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   444
        config = ServerConfiguration.config_for(appid)
3954
56a8b14d68aa properly fail if user has entered wrong connection information for the system database, closes #549136
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3904
diff changeset
   445
        try:
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9457
diff changeset
   446
            system = config.system_source_config
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8544
diff changeset
   447
            extra_args = system.get('db-extra-arguments')
4180
9fb0d06926cc more extra_args cleanup
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4177
diff changeset
   448
            extra = extra_args and {'extra_args': extra_args} or {}
3954
56a8b14d68aa properly fail if user has entered wrong connection information for the system database, closes #549136
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3904
diff changeset
   449
            get_connection(
56a8b14d68aa properly fail if user has entered wrong connection information for the system database, closes #549136
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3904
diff changeset
   450
                system['db-driver'], database=system['db-name'],
56a8b14d68aa properly fail if user has entered wrong connection information for the system database, closes #549136
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3904
diff changeset
   451
                host=system.get('db-host'), port=system.get('db-port'),
8434
39c5bb4dcc59 [ldapfeed] do not crash on ldap user deletion + pull + already deactivated users, cleanups (closes #2392933)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8376
diff changeset
   452
                user=system.get('db-user') or '', password=system.get('db-password') or '',
4180
9fb0d06926cc more extra_args cleanup
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4177
diff changeset
   453
                **extra)
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8669
diff changeset
   454
        except Exception as ex:
3954
56a8b14d68aa properly fail if user has entered wrong connection information for the system database, closes #549136
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3904
diff changeset
   455
            raise ConfigurationError(
56a8b14d68aa properly fail if user has entered wrong connection information for the system database, closes #549136
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3904
diff changeset
   456
                'You seem to have provided wrong connection information in '\
56a8b14d68aa properly fail if user has entered wrong connection information for the system database, closes #549136
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3904
diff changeset
   457
                'the %s file. Resolve this first (error: %s).'
56a8b14d68aa properly fail if user has entered wrong connection information for the system database, closes #549136
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3904
diff changeset
   458
                % (config.sources_file(), str(ex).strip()))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   459
        init_repository(config, drop=self.config.drop)
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   460
        if not self.config.automatic:
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   461
            while ASK.confirm('Enter another source ?', default_is_yes=False):
9759
846bc9227394 [serverctl] rename 'add-source' to 'source-add' for consistency's sake (closes #3732169)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 9577
diff changeset
   462
                CWCTL.run(['source-add', '--config-level',
7140
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   463
                           str(self.config.config_level), config.appid])
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   464
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   465
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   466
class AddSourceCommand(Command):
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   467
    """Add a data source to an instance.
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   468
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   469
    <instance>
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   470
      the identifier of the instance to initialize.
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   471
    """
9759
846bc9227394 [serverctl] rename 'add-source' to 'source-add' for consistency's sake (closes #3732169)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 9577
diff changeset
   472
    name = 'source-add'
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   473
    arguments = '<instance>'
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   474
    min_args = max_args = 1
7030
d48c6b0158b9 allow configuring the level of the configuration settings for cw-ctl add-source and db-init (which may call add-source)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6939
diff changeset
   475
    options = (
d48c6b0158b9 allow configuring the level of the configuration settings for cw-ctl add-source and db-init (which may call add-source)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6939
diff changeset
   476
        ('config-level',
d48c6b0158b9 allow configuring the level of the configuration settings for cw-ctl add-source and db-init (which may call add-source)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6939
diff changeset
   477
         {'short': 'l', 'type': 'int', 'default': 1,
d48c6b0158b9 allow configuring the level of the configuration settings for cw-ctl add-source and db-init (which may call add-source)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6939
diff changeset
   478
          'help': 'level threshold for questions asked when configuring another source'
d48c6b0158b9 allow configuring the level of the configuration settings for cw-ctl add-source and db-init (which may call add-source)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6939
diff changeset
   479
          }),
d48c6b0158b9 allow configuring the level of the configuration settings for cw-ctl add-source and db-init (which may call add-source)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6939
diff changeset
   480
        )
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   481
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   482
    def run(self, args):
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   483
        appid = args[0]
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   484
        config = ServerConfiguration.config_for(appid)
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   485
        config.quick_start = True
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   486
        repo, cnx = repo_cnx(config)
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   487
        with cnx:
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   488
            used = set(n for n, in cnx.execute('Any SN WHERE S is CWSource, S name SN'))
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   489
            cubes = repo.get_cubes()
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   490
            while True:
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   491
                type = raw_input('source type (%s): '
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   492
                                    % ', '.join(sorted(SOURCE_TYPES)))
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   493
                if type not in SOURCE_TYPES:
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   494
                    print '-> unknown source type, use one of the available types.'
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   495
                    continue
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   496
                sourcemodule = SOURCE_TYPES[type].module
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   497
                if not sourcemodule.startswith('cubicweb.'):
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   498
                    # module names look like cubes.mycube.themodule
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   499
                    sourcecube = SOURCE_TYPES[type].module.split('.', 2)[1]
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   500
                    # if the source adapter is coming from an external component,
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   501
                    # ensure it's specified in used cubes
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   502
                    if not sourcecube in cubes:
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   503
                        print ('-> this source type require the %s cube which is '
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   504
                               'not used by the instance.')
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   505
                        continue
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   506
                break
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   507
            while True:
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   508
                sourceuri = raw_input('source identifier (a unique name used to '
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   509
                                      'tell sources apart): ').strip()
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   510
                if not sourceuri:
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   511
                    print '-> mandatory.'
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   512
                else:
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   513
                    sourceuri = unicode(sourceuri, sys.stdin.encoding)
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   514
                    if sourceuri in used:
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   515
                        print '-> uri already used, choose another one.'
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   516
                    else:
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   517
                        break
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   518
            # XXX configurable inputlevel
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   519
            sconfig = ask_source_config(config, type, inputlevel=self.config.config_level)
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   520
            cfgstr = unicode(generate_source_config(sconfig), sys.stdin.encoding)
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   521
            cnx.create_entity('CWSource', name=sourceuri,
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   522
                              type=unicode(type), config=cfgstr)
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   523
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   524
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   525
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   526
class GrantUserOnInstanceCommand(Command):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   527
    """Grant a database user on a repository system database.
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   528
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   529
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   530
      the identifier of the instance
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   531
    <user>
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   532
      the database's user requiring grant access
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   533
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   534
    name = 'db-grant-user'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   535
    arguments = '<instance> <user>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   536
    min_args = max_args = 2
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   537
    options = (
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   538
        ('set-owner',
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   539
         {'short': 'o', 'type' : 'yn', 'metavar' : '<yes or no>',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   540
          'default' : False,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   541
          'help': 'Set the user as tables owner if yes (no by default).'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   542
         ),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   543
        )
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   544
    def run(self, args):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   545
        """run the command with its specific arguments"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   546
        from cubicweb.server.sqlutils import sqlexec, sqlgrants
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   547
        appid, user = args
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   548
        config = ServerConfiguration.config_for(appid)
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9457
diff changeset
   549
        source = config.system_source_config
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   550
        set_owner = self.config.set_owner
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   551
        cnx = system_source_cnx(source, special_privs='GRANT')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   552
        cursor = cnx.cursor()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   553
        schema = config.load_schema()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   554
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   555
            sqlexec(sqlgrants(schema, source['db-driver'], user,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   556
                              set_owner=set_owner), cursor)
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8669
diff changeset
   557
        except Exception as ex:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   558
            cnx.rollback()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   559
            import traceback
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   560
            traceback.print_exc()
6109
47d9c0e0f7b7 integrate Celso's work on translation file: proper/complete spanish translation, fixed some typos in french translation, occured -> occurred fix in various places
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6072
diff changeset
   561
            print '-> an error occurred:', ex
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   562
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   563
            cnx.commit()
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   564
            print '-> rights granted to %s on instance %s.' % (appid, user)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   565
3954
56a8b14d68aa properly fail if user has entered wrong connection information for the system database, closes #549136
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3904
diff changeset
   566
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   567
class ResetAdminPasswordCommand(Command):
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   568
    """Reset the administrator password.
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   569
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   570
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   571
      the identifier of the instance
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   572
    """
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   573
    name = 'reset-admin-pwd'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   574
    arguments = '<instance>'
7669
b96c41c6de4d [cwctl] set min/max args for reset admin password command. Closes #1832986
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 7595
diff changeset
   575
    min_args = max_args = 1
7594
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   576
    options = (
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   577
        ('password',
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   578
         {'short': 'p', 'type' : 'string', 'metavar' : '<new-password>',
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   579
          'default' : None,
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   580
          'help': 'Use this password instead of prompt for one.\n'
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   581
                  '/!\ THIS IS AN INSECURE PRACTICE /!\ \n'
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   582
                  'the password will appear in shell history'}
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   583
         ),
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   584
        )
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   585
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   586
    def run(self, args):
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   587
        """run the command with its specific arguments"""
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   588
        from cubicweb.server.utils import crypt_password, manager_userpasswd
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   589
        appid = args[0]
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   590
        config = ServerConfiguration.config_for(appid)
2105
92ea410806fe refactor sources configuration, add source to sources when using a cube defining
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1980
diff changeset
   591
        sourcescfg = config.read_sources_file()
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   592
        try:
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   593
            adminlogin = sourcescfg['admin']['login']
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   594
        except KeyError:
2394
92bba46b853f [cw-ctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2107
diff changeset
   595
            print '-> Error: could not get cubicweb administrator login.'
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   596
            sys.exit(1)
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   597
        cnx = source_cnx(sourcescfg['system'])
6379
3f67f7ea5632 [R] use dbhelper.binary_value to process passwords and other Bytes fields
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6351
diff changeset
   598
        driver = sourcescfg['system']['db-driver']
3f67f7ea5632 [R] use dbhelper.binary_value to process passwords and other Bytes fields
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6351
diff changeset
   599
        from logilab.database import get_db_helper
3f67f7ea5632 [R] use dbhelper.binary_value to process passwords and other Bytes fields
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6351
diff changeset
   600
        dbhelper = get_db_helper(driver)
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   601
        cursor = cnx.cursor()
4670
48ba6f820fae fix #615379 by checking admin user exists instead of making think everything is fine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   602
        # check admin exists
48ba6f820fae fix #615379 by checking admin user exists instead of making think everything is fine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   603
        cursor.execute("SELECT * FROM cw_CWUser WHERE cw_login=%(l)s",
48ba6f820fae fix #615379 by checking admin user exists instead of making think everything is fine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   604
                       {'l': adminlogin})
48ba6f820fae fix #615379 by checking admin user exists instead of making think everything is fine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   605
        if not cursor.fetchall():
48ba6f820fae fix #615379 by checking admin user exists instead of making think everything is fine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   606
            print ("-> error: admin user %r specified in sources doesn't exist "
48ba6f820fae fix #615379 by checking admin user exists instead of making think everything is fine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   607
                   "in the database" % adminlogin)
48ba6f820fae fix #615379 by checking admin user exists instead of making think everything is fine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   608
            print "   fix your sources file before running this command"
48ba6f820fae fix #615379 by checking admin user exists instead of making think everything is fine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   609
            cnx.close()
48ba6f820fae fix #615379 by checking admin user exists instead of making think everything is fine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   610
            sys.exit(1)
7594
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   611
        if self.config.password is None:
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   612
            # ask for a new password
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   613
            msg = 'new password for %s' % adminlogin
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   614
            _, pwd = manager_userpasswd(adminlogin, confirm=True, passwdmsg=msg)
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   615
        else:
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   616
            pwd = self.config.password
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   617
        try:
4670
48ba6f820fae fix #615379 by checking admin user exists instead of making think everything is fine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   618
            cursor.execute("UPDATE cw_CWUser SET cw_upassword=%(p)s WHERE cw_login=%(l)s",
7594
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   619
                           {'p': dbhelper.binary_value(crypt_password(pwd)), 'l': adminlogin})
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   620
            sconfig = Configuration(options=USER_OPTIONS)
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   621
            sconfig['login'] = adminlogin
7594
d177c0755b10 [cwc shell] add ``--password`` option to ``reset-admin-pwd`` (close #1794866)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7564
diff changeset
   622
            sconfig['password'] = pwd
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   623
            sourcescfg['admin'] = sconfig
2105
92ea410806fe refactor sources configuration, add source to sources when using a cube defining
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1980
diff changeset
   624
            config.write_sources_file(sourcescfg)
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8669
diff changeset
   625
        except Exception as ex:
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   626
            cnx.rollback()
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   627
            import traceback
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   628
            traceback.print_exc()
6109
47d9c0e0f7b7 integrate Celso's work on translation file: proper/complete spanish translation, fixed some typos in french translation, occured -> occurred fix in various places
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6072
diff changeset
   629
            print '-> an error occurred:', ex
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   630
        else:
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   631
            cnx.commit()
2394
92bba46b853f [cw-ctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2107
diff changeset
   632
            print '-> password reset, sources file regenerated.'
4670
48ba6f820fae fix #615379 by checking admin user exists instead of making think everything is fine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   633
        cnx.close()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   634
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   635
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   636
class StartRepositoryCommand(Command):
6700
accb7290a31c fix typo
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 6427
diff changeset
   637
    """Start a CubicWeb RQL server for a given instance.
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   638
8350
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   639
    The server will be remotely accessible through pyro or ZMQ
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   640
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   641
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   642
      the identifier of the instance to initialize.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   643
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   644
    name = 'start-repository'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   645
    arguments = '<instance>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   646
    min_args = max_args = 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   647
    options = (
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   648
        ('debug',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   649
         {'short': 'D', 'action' : 'store_true',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   650
          'help': 'start server in debug mode.'}),
5814
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   651
        ('loglevel',
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   652
         {'short': 'l', 'type' : 'choice', 'metavar': '<log level>',
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   653
          'default': None, 'choices': ('debug', 'info', 'warning', 'error'),
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   654
          'help': 'debug if -D is set, error otherwise',
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   655
          }),
8350
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   656
        ('address',
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   657
         {'short': 'a', 'type': 'string', 'metavar': '<protocol>://<host>:<port>',
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   658
          'default': '',
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   659
          'help': ('specify a ZMQ URI on which to bind, or use "pyro://"'
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   660
                   'to create a pyro-based repository'),
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   661
          }),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   662
        )
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   663
8350
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   664
    def create_repo(self, config):
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   665
        address = self['address']
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   666
        if not address:
8376
f42dcb798142 [serverctl] avoid a crash if zmq-address is not defined/empty (config.get is a false friend wrt dict behaviour)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8350
diff changeset
   667
            address = config.get('zmq-repository-address') or 'pyro://'
8350
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   668
        if address.startswith('pyro://'):
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   669
            from cubicweb.server.server import RepositoryServer
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   670
            return RepositoryServer(config), config['host']
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   671
        else:
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   672
            from cubicweb.server.utils import TasksManager
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   673
            from cubicweb.server.cwzmq import ZMQRepositoryServer
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   674
            repo = Repository(config, TasksManager())
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   675
            return ZMQRepositoryServer(repo), address
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   676
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   677
    def run(self, args):
7764
c709f6c457ff Drop privileges properly (closes #1910561)
Julien Cristau <julien.cristau@logilab.fr>
parents: 7669
diff changeset
   678
        from logilab.common.daemon import daemonize, setugid
5814
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   679
        from cubicweb.cwctl import init_cmdline_log_threshold
9890
57e2cffa6329 Add warning messages when enabling remote pickle-based repository access
Julien Cristau <julien.cristau@logilab.fr>
parents: 9797
diff changeset
   680
        print 'WARNING: Standalone repository with pyro or zmq access is deprecated'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   681
        appid = args[0]
5814
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   682
        debug = self['debug']
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   683
        if sys.platform == 'win32' and not debug:
7457
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
   684
            logger = logging.getLogger('cubicweb.ctl')
5814
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   685
            logger.info('Forcing debug mode on win32 platform')
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   686
            debug = True
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   687
        config = ServerConfiguration.config_for(appid, debugmode=debug)
51cc4b61f9ae [repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5754
diff changeset
   688
        init_cmdline_log_threshold(config, self['loglevel'])
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   689
        # create the server
8350
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   690
        server, address = self.create_repo(config)
2711
7aee3bd7a704 ensure runtime dir exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2682
diff changeset
   691
        # ensure the directory where the pid-file should be set exists (for
7aee3bd7a704 ensure runtime dir exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2682
diff changeset
   692
        # instance /var/run/cubicweb may be deleted on computer restart)
5692
59ceed788bdb [repo server] fix startup bug, lgc.daemon.daemonize return 1 for the parent process, not -1
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5586
diff changeset
   693
        pidfile = config['pid-file']
2711
7aee3bd7a704 ensure runtime dir exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2682
diff changeset
   694
        piddir = os.path.dirname(pidfile)
5692
59ceed788bdb [repo server] fix startup bug, lgc.daemon.daemonize return 1 for the parent process, not -1
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5586
diff changeset
   695
        # go ! (don't daemonize in debug mode)
2711
7aee3bd7a704 ensure runtime dir exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2682
diff changeset
   696
        if not os.path.exists(piddir):
7aee3bd7a704 ensure runtime dir exists
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2682
diff changeset
   697
            os.makedirs(piddir)
6779
accf5978a440 [daemon] make process umask configurable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6778
diff changeset
   698
        if not debug and daemonize(pidfile, umask=config['umask']):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   699
            return
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   700
        uid = config['uid']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   701
        if uid is not None:
7764
c709f6c457ff Drop privileges properly (closes #1910561)
Julien Cristau <julien.cristau@logilab.fr>
parents: 7669
diff changeset
   702
            setugid(uid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   703
        server.install_sig_handlers()
8350
e1c05bf6fdeb [zmq] Implement a ZMQ-based Repository (closes #2290125)
David Douard <david.douard@logilab.fr>
parents: 8233
diff changeset
   704
        server.connect(address)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   705
        server.run()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   706
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   707
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   708
def _remote_dump(host, appid, output, sudo=False):
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   709
    # XXX generate unique/portable file name
2837
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   710
    from datetime import date
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   711
    filename = '%s-%s.tgz' % (appid, date.today().strftime('%Y-%m-%d'))
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   712
    dmpcmd = 'cubicweb-ctl db-dump -o /tmp/%s %s' % (filename, appid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   713
    if sudo:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   714
        dmpcmd = 'sudo %s' % (dmpcmd)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   715
    dmpcmd = 'ssh -t %s "%s"' % (host, dmpcmd)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   716
    print dmpcmd
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   717
    if os.system(dmpcmd):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   718
        raise ExecutionError('Error while dumping the database')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   719
    if output is None:
2837
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   720
        output = filename
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   721
    cmd = 'scp %s:/tmp/%s %s' % (host, filename, output)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   722
    print cmd
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   723
    if os.system(cmd):
2837
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   724
        raise ExecutionError('Error while retrieving the dump at /tmp/%s' % filename)
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   725
    rmcmd = 'ssh -t %s "rm -f /tmp/%s"' % (host, filename)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   726
    print rmcmd
2615
1ea41b7c0836 F [dialog] offer to create backup. refactor to use l.c.shellutils.ASK
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2507
diff changeset
   727
    if os.system(rmcmd) and not ASK.confirm(
6109
47d9c0e0f7b7 integrate Celso's work on translation file: proper/complete spanish translation, fixed some typos in french translation, occured -> occurred fix in various places
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6072
diff changeset
   728
        'An error occurred while deleting remote dump at /tmp/%s. '
2837
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   729
        'Continue anyway?' % filename):
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   730
        raise ExecutionError('Error while deleting remote dump at /tmp/%s' % filename)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   731
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   732
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   733
def _local_dump(appid, output, format='native'):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   734
    config = ServerConfiguration.config_for(appid)
5043
fe52dd3936cf [repo config] cleanup read_instance_schema / bootstrap_schema / creating mess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5033
diff changeset
   735
    config.quick_start = True
fe52dd3936cf [repo config] cleanup read_instance_schema / bootstrap_schema / creating mess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5033
diff changeset
   736
    mih = config.migration_handler(connect=False, verbosity=1)
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   737
    mih.backup_database(output, askconfirm=False, format=format)
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   738
    mih.shutdown()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   739
9457
d5ed6efd6448 [c-c restore] drop useless restore-all option, and related systemonly argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9303
diff changeset
   740
def _local_restore(appid, backupfile, drop, format='native'):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   741
    config = ServerConfiguration.config_for(appid)
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   742
    config.verbosity = 1 # else we won't be asked for confirmation on problems
5043
fe52dd3936cf [repo config] cleanup read_instance_schema / bootstrap_schema / creating mess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5033
diff changeset
   743
    config.quick_start = True
fe52dd3936cf [repo config] cleanup read_instance_schema / bootstrap_schema / creating mess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5033
diff changeset
   744
    mih = config.migration_handler(connect=False, verbosity=1)
9457
d5ed6efd6448 [c-c restore] drop useless restore-all option, and related systemonly argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9303
diff changeset
   745
    mih.restore_database(backupfile, drop, askconfirm=False, format=format)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   746
    repo = mih.repo_connect()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   747
    # version of the database
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   748
    dbversions = repo.get_versions()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   749
    mih.shutdown()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   750
    if not dbversions:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   751
        print "bad or missing version information in the database, don't upgrade file system"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   752
        return
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   753
    # version of installed software
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   754
    eversion = dbversions['cubicweb']
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   755
    status = instance_status(config, eversion, dbversions)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   756
    # * database version > installed software
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   757
    if status == 'needsoftupgrade':
2851
d3b80a4faf3f F [cwctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2837
diff changeset
   758
        print "** The database of %s is more recent than the installed software!" % config.appid
d3b80a4faf3f F [cwctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2837
diff changeset
   759
        print "** Upgrade your software, then migrate the database by running the command"
d3b80a4faf3f F [cwctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2837
diff changeset
   760
        print "** 'cubicweb-ctl upgrade %s'" % config.appid
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   761
        return
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   762
    # * database version < installed software, an upgrade will be necessary
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   763
    #   anyway, just rewrite vc.conf and warn user he has to upgrade
2851
d3b80a4faf3f F [cwctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2837
diff changeset
   764
    elif status == 'needapplupgrade':
d3b80a4faf3f F [cwctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2837
diff changeset
   765
        print "** The database of %s is older than the installed software." % config.appid
d3b80a4faf3f F [cwctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2837
diff changeset
   766
        print "** Migrate the database by running the command"
d3b80a4faf3f F [cwctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2837
diff changeset
   767
        print "** 'cubicweb-ctl upgrade %s'" % config.appid
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   768
        return
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   769
    # * database version = installed software, database version = instance fs version
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   770
    #   ok!
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   771
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   772
def instance_status(config, cubicwebapplversion, vcconf):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   773
    cubicwebversion = config.cubicweb_version()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   774
    if cubicwebapplversion > cubicwebversion:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   775
        return 'needsoftupgrade'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   776
    if cubicwebapplversion < cubicwebversion:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   777
        return 'needapplupgrade'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   778
    for cube in config.cubes():
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   779
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   780
            softversion = config.cube_version(cube)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   781
        except ConfigurationError:
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   782
            print '-> Error: no cube version information for %s, please check that the cube is installed.' % cube
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   783
            continue
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   784
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   785
            applversion = vcconf[cube]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   786
        except KeyError:
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   787
            print '-> Error: no cube version information for %s in version configuration.' % cube
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   788
            continue
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   789
        if softversion == applversion:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   790
            continue
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   791
        if softversion > applversion:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   792
            return 'needsoftupgrade'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   793
        elif softversion < applversion:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   794
            return 'needapplupgrade'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   795
    return None
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   796
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   797
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   798
class DBDumpCommand(Command):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   799
    """Backup the system database of an instance.
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   800
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   801
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   802
      the identifier of the instance to backup
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   803
      format [[user@]host:]appname
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   804
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   805
    name = 'db-dump'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   806
    arguments = '<instance>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   807
    min_args = max_args = 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   808
    options = (
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   809
        ('output',
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   810
         {'short': 'o', 'type' : 'string', 'metavar' : '<file>',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   811
          'default' : None,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   812
          'help': 'Specify the backup file where the backup will be stored.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   813
         ),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   814
        ('sudo',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   815
         {'short': 's', 'action' : 'store_true',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   816
          'default' : False,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   817
          'help': 'Use sudo on the remote host.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   818
         ),
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   819
        ('format',
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   820
         {'short': 'f', 'default': 'native', 'type': 'choice',
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   821
          'choices': ('native', 'portable'),
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   822
          'help': '"native" format uses db backend utilities to dump the database. '
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   823
                  '"portable" format uses a database independent format'}
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   824
         ),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   825
        )
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   826
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   827
    def run(self, args):
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   828
        appid = args[0]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   829
        if ':' in appid:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   830
            host, appid = appid.split(':')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   831
            _remote_dump(host, appid, self.config.output, self.config.sudo)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   832
        else:
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   833
            _local_dump(appid, self.config.output, format=self.config.format)
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   834
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   835
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   836
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   837
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   838
class DBRestoreCommand(Command):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   839
    """Restore the system database of an instance.
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   840
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   841
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   842
      the identifier of the instance to restore
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   843
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   844
    name = 'db-restore'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   845
    arguments = '<instance> <backupfile>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   846
    min_args = max_args = 2
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   847
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   848
    options = (
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   849
        ('no-drop',
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   850
         {'short': 'n', 'action' : 'store_true', 'default' : False,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   851
          'help': 'for some reason the database doesn\'t exist and so '
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   852
          'should not be dropped.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   853
         ),
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   854
        ('format',
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   855
         {'short': 'f', 'default': 'native', 'type': 'choice',
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   856
          'choices': ('native', 'portable'),
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   857
          'help': 'the format used when dumping the database'}),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   858
        )
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   859
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   860
    def run(self, args):
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   861
        appid, backupfile = args
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   862
        if self.config.format == 'portable':
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   863
            # we need to ensure a DB exist before restoring from portable format
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   864
            if not self.config.no_drop:
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   865
                try:
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   866
                    CWCTL.run(['db-create', '--automatic', appid])
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8669
diff changeset
   867
                except SystemExit as exc:
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   868
                    # continue if the command exited with status 0 (success)
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   869
                    if exc.code:
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   870
                        raise
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   871
        _local_restore(appid, backupfile,
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   872
                       drop=not self.config.no_drop,
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   873
                       format=self.config.format)
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   874
        if self.config.format == 'portable':
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   875
            try:
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   876
                CWCTL.run(['db-rebuild-fti', appid])
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8669
diff changeset
   877
            except SystemExit as exc:
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   878
                if exc.code:
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   879
                    raise
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   880
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   881
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   882
class DBCopyCommand(Command):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   883
    """Copy the system database of an instance (backup and restore).
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   884
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   885
    <src-instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   886
      the identifier of the instance to backup
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   887
      format [[user@]host:]appname
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   888
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   889
    <dest-instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   890
      the identifier of the instance to restore
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   891
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   892
    name = 'db-copy'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   893
    arguments = '<src-instance> <dest-instance>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   894
    min_args = max_args = 2
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   895
    options = (
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   896
        ('no-drop',
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   897
         {'short': 'n', 'action' : 'store_true',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   898
          'default' : False,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   899
          'help': 'For some reason the database doesn\'t exist and so '
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   900
          'should not be dropped.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   901
         ),
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   902
        ('keep-dump',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   903
         {'short': 'k', 'action' : 'store_true',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   904
          'default' : False,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   905
          'help': 'Specify that the dump file should not be automatically removed.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   906
         ),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   907
        ('sudo',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   908
         {'short': 's', 'action' : 'store_true',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   909
          'default' : False,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   910
          'help': 'Use sudo on the remote host.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   911
         ),
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   912
        ('format',
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   913
         {'short': 'f', 'default': 'native', 'type': 'choice',
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   914
          'choices': ('native', 'portable'),
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   915
          'help': '"native" format uses db backend utilities to dump the database. '
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   916
                  '"portable" format uses a database independent format'}
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   917
         ),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   918
        )
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   919
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   920
    def run(self, args):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   921
        import tempfile
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   922
        srcappid, destappid = args
3148
81d373245ce9 close file handler leak
Aurelien Campeas
parents: 3115
diff changeset
   923
        fd, output = tempfile.mkstemp()
81d373245ce9 close file handler leak
Aurelien Campeas
parents: 3115
diff changeset
   924
        os.close(fd)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   925
        if ':' in srcappid:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   926
            host, srcappid = srcappid.split(':')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   927
            _remote_dump(host, srcappid, output, self.config.sudo)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   928
        else:
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   929
            _local_dump(srcappid, output, format=self.config.format)
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   930
        _local_restore(destappid, output, not self.config.no_drop,
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   931
                       self.config.format)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   932
        if self.config.keep_dump:
2394
92bba46b853f [cw-ctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2107
diff changeset
   933
            print '-> you can get the dump file at', output
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   934
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   935
            os.remove(output)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   936
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   937
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   938
class CheckRepositoryCommand(Command):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   939
    """Check integrity of the system database of an instance.
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   940
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   941
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   942
      the identifier of the instance to check
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   943
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   944
    name = 'db-check'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   945
    arguments = '<instance>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   946
    min_args = max_args = 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   947
    options = (
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   948
        ('checks',
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   949
         {'short': 'c', 'type' : 'csv', 'metavar' : '<check list>',
7036
63386b35ec69 [c-c db-check] new checks for entities missing a mandatory relation/attribute
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7030
diff changeset
   950
          'default' : ('entities', 'relations',
63386b35ec69 [c-c db-check] new checks for entities missing a mandatory relation/attribute
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7030
diff changeset
   951
                       'mandatory_relations', 'mandatory_attributes',
63386b35ec69 [c-c db-check] new checks for entities missing a mandatory relation/attribute
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7030
diff changeset
   952
                       'metadata', 'schema', 'text_index'),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   953
          'help': 'Comma separated list of check to run. By default run all \
7036
63386b35ec69 [c-c db-check] new checks for entities missing a mandatory relation/attribute
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7030
diff changeset
   954
checks, i.e. entities, relations, mandatory_relations, mandatory_attributes, \
63386b35ec69 [c-c db-check] new checks for entities missing a mandatory relation/attribute
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7030
diff changeset
   955
metadata, text_index and schema.'}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   956
         ),
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   957
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   958
        ('autofix',
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   959
         {'short': 'a', 'type' : 'yn', 'metavar' : '<yes or no>',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   960
          'default' : False,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   961
          'help': 'Automatically correct integrity problems if this option \
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   962
is set to "y" or "yes", else only display them'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   963
         ),
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   964
        ('reindex',
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   965
         {'short': 'r', 'type' : 'yn', 'metavar' : '<yes or no>',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   966
          'default' : False,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   967
          'help': 're-indexes the database for full text search if this \
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   968
option is set to "y" or "yes" (may be long for large database).'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   969
         ),
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   970
        ('force',
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   971
         {'short': 'f', 'action' : 'store_true',
2473
490f88fb99b6 new distinguish repairing/creating from regular start.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2461
diff changeset
   972
          'default' : False,
490f88fb99b6 new distinguish repairing/creating from regular start.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2461
diff changeset
   973
          'help': 'don\'t check instance is up to date.'}
490f88fb99b6 new distinguish repairing/creating from regular start.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2461
diff changeset
   974
         ),
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   975
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   976
        )
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   977
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   978
    def run(self, args):
6184
da580218a5b3 [c-c db-check] add missing import
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   979
        from cubicweb.server.checkintegrity import check
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   980
        appid = args[0]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   981
        config = ServerConfiguration.config_for(appid)
2473
490f88fb99b6 new distinguish repairing/creating from regular start.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2461
diff changeset
   982
        config.repairing = self.config.force
9797
4e640ab62f51 [tests/checkintegrity] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9759
diff changeset
   983
        repo, _cnx = repo_cnx(config)
4e640ab62f51 [tests/checkintegrity] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9759
diff changeset
   984
        with repo.internal_cnx() as cnx:
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   985
            check(repo, cnx,
9797
4e640ab62f51 [tests/checkintegrity] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9759
diff changeset
   986
                  self.config.checks,
4e640ab62f51 [tests/checkintegrity] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9759
diff changeset
   987
                  self.config.reindex,
4e640ab62f51 [tests/checkintegrity] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9759
diff changeset
   988
                  self.config.autofix)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   989
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   990
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   991
class RebuildFTICommand(Command):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   992
    """Rebuild the full-text index of the system database of an instance.
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   993
8449
cc83a3f16c0f [fti] make db-rebuild-fti accept etypes on command line (closes #2410508)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8434
diff changeset
   994
    <instance> [etype(s)]
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   995
      the identifier of the instance to rebuild
8449
cc83a3f16c0f [fti] make db-rebuild-fti accept etypes on command line (closes #2410508)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8434
diff changeset
   996
cc83a3f16c0f [fti] make db-rebuild-fti accept etypes on command line (closes #2410508)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8434
diff changeset
   997
    If no etype is specified, cubicweb will reindex everything, otherwise
cc83a3f16c0f [fti] make db-rebuild-fti accept etypes on command line (closes #2410508)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8434
diff changeset
   998
    only specified etypes will be considered.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   999
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1000
    name = 'db-rebuild-fti'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
  1001
    arguments = '<instance>'
8449
cc83a3f16c0f [fti] make db-rebuild-fti accept etypes on command line (closes #2410508)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8434
diff changeset
  1002
    min_args = 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1003
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1004
    def run(self, args):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1005
        from cubicweb.server.checkintegrity import reindex_entities
8449
cc83a3f16c0f [fti] make db-rebuild-fti accept etypes on command line (closes #2410508)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8434
diff changeset
  1006
        appid = args.pop(0)
cc83a3f16c0f [fti] make db-rebuild-fti accept etypes on command line (closes #2410508)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8434
diff changeset
  1007
        etypes = args or None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1008
        config = ServerConfiguration.config_for(appid)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1009
        repo, cnx = repo_cnx(config)
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
  1010
        with cnx:
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
  1011
            reindex_entities(repo.schema, cnx._cnx, etypes=etypes)
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
  1012
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1013
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1014
7457
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1015
class SynchronizeSourceCommand(Command):
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1016
    """Force a source synchronization.
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1017
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1018
    <instance>
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1019
      the identifier of the instance
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1020
    <source>
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1021
      the name of the source to synchronize.
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1022
    """
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1023
    name = 'source-sync'
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1024
    arguments = '<instance> <source>'
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1025
    min_args = max_args = 2
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1026
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1027
    def run(self, args):
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1028
        config = ServerConfiguration.config_for(args[0])
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1029
        config.global_set_option('log-file', None)
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1030
        config.log_format = '%(levelname)s %(name)s: %(message)s'
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1031
        logger = logging.getLogger('cubicweb.sources')
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1032
        logger.setLevel(logging.INFO)
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1033
        # only retrieve cnx to trigger authentication, close it right away
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1034
        repo, cnx = repo_cnx(config)
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1035
        cnx.close()
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1036
        try:
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1037
            source = repo.sources_by_uri[args[1]]
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1038
        except KeyError:
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1039
            raise ExecutionError('no source named %r' % args[1])
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1040
        session = repo.internal_session()
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1041
        stats = source.pull_data(session, force=True, raise_on_error=True)
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1042
        for key, val in stats.iteritems():
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1043
            if val:
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1044
                print key, ':', val
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1045
9303
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1046
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1047
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1048
def permissionshandler(relation, perms):
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1049
    from yams.schema import RelationDefinitionSchema
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1050
    from yams.buildobjs import DEFAULT_ATTRPERMS
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1051
    from cubicweb.schema import (PUB_SYSTEM_ENTITY_PERMS, PUB_SYSTEM_REL_PERMS,
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1052
                                 PUB_SYSTEM_ATTR_PERMS, RO_REL_PERMS, RO_ATTR_PERMS)
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1053
    defaultrelperms = (DEFAULT_ATTRPERMS, PUB_SYSTEM_REL_PERMS,
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1054
                       PUB_SYSTEM_ATTR_PERMS, RO_REL_PERMS, RO_ATTR_PERMS)
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1055
    defaulteperms = (PUB_SYSTEM_ENTITY_PERMS,)
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1056
    # canonicalize vs str/unicode
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1057
    for p in ('read', 'add', 'update', 'delete'):
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1058
        rule = perms.get(p)
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1059
        if rule:
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1060
            perms[p] = tuple(str(x) if isinstance(x, basestring) else x
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1061
                             for x in rule)
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1062
    return perms, perms in defaultrelperms or perms in defaulteperms
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1063
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1064
8749
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1065
class SchemaDiffCommand(Command):
8984
0f2fad7a92d4 [cw-ctl] fix help message for schemadiff In global help (closes #2888538)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8924
diff changeset
  1066
    """Generate a diff between schema and fsschema description.
0f2fad7a92d4 [cw-ctl] fix help message for schemadiff In global help (closes #2888538)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8924
diff changeset
  1067
8749
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1068
    <instance>
8984
0f2fad7a92d4 [cw-ctl] fix help message for schemadiff In global help (closes #2888538)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8924
diff changeset
  1069
      the identifier of the instance
8749
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1070
    <diff-tool>
8984
0f2fad7a92d4 [cw-ctl] fix help message for schemadiff In global help (closes #2888538)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8924
diff changeset
  1071
      the name of the diff tool to compare the two generated files.
8749
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1072
    """
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1073
    name = 'schema-diff'
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1074
    arguments = '<instance> <diff-tool>'
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1075
    min_args = max_args = 2
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1076
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1077
    def run(self, args):
8924
8666438778c7 [c-c serverctl] import locally to speed up c-c
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8749
diff changeset
  1078
        from yams.diff import schema_diff
8749
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1079
        appid = args.pop(0)
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1080
        diff_tool = args.pop(0)
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1081
        config = ServerConfiguration.config_for(appid)
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1082
        repo, cnx = repo_cnx(config)
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
  1083
        cnx.close()
8749
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1084
        fsschema = config.load_schema(expand_cubes=True)
9303
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1085
        schema_diff(fsschema, repo.schema, permissionshandler, diff_tool, ignore=('eid',))
8749
9db7580d6427 add a command to compare db schema and file system schema (closes #464991)
Alexandre Richardson <alexandre.richardson@logilab.fr>
parents: 8695
diff changeset
  1086
7457
f7c97a3cd121 [datafeed] provide a source-sync command to launch source synchronization through the command line. Closes #1725692
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
  1087
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
  1088
for cmdclass in (CreateInstanceDBCommand, InitInstanceCommand,
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
  1089
                 GrantUserOnInstanceCommand, ResetAdminPasswordCommand,
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
  1090
                 StartRepositoryCommand,
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
  1091
                 DBDumpCommand, DBRestoreCommand, DBCopyCommand,
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
  1092
                 AddSourceCommand, CheckRepositoryCommand, RebuildFTICommand,
9485
2b47e800cea6 [serverctl] remove broken schema-sync command
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
  1093
                 SynchronizeSourceCommand, SchemaDiffCommand,
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
  1094
                 ):
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
  1095
    CWCTL.register(cmdclass)
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1096
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1097
# extend configure command to set options in sources config file ###############
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1098
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1099
db_options = (
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1100
    ('db',
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1101
     {'short': 'd', 'type' : 'named', 'metavar' : 'key1:value1,key2:value2',
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1102
      'default': None,
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1103
      'help': 'set <key> to <value> in "source" configuration file.',
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1104
      }),
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1105
    )
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1106
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1107
ConfigureInstanceCommand.options = merge_options(
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1108
        ConfigureInstanceCommand.options + db_options)
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1109
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1110
configure_instance = ConfigureInstanceCommand.configure_instance
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1111
def configure_instance2(self, appid):
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1112
    configure_instance(self, appid)
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1113
    if self.config.db is not None:
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1114
        appcfg = ServerConfiguration.config_for(appid)
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1115
        srccfg = appcfg.read_sources_file()
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1116
        for key, value in self.config.db.iteritems():
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1117
            try:
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1118
                srccfg['system'][key] = value
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1119
            except KeyError:
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1120
                raise ConfigurationError('unknown configuration key "%s" for source' % key)
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1121
        admcfg = Configuration(options=USER_OPTIONS)
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1122
        admcfg['login'] = srccfg['admin']['login']
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1123
        admcfg['password'] = srccfg['admin']['password']
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1124
        srccfg['admin'] = admcfg
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1125
        appcfg.write_sources_file(srccfg)
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1126
ConfigureInstanceCommand.configure_instance = configure_instance2