cubicweb/server/serverctl.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 04 Nov 2016 11:19:11 +0100
changeset 11800 3cd5ac8d43ed
parent 11767 432f87a63057
child 11952 9dbb0af82628
permissions -rw-r--r--
Fix unexpected req.relative_path() when calling CWTC.app_handle_request with path argument The _deprecated_path_arg decorator can not be used in this case, since it won't ensure backward compat if path value has been specified and is not similar as req's path (which is generally the case). This problem has been introduced by 904ee9cd0cf9.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
     1
# copyright 2003-2016 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"""
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
    19
from __future__ import print_function
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    20
4718
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4670
diff changeset
    21
# *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
    22
# 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
    23
# 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
    24
import sys
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
import os
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
    26
from contextlib import contextmanager
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    27
10612
84468b90e9c1 [py3k] basestring → six.string_types
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10589
diff changeset
    28
from six import string_types
10738
675e47b1b875 [server] import input from six.moves
Julien Cristau <julien.cristau@logilab.fr>
parents: 10662
diff changeset
    29
from six.moves import input
10612
84468b90e9c1 [py3k] basestring → six.string_types
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10589
diff changeset
    30
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
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
    34
from logilab.database import get_db_helper, get_connection
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
    35
11345
27b98f3cceae [datafeed] attempt to acquire synchronization lock even when force is given
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11190
diff changeset
    36
from cubicweb import AuthenticationError, ExecutionError, ConfigurationError, SourceException
2790
968108e16066 move underline_title to toolsutils
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2711
diff changeset
    37
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
    38
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
    39
from cubicweb.server import SOURCE_TYPES
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
    40
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
    41
    USER_OPTIONS, ServerConfiguration, SourceConfiguration,
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
    42
    ask_source_config, generate_source_config)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    43
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
    44
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    45
# utility functions ###########################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    46
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
    47
def source_cnx(source, dbname=None, special_privs=False, interactive=True):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    48
    """open and return a connection to the system database defined in the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    49
    given server.serverconfig
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    50
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    51
    from getpass import getpass
4218
deb2dcffb301 [cwctl] reset-admin-pwd was failing when db-host was not set
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 4212
diff changeset
    52
    dbhost = source.get('db-host')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    53
    if dbname is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    54
        dbname = source['db-name']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    55
    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
    56
    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
    57
    if interactive:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
    58
        print('-> connecting to %s database' % driver, end=' ')
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
    59
        if dbhost:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
    60
            print('%s@%s' % (dbname, dbhost), end=' ')
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
    61
        else:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
    62
            print(dbname, end=' ')
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
    63
    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
    64
        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
    65
            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
    66
            if interactive:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
    67
                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
    68
            password = source.get('db-password')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
        else:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
    70
            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
    71
            if special_privs:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
    72
                print('WARNING')
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
    73
                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
    74
                       'on the database:')
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
    75
                print(special_privs)
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
    76
                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
    77
            default_user = source.get('db-user', os.environ.get('USER', ''))
10738
675e47b1b875 [server] import input from six.moves
Julien Cristau <julien.cristau@logilab.fr>
parents: 10662
diff changeset
    78
            user = 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
    79
            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
    80
            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
    81
                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
    82
            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
    83
                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
    84
    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
    85
        user = password = None
4180
9fb0d06926cc more extra_args cleanup
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4177
diff changeset
    86
    extra_args = source.get('db-extra-arguments')
9fb0d06926cc more extra_args cleanup
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4177
diff changeset
    87
    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
    88
    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
    89
                         port=source.get('db-port'),
10125
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
    90
                         schema=source.get('db-namespace'),
4837
54969eec48eb misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
    91
                         **extra)
4845
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    92
    try:
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    93
        cnx.logged_user = user
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    94
    except AttributeError:
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    95
        # C object, __slots__
4848
41f84eea63c9 rename logilab.db into logilab.database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4845
diff changeset
    96
        from logilab.database import _SimpleConnectionWrapper
4845
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    97
        cnx = _SimpleConnectionWrapper(cnx)
dc351b96f596 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4831 4837
diff changeset
    98
        cnx.logged_user = user
4837
54969eec48eb misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
    99
    return cnx
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   100
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   101
136
ff51a18c66a3 ask less questions on instance creation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   102
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
   103
                      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
   104
    """shortcut to get a connextion to the instance system database
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   105
    defined in the given config. If <dbms_system_base> is True,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   106
    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
   107
    create/drop the instance database)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   108
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   109
    if dbms_system_base:
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
   110
        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
   111
        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
   112
                          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
   113
    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
   114
                      interactive=interactive)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   115
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   116
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
   117
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
   118
    """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
   119
    database)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   120
    """
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
   121
    import logilab.common as lgp
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
   122
    lgp.USE_MX_DATETIME = False
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
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   134
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   135
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
   136
    """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
   137
    from cubicweb import repoapi
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   138
    from cubicweb.server.utils import manager_userpasswd
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   139
    try:
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9457
diff changeset
   140
        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
   141
        pwd = config.default_admin_config['password']
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   142
    except KeyError:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   143
        login, pwd = manager_userpasswd()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   144
    while True:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   145
        try:
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   146
            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
   147
            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
   148
            return repo, cnx
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   149
        except AuthenticationError:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   150
            print('-> Error: wrong user/password.')
1682
36bd5cba09de must reset cubes before next authentication
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents: 1469
diff changeset
   151
            # 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
   152
            config._cubes = None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   153
        login, pwd = manager_userpasswd()
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   154
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
   155
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   156
# repository specific command handlers ########################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   157
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   158
class RepositoryCreateHandler(CommandHandler):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   159
    cmdname = 'create'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   160
    cfgname = 'repository'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   161
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
   162
    def bootstrap(self, cubes, automatic=False, inputlevel=0):
5967
8deedfeb7846 cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5814
diff changeset
   163
        """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
   164
        information necessary to build required configuration files
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   165
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   166
        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
   167
        if not automatic:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   168
            print(underline_title('Configuring the repository'))
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
   169
            config.input_config('email', inputlevel)
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   170
            print('\n' + underline_title('Configuring the sources'))
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
   171
        # 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
   172
        # (in native.py)
6299
51a9494b5efb [sqlite] quick hacks to fix #1251873 and #1251874
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6184
diff changeset
   173
        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
   174
                                      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
   175
        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
   176
            sconfig.input_config(inputlevel=inputlevel)
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   177
            print()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   178
        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
   179
        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
   180
            # 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
   181
            password = generate_password()
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   182
            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
   183
            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
   184
            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
   185
        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
   186
            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
   187
            sconfig.input_config(inputlevel=inputlevel)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   188
        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
   189
        config.write_sources_file(sourcescfg)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   190
        # remember selected cubes for later initialization of the database
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   191
        config.write_bootstrap_cubes_file(cubes)
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   192
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
   193
    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
   194
        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
   195
            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
   196
        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
   197
            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
   198
                       self.config.appid])
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   199
        else:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   200
            print('-> nevermind, you can do it later with '
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   201
                  '"cubicweb-ctl db-create %s".' % self.config.appid)
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   202
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
   203
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   204
@contextmanager
10124
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   205
def db_transaction(source, privilege):
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   206
    """Open a transaction to the instance database"""
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   207
    cnx = system_source_cnx(source, special_privs=privilege)
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   208
    cursor = cnx.cursor()
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   209
    try:
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   210
        yield cursor
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   211
    except:
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   212
        cnx.rollback()
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   213
        cnx.close()
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   214
        raise
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   215
    else:
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   216
        cnx.commit()
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   217
        cnx.close()
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   218
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   219
153c969b3a05 [serverctl] add db_transaction context manager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10123
diff changeset
   220
@contextmanager
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   221
def db_sys_transaction(source, privilege):
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   222
    """Open a transaction to the system database"""
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   223
    cnx = _db_sys_cnx(source, privilege)
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   224
    cursor = cnx.cursor()
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
   225
    try:
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   226
        yield cursor
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   227
    except:
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   228
        cnx.rollback()
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   229
        cnx.close()
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   230
        raise
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   231
    else:
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   232
        cnx.commit()
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   233
        cnx.close()
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   234
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   235
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   236
class RepositoryDeleteHandler(CommandHandler):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   237
    cmdname = 'delete'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   238
    cfgname = 'repository'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   239
10125
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   240
    def _drop_namespace(self, source):
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   241
        db_namespace = source.get('db-namespace')
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   242
        with db_transaction(source, privilege='DROP SCHEMA') as cursor:
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   243
            helper = get_db_helper(source['db-driver'])
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   244
            helper.drop_schema(cursor, db_namespace)
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   245
            print('-> database schema %s dropped' % db_namespace)
10125
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   246
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   247
    def _drop_database(self, source):
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   248
        if source['db-driver'] == 'sqlite':
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   249
            print('deleting database file %(db-name)s' % source)
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   250
            os.unlink(source['db-name'])
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   251
            print('-> database %(db-name)s dropped.' % source)
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   252
        else:
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   253
            with db_sys_transaction(source, privilege='DROP DATABASE') as cursor:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   254
                print('dropping database %(db-name)s' % source)
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   255
                cursor.execute('DROP DATABASE "%(db-name)s"' % source)
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   256
                print('-> database %(db-name)s dropped.' % source)
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   257
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   258
    def _drop_user(self, source):
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   259
        user = source['db-user'] or None
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   260
        if user is not None:
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   261
            with db_sys_transaction(source, privilege='DROP USER') as cursor:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   262
                print('dropping user %s' % user)
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   263
                cursor.execute('DROP USER %s' % user)
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   264
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   265
    def _cleanup_steps(self, source):
10125
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   266
        # 1/ delete namespace if used
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   267
        db_namespace = source.get('db-namespace')
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   268
        if db_namespace:
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   269
            yield ('Delete database namespace "%s"' % db_namespace,
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   270
                   self._drop_namespace, True)
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   271
        # 2/ delete database
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   272
        yield ('Delete database "%(db-name)s"' % source,
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   273
               self._drop_database, True)
10125
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   274
        # 3/ delete user
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   275
        helper = get_db_helper(source['db-driver'])
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   276
        if source['db-user'] and helper.users_support:
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   277
            # XXX should check we are not connected as user
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   278
            yield ('Delete user "%(db-user)s"' % source,
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   279
                   self._drop_user, False)
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   280
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   281
    def cleanup(self):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   282
        """remove instance's configuration and database"""
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9457
diff changeset
   283
        source = self.config.system_source_config
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   284
        for msg, step, default in self._cleanup_steps(source):
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   285
            if ASK.confirm(msg, default_is_yes=default):
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   286
                try:
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   287
                    step(source)
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   288
                except Exception as exc:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   289
                    print('ERROR', exc)
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   290
                    if ASK.confirm('An error occurred. Continue anyway?',
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   291
                                   default_is_yes=False):
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   292
                        continue
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   293
                    raise ExecutionError(str(exc))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   294
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   295
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   296
# 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
   297
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
   298
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
   299
    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
   300
        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
   301
                               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
   302
    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
   303
        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
   304
                               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
   305
10123
c390c444de06 [server] refactor cleanup() code used by "cubicweb-ctl delete"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10077
diff changeset
   306
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   307
class CreateInstanceDBCommand(Command):
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   308
    """Create the system database of an instance (run after 'create').
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   309
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   310
    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
   311
    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
   312
    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
   313
    database, users, languages...).
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   314
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   315
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   316
      the identifier of the instance to initialize.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   317
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   318
    name = 'db-create'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   319
    arguments = '<instance>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   320
    min_args = max_args = 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   321
    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
   322
        ('automatic',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   323
         {'short': 'a', 'action': 'store_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
   324
          '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
   325
          '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
   326
          '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
   327
          '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
   328
          }),
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   329
        ('config-level',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   330
         {'short': 'l', 'type': 'int', 'metavar': '<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
   331
          '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
   332
          '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
   333
          '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
   334
          }),
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   335
        ('create-db',
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   336
         {'short': 'c', 'type': 'yn', 'metavar': '<y or n>',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   337
          '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
   338
          '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
   339
          }),
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   340
    )
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
   341
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   342
    def run(self, args):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   343
        """run the command with its specific arguments"""
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
   344
        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
   345
        automatic = self.get('automatic')
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   346
        appid = args.pop()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   347
        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
   348
        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
   349
        dbname = source['db-name']
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   350
        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
   351
        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
   352
        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
   353
            if os.path.exists(dbname) and (
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   354
                    automatic or
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   355
                    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
   356
                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
   357
        elif self.config.create_db:
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   358
            print('\n' + underline_title('Creating the system database'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   359
            # 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
   360
            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
   361
                                interactive=not automatic)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   362
            cursor = dbcnx.cursor()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   363
            try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   364
                if helper.users_support:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   365
                    user = source['db-user']
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   366
                    if not helper.user_exists(cursor, user) and (
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   367
                            automatic or
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   368
                            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
   369
                        helper.create_user(source['db-user'], source.get('db-password'))
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   370
                        print('-> user %s created.' % user)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   371
                if dbname in helper.list_databases(cursor):
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   372
                    if automatic or ASK.confirm('Database %s already exists -- '
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   373
                                                '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
   374
                        cursor.execute('DROP DATABASE "%s"' % dbname)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   375
                    else:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   376
                        print('you may want to run "cubicweb-ctl db-init '
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   377
                              '--drop %s" manually to continue.' % config.appid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   378
                        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
   379
                createdb(helper, source, dbcnx, cursor)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   380
                dbcnx.commit()
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   381
                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
   382
            except BaseException:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   383
                dbcnx.rollback()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   384
                raise
10125
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   385
        cnx = system_source_cnx(source, special_privs='CREATE LANGUAGE/SCHEMA',
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
   386
                                interactive=not automatic)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   387
        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
   388
        helper.init_fti_extensions(cursor)
10125
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   389
        namespace = source.get('db-namespace')
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   390
        if namespace and ASK.confirm('Create schema %s in database %s ?'
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   391
                                     % (namespace, dbname)):
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   392
            helper.create_schema(cursor, namespace)
7479
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   393
        cnx.commit()
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   394
        # postgres specific stuff
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   395
        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
   396
            # 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
   397
            langs = ('plpythonu', 'plpgsql')
3115
29262ba01464 minimal steps to have cw running on windows
Aurélien Campéas
parents: 2969
diff changeset
   398
            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
   399
                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
   400
                    try:
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   401
                        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
   402
                    except Exception as exc:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   403
                        print('-> ERROR:', exc)
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   404
                        print('-> could not create language %s, '
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   405
                              'some stored procedures might be unusable' % extlang)
7479
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   406
                        cnx.rollback()
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   407
                    else:
b0603fc4ed6d [sql] implement #1631319: ask user before creating postgresql languages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7457
diff changeset
   408
                        cnx.commit()
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   409
        print('-> database for instance %s created and necessary extensions installed.' % appid)
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   410
        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
   411
        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
   412
            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
   413
                       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
   414
        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
   415
            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
   416
                       str(self.config.config_level), config.appid])
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   417
        else:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   418
            print('-> nevermind, you can do it later with '
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   419
                  '"cubicweb-ctl db-init %s".' % config.appid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   420
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   421
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   422
class InitInstanceCommand(Command):
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   423
    """Initialize the system database of an instance (run after 'db-create').
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   424
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   425
    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
   426
    user should have the create tables grant permissions on the database.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   427
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   428
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   429
      the identifier of the instance to initialize.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   430
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   431
    name = 'db-init'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   432
    arguments = '<instance>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   433
    min_args = max_args = 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   434
    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
   435
        ('automatic',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   436
         {'short': 'a', 'action': 'store_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
   437
          '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
   438
          '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
   439
          '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
   440
          }),
ba51dac1115d [c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7121
diff changeset
   441
        ('config-level',
9922
fc02ba8654a7 [serverctl] fix default value for db-init config-level
Julien Cristau <julien.cristau@logilab.fr>
parents: 9303
diff changeset
   442
         {'short': 'l', 'type': 'int', 'default': 0,
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
   443
          '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
   444
          '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
   445
          }),
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   446
        ('drop',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   447
         {'short': 'd', 'action': 'store_true',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   448
          '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
   449
          '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
   450
          '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
   451
          }),
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   452
    )
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   453
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   454
    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
   455
        check_options_consistency(self.config)
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   456
        print('\n' + underline_title('Initializing the system database'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   457
        from cubicweb.server import init_repository
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   458
        appid = args[0]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   459
        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
   460
        try:
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9457
diff changeset
   461
            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
   462
            extra_args = system.get('db-extra-arguments')
4180
9fb0d06926cc more extra_args cleanup
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4177
diff changeset
   463
            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
   464
            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
   465
                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
   466
                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
   467
                user=system.get('db-user') or '', password=system.get('db-password') or '',
10125
bc6461a7d2da [server] add a db-namespace option in source definition (closes #1631339)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 10124
diff changeset
   468
                schema=system.get('db-namespace'), **extra)
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8669
diff changeset
   469
        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
   470
            raise ConfigurationError(
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   471
                'You seem to have provided wrong connection information in '
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
   472
                '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
   473
                % (config.sources_file(), str(ex).strip()))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   474
        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
   475
        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
   476
            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
   477
                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
   478
                           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
   479
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   480
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   481
class AddSourceCommand(Command):
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   482
    """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
   483
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   484
    <instance>
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   485
      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
   486
    """
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
   487
    name = 'source-add'
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   488
    arguments = '<instance>'
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   489
    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
   490
    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
   491
        ('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
   492
         {'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
   493
          '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
   494
          }),
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   495
    )
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   496
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   497
    def run(self, args):
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   498
        appid = args[0]
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
   499
        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
   500
        repo, cnx = repo_cnx(config)
10525
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   501
        repo.hm.call_hooks('server_maintenance', repo=repo)
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   502
        try:
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   503
            with cnx:
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   504
                used = set(n for n, in cnx.execute('Any SN WHERE S is CWSource, S name SN'))
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   505
                cubes = repo.get_cubes()
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   506
                while True:
10738
675e47b1b875 [server] import input from six.moves
Julien Cristau <julien.cristau@logilab.fr>
parents: 10662
diff changeset
   507
                    type = input('source type (%s): '
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   508
                                 % ', '.join(sorted(SOURCE_TYPES)))
10525
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   509
                    if type not in SOURCE_TYPES:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   510
                        print('-> unknown source type, use one of the available types.')
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   511
                        continue
10525
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   512
                    sourcemodule = SOURCE_TYPES[type].module
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   513
                    if not sourcemodule.startswith('cubicweb.'):
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   514
                        # module names look like cubes.mycube.themodule
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   515
                        sourcecube = SOURCE_TYPES[type].module.split('.', 2)[1]
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   516
                        # if the source adapter is coming from an external component,
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   517
                        # ensure it's specified in used cubes
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   518
                        if sourcecube not in cubes:
10525
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   519
                            print ('-> this source type require the %s cube which is '
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   520
                                   'not used by the instance.')
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   521
                            continue
10009
560747cd7774 [serverctl] Ask for parser type when adding a new source (closes #3484231)
Paul Tonelli <paul.tonelli@logilab.fr>
parents: 9984
diff changeset
   522
                    break
10525
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   523
                while True:
10738
675e47b1b875 [server] import input from six.moves
Julien Cristau <julien.cristau@logilab.fr>
parents: 10662
diff changeset
   524
                    parser = input('parser type (%s): '
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   525
                                   % ', '.join(sorted(repo.vreg['parsers'])))
10525
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   526
                    if parser in repo.vreg['parsers']:
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   527
                        break
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   528
                    print('-> unknown parser identifier, use one of the available types.')
10525
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   529
                while True:
10738
675e47b1b875 [server] import input from six.moves
Julien Cristau <julien.cristau@logilab.fr>
parents: 10662
diff changeset
   530
                    sourceuri = input('source identifier (a unique name used to '
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   531
                                      'tell sources apart): ').strip()
10525
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   532
                    if not sourceuri:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   533
                        print('-> mandatory.')
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   534
                    else:
10525
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   535
                        sourceuri = unicode(sourceuri, sys.stdin.encoding)
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   536
                        if sourceuri in used:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   537
                            print('-> uri already used, choose another one.')
10525
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   538
                        else:
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   539
                            break
10738
675e47b1b875 [server] import input from six.moves
Julien Cristau <julien.cristau@logilab.fr>
parents: 10662
diff changeset
   540
                url = input('source URL (leave empty for none): ').strip()
10525
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   541
                url = unicode(url) if url else None
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   542
                # XXX configurable inputlevel
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   543
                sconfig = ask_source_config(config, type, inputlevel=self.config.config_level)
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   544
                cfgstr = unicode(generate_source_config(sconfig), sys.stdin.encoding)
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   545
                cnx.create_entity('CWSource', name=sourceuri, type=unicode(type),
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   546
                                  config=cfgstr, parser=unicode(parser), url=unicode(url))
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   547
                cnx.commit()
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   548
        finally:
b8fddae83a46 [serverctl] call server_{maintenance,shutdown} hooks around add-source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10489
diff changeset
   549
            repo.hm.call_hooks('server_shutdown')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   550
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   551
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   552
class GrantUserOnInstanceCommand(Command):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   553
    """Grant a database user on a repository system database.
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   554
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   555
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   556
      the identifier of the instance
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   557
    <user>
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   558
      the database's user requiring grant access
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   559
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   560
    name = 'db-grant-user'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   561
    arguments = '<instance> <user>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   562
    min_args = max_args = 2
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   563
    options = (
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   564
        ('set-owner',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   565
         {'short': 'o', 'type': 'yn', 'metavar': '<yes or no>',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   566
          'default': False,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   567
          'help': 'Set the user as tables owner if yes (no by default).'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   568
         ),
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   569
    )
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   570
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   571
    def run(self, args):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   572
        """run the command with its specific arguments"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   573
        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
   574
        appid, user = args
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   575
        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
   576
        source = config.system_source_config
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   577
        set_owner = self.config.set_owner
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   578
        cnx = system_source_cnx(source, special_privs='GRANT')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   579
        cursor = cnx.cursor()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   580
        schema = config.load_schema()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   581
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   582
            sqlexec(sqlgrants(schema, source['db-driver'], user,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   583
                              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
   584
        except Exception as ex:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   585
            cnx.rollback()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   586
            import traceback
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   587
            traceback.print_exc()
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   588
            print('-> an error occurred:', ex)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   589
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   590
            cnx.commit()
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   591
            print('-> rights granted to %s on instance %s.' % (appid, user))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   592
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
   593
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   594
class ResetAdminPasswordCommand(Command):
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   595
    """Reset the administrator password.
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   596
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   597
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   598
      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
   599
    """
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   600
    name = 'reset-admin-pwd'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   601
    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
   602
    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
   603
    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
   604
        ('password',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   605
         {'short': 'p', 'type': 'string', 'metavar': '<new-password>',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   606
          'default': None,
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
   607
          '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
   608
                  '/!\ 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
   609
                  '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
   610
         ),
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   611
    )
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   612
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   613
    def run(self, args):
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   614
        """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
   615
        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
   616
        appid = args[0]
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   617
        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
   618
        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
   619
        try:
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   620
            adminlogin = sourcescfg['admin']['login']
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   621
        except KeyError:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   622
            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
   623
            sys.exit(1)
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   624
        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
   625
        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
   626
        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
   627
        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
   628
        # 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
   629
        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
   630
                       {'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
   631
        if not cursor.fetchall():
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   632
            print("-> error: admin user %r specified in sources doesn't exist "
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   633
                  "in the database" % adminlogin)
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   634
            print("   fix your sources file before running this command")
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
   635
            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
   636
            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
   637
        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
   638
            # 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
   639
            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
   640
            _, 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
   641
        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
   642
            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
   643
        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
   644
            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
   645
                           {'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
   646
            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
   647
            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
   648
            sconfig['password'] = pwd
1912
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   649
            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
   650
            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
   651
        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
   652
            cnx.rollback()
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   653
            import traceback
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   654
            traceback.print_exc()
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   655
            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
   656
        else:
2b9432262240 [server] provide a new reset-admin-pwd command
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1682
diff changeset
   657
            cnx.commit()
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   658
            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
   659
        cnx.close()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   660
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   661
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   662
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
   663
    # 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
   664
    from datetime import date
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   665
    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
   666
    dmpcmd = 'cubicweb-ctl db-dump -o /tmp/%s %s' % (filename, appid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   667
    if sudo:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   668
        dmpcmd = 'sudo %s' % (dmpcmd)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   669
    dmpcmd = 'ssh -t %s "%s"' % (host, dmpcmd)
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   670
    print(dmpcmd)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   671
    if os.system(dmpcmd):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   672
        raise ExecutionError('Error while dumping the database')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   673
    if output is None:
2837
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   674
        output = filename
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   675
    cmd = 'scp %s:/tmp/%s %s' % (host, filename, output)
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   676
    print(cmd)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   677
    if os.system(cmd):
2837
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   678
        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
   679
    rmcmd = 'ssh -t %s "rm -f /tmp/%s"' % (host, filename)
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   680
    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
   681
    if os.system(rmcmd) and not ASK.confirm(
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   682
            'An error occurred while deleting remote dump at /tmp/%s. '
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   683
            'Continue anyway?' % filename):
2837
65df5df190a5 B [cwctl] fix db-{dump,copy,restore} commands
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2711
diff changeset
   684
        raise ExecutionError('Error while deleting remote dump at /tmp/%s' % filename)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   685
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   686
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   687
def _local_dump(appid, output, format='native'):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   688
    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
   689
    config.quick_start = True
10823
48f59820ff78 [serverctl] fix db-dump
Julien Cristau <julien.cristau@logilab.fr>
parents: 10738
diff changeset
   690
    mih = config.migration_handler(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
   691
    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
   692
    mih.shutdown()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   693
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   694
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
   695
def _local_restore(appid, backupfile, drop, format='native'):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   696
    config = ServerConfiguration.config_for(appid)
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   697
    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
   698
    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
   699
    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
   700
    mih.restore_database(backupfile, drop, askconfirm=False, format=format)
10569
af47954c1015 [migration] remove repo_connect and use config.repository() instead
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10527
diff changeset
   701
    repo = mih.repo
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   702
    # version of the database
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   703
    dbversions = repo.get_versions()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   704
    mih.shutdown()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   705
    if not dbversions:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   706
        print("bad or missing version information in the database, don't upgrade file system")
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   707
        return
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   708
    # version of installed software
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   709
    eversion = dbversions['cubicweb']
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   710
    status = instance_status(config, eversion, dbversions)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   711
    # * database version > installed software
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   712
    if status == 'needsoftupgrade':
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   713
        print("** The database of %s is more recent than the installed software!" % config.appid)
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   714
        print("** Upgrade your software, then migrate the database by running the command")
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   715
        print("** 'cubicweb-ctl upgrade %s'" % config.appid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   716
        return
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   717
    # * database version < installed software, an upgrade will be necessary
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   718
    #   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
   719
    elif status == 'needapplupgrade':
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   720
        print("** The database of %s is older than the installed software." % config.appid)
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   721
        print("** Migrate the database by running the command")
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   722
        print("** 'cubicweb-ctl upgrade %s'" % config.appid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   723
        return
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   724
    # * database version = installed software, database version = instance fs version
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   725
    #   ok!
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   726
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   727
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   728
def instance_status(config, cubicwebapplversion, vcconf):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   729
    cubicwebversion = config.cubicweb_version()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   730
    if cubicwebapplversion > cubicwebversion:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   731
        return 'needsoftupgrade'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   732
    if cubicwebapplversion < cubicwebversion:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   733
        return 'needapplupgrade'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   734
    for cube in config.cubes():
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   735
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   736
            softversion = config.cube_version(cube)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   737
        except ConfigurationError:
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   738
            print('-> Error: no cube version information for %s, '
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   739
                  'please check that the cube is installed.' % cube)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   740
            continue
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   741
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   742
            applversion = vcconf[cube]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   743
        except KeyError:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   744
            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
   745
            continue
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   746
        if softversion == applversion:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   747
            continue
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   748
        if softversion > applversion:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   749
            return 'needsoftupgrade'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   750
        elif softversion < applversion:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   751
            return 'needapplupgrade'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   752
    return None
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   753
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   754
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   755
class DBDumpCommand(Command):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   756
    """Backup the system database of an instance.
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   757
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   758
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   759
      the identifier of the instance to backup
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   760
      format [[user@]host:]appname
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   761
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   762
    name = 'db-dump'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   763
    arguments = '<instance>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   764
    min_args = max_args = 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   765
    options = (
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   766
        ('output',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   767
         {'short': 'o', 'type': 'string', 'metavar': '<file>',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   768
          'default': None,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   769
          'help': 'Specify the backup file where the backup will be stored.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   770
         ),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   771
        ('sudo',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   772
         {'short': 's', 'action': 'store_true',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   773
          'default': False,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   774
          'help': 'Use sudo on the remote host.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   775
         ),
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   776
        ('format',
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   777
         {'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
   778
          '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
   779
          '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
   780
                  '"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
   781
         ),
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   782
    )
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   783
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   784
    def run(self, args):
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   785
        appid = args[0]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   786
        if ':' in appid:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   787
            host, appid = appid.split(':')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   788
            _remote_dump(host, appid, self.config.output, self.config.sudo)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   789
        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
   790
            _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
   791
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   792
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   793
class DBRestoreCommand(Command):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   794
    """Restore the system database of an instance.
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   795
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   796
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   797
      the identifier of the instance to restore
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   798
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   799
    name = 'db-restore'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   800
    arguments = '<instance> <backupfile>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   801
    min_args = max_args = 2
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   802
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   803
    options = (
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   804
        ('no-drop',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   805
         {'short': 'n', 'action': 'store_true', 'default': False,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   806
          'help': 'for some reason the database doesn\'t exist and so '
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   807
          'should not be dropped.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   808
         ),
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   809
        ('format',
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   810
         {'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
   811
          '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
   812
          'help': 'the format used when dumping the database'}),
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   813
    )
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   814
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   815
    def run(self, args):
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   816
        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
   817
        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
   818
            # 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
   819
            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
   820
                try:
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   821
                    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
   822
                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
   823
                    # 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
   824
                    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
   825
                        raise
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   826
        _local_restore(appid, backupfile,
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   827
                       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
   828
                       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
   829
        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
   830
            try:
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   831
                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
   832
            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
   833
                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
   834
                    raise
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   835
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
class DBCopyCommand(Command):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   838
    """Copy the system database of an instance (backup and restore).
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   839
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   840
    <src-instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   841
      the identifier of the instance to backup
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   842
      format [[user@]host:]appname
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   843
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   844
    <dest-instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   845
      the identifier of the instance to restore
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   846
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   847
    name = 'db-copy'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   848
    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
   849
    min_args = max_args = 2
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   850
    options = (
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   851
        ('no-drop',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   852
         {'short': 'n', 'action': 'store_true',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   853
          'default': False,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   854
          'help': 'For some reason the database doesn\'t exist and so '
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   855
          'should not be dropped.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   856
         ),
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   857
        ('keep-dump',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   858
         {'short': 'k', 'action': 'store_true',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   859
          'default': False,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   860
          'help': 'Specify that the dump file should not be automatically removed.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   861
         ),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   862
        ('sudo',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   863
         {'short': 's', 'action': 'store_true',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   864
          'default': False,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   865
          'help': 'Use sudo on the remote host.'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   866
         ),
7342
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   867
        ('format',
d1c8b5b3531c adds support for a portable db import/export format (closes: #1521112)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7155
diff changeset
   868
         {'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
   869
          '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
   870
          '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
   871
                  '"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
   872
         ),
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   873
    )
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   874
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   875
    def run(self, args):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   876
        import tempfile
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   877
        srcappid, destappid = args
3148
81d373245ce9 close file handler leak
Aurelien Campeas
parents: 3115
diff changeset
   878
        fd, output = tempfile.mkstemp()
81d373245ce9 close file handler leak
Aurelien Campeas
parents: 3115
diff changeset
   879
        os.close(fd)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   880
        if ':' in srcappid:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   881
            host, srcappid = srcappid.split(':')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   882
            _remote_dump(host, srcappid, output, self.config.sudo)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   883
        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
   884
            _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
   885
        _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
   886
                       self.config.format)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   887
        if self.config.keep_dump:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
   888
            print('-> you can get the dump file at', output)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   889
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   890
            os.remove(output)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   891
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   892
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   893
class CheckRepositoryCommand(Command):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   894
    """Check integrity of the system database of an instance.
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   895
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   896
    <instance>
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   897
      the identifier of the instance to check
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   898
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   899
    name = 'db-check'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   900
    arguments = '<instance>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
   901
    min_args = max_args = 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   902
    options = (
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   903
        ('checks',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   904
         {'short': 'c', 'type': 'csv', 'metavar': '<check list>',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   905
          'default': ('entities', 'relations',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   906
                      'mandatory_relations', 'mandatory_attributes',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   907
                      'metadata', 'schema', 'text_index'),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   908
          '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
   909
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
   910
metadata, text_index and schema.'}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   911
         ),
1469
ba9759972b52 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   912
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   913
        ('autofix',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   914
         {'short': 'a', 'type': 'yn', 'metavar': '<yes or no>',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   915
          'default': False,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   916
          'help': 'Automatically correct integrity problems if this option \
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   917
is set to "y" or "yes", else only display them'}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   918
         ),
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   919
        ('reindex',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   920
         {'short': 'r', 'type': 'yn', 'metavar': '<yes or no>',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   921
          'default': False,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   922
          'help': 're-indexes the database for full text search if this \
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   923
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
   924
         ),
2493
9806571ea790 major refactoring of database dump/restore:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   925
        ('force',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   926
         {'short': 'f', 'action': 'store_true',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   927
          'default': False,
2473
490f88fb99b6 new distinguish repairing/creating from regular start.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2461
diff changeset
   928
          '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
   929
         ),
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   930
    )
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   931
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   932
    def run(self, args):
6184
da580218a5b3 [c-c db-check] add missing import
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   933
        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
   934
        appid = args[0]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   935
        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
   936
        config.repairing = self.config.force
9797
4e640ab62f51 [tests/checkintegrity] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9759
diff changeset
   937
        repo, _cnx = repo_cnx(config)
4e640ab62f51 [tests/checkintegrity] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9759
diff changeset
   938
        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
   939
            check(repo, cnx,
9797
4e640ab62f51 [tests/checkintegrity] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9759
diff changeset
   940
                  self.config.checks,
4e640ab62f51 [tests/checkintegrity] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9759
diff changeset
   941
                  self.config.reindex,
4e640ab62f51 [tests/checkintegrity] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9759
diff changeset
   942
                  self.config.autofix)
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
11361
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   945
class DBIndexSanityCheckCommand(Command):
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   946
    """Check database indices of an instance.
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   947
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   948
    <instance>
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   949
      identifier of the instance to check
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   950
    """
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   951
    arguments = '<instance>'
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   952
    name = 'db-check-index'
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   953
    min_args = 1
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   954
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   955
    def run(self, args):
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   956
        from cubicweb.server.checkintegrity import check_indexes
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   957
        config = ServerConfiguration.config_for(args[0])
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   958
        repo, cnx = repo_cnx(config)
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   959
        with cnx:
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   960
            status = check_indexes(cnx)
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   961
        sys.exit(status)
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   962
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
   963
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   964
class RebuildFTICommand(Command):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   965
    """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
   966
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
   967
    <instance> [etype(s)]
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   968
      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
   969
cc83a3f16c0f [fti] make db-rebuild-fti accept etypes on command line (closes #2410508)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8434
diff changeset
   970
    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
   971
    only specified etypes will be considered.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   972
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   973
    name = 'db-rebuild-fti'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2473
diff changeset
   974
    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
   975
    min_args = 1
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
    def run(self, args):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   978
        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
   979
        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
   980
        etypes = args or None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   981
        config = ServerConfiguration.config_for(appid)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   982
        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
   983
        with cnx:
10354
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10237
diff changeset
   984
            reindex_entities(repo.schema, cnx, etypes=etypes)
9577
c52441e4a3d7 [serverctl] use repoapi for db-check, add-source, rebuild-fti commands
Julien Cristau <julien.cristau@logilab.fr>
parents: 9485
diff changeset
   985
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   986
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   987
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
   988
class SynchronizeSourceCommand(Command):
11355
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
   989
    """Force sources synchronization.
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
   990
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
   991
    <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
   992
      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
   993
    <source>
11355
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
   994
      names of the sources to synchronize, if empty all sources will be synced.
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
   995
    """
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
   996
    name = 'source-sync'
11355
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
   997
    arguments = '<instance> [<source> <source> ...]'
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
   998
    min_args = 1
10400
383a5e629145 [serverctl] allow changing the log level for source-sync command
Julien Cristau <julien.cristau@logilab.fr>
parents: 10125
diff changeset
   999
    options = (
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1000
        ('loglevel',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1001
         {'short': 'l', 'type': 'choice', 'metavar': '<log level>',
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1002
          'default': 'info', 'choices': ('debug', 'info', 'warning', 'error')},
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1003
         ),
11355
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1004
        ('force',
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1005
         {'short': 'f', 'action': 'store_true', 'default': False,
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1006
          'help': 'force source synchronization (ignore synchronization interval)'},
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1007
         ),
10400
383a5e629145 [serverctl] allow changing the log level for source-sync command
Julien Cristau <julien.cristau@logilab.fr>
parents: 10125
diff changeset
  1008
    )
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
  1009
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
  1010
    def run(self, args):
10489
8a2e2efe9362 [serverctl] fix source-sync command
Julien Cristau <julien.cristau@logilab.fr>
parents: 10411
diff changeset
  1011
        from cubicweb import repoapi
10400
383a5e629145 [serverctl] allow changing the log level for source-sync command
Julien Cristau <julien.cristau@logilab.fr>
parents: 10125
diff changeset
  1012
        from cubicweb.cwctl import init_cmdline_log_threshold
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
  1013
        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
  1014
        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
  1015
        config.log_format = '%(levelname)s %(name)s: %(message)s'
10400
383a5e629145 [serverctl] allow changing the log level for source-sync command
Julien Cristau <julien.cristau@logilab.fr>
parents: 10125
diff changeset
  1016
        init_cmdline_log_threshold(config, self['loglevel'])
10489
8a2e2efe9362 [serverctl] fix source-sync command
Julien Cristau <julien.cristau@logilab.fr>
parents: 10411
diff changeset
  1017
        repo = repoapi.get_repository(config=config)
10526
459d6f24754b [serverct] call server_{maintenance,shutdown} hooks around source-sync command
Julien Cristau <julien.cristau@logilab.fr>
parents: 10525
diff changeset
  1018
        repo.hm.call_hooks('server_maintenance', repo=repo)
11355
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1019
        errors = False
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1020
        with repo.internal_cnx() as cnx:
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1021
            sources = []
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1022
            if len(args) >= 2:
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1023
                for name in args[1:]:
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1024
                    try:
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1025
                        source = repo.sources_by_uri[name]
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1026
                    except KeyError:
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1027
                        cnx.error('no source named %r' % name)
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1028
                        errors = True
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1029
                    else:
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1030
                        sources.append(source)
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1031
            else:
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1032
                for uri, source in list(repo.sources_by_uri.items()):
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1033
                    if (uri != 'system' and
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1034
                            repo.config.source_enabled(source) and
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1035
                            source.config['synchronize']):
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1036
                        sources.append(source)
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1037
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1038
            for source in sources:
11345
27b98f3cceae [datafeed] attempt to acquire synchronization lock even when force is given
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11190
diff changeset
  1039
                try:
11355
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1040
                    stats = source.pull_data(cnx, force=self['force'], raise_on_error=True)
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1041
                except Exception:
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1042
                    cnx.exception('while trying to update source %s', source)
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1043
                    errors = True
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1044
                else:
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1045
                    for key, val in stats.items():
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1046
                        if val:
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1047
                            print(key, ':', val)
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1048
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1049
        if errors:
47b0b08fbb4b [serverctl] allow to sync multiple and all sources in source-sync command
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11345
diff changeset
  1050
            raise ExecutionError('All sources where not synced')
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
  1051
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
  1052
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
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
  1054
    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
  1055
    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
  1056
                                 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
  1057
    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
  1058
                       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
  1059
    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
  1060
    # 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
  1061
    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
  1062
        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
  1063
        if rule:
10612
84468b90e9c1 [py3k] basestring → six.string_types
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10589
diff changeset
  1064
            perms[p] = tuple(str(x) if isinstance(x, string_types) else x
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
  1065
                             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
  1066
    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
  1067
e84414be8506 [serverctl] complete the schema-diff command with options that will fix & enhance it.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9002
diff changeset
  1068
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
  1069
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
  1070
    """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
  1071
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
    <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
  1073
      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
  1074
    <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
  1075
      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
  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
    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
  1078
    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
  1079
    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
  1080
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
    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
  1082
        from yams.diff import schema_diff
10527
2379f136d48c [serverctl] fix schema-diff command
Julien Cristau <julien.cristau@logilab.fr>
parents: 10526
diff changeset
  1083
        from cubicweb import repoapi
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
        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
  1085
        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
  1086
        config = ServerConfiguration.config_for(appid)
11190
9b3a4ceff06a [serverctl] allow schema-diff when db and fs are not in sync
Julien Cristau <julien.cristau@logilab.fr>
parents: 11126
diff changeset
  1087
        config.repairing = True
10527
2379f136d48c [serverctl] fix schema-diff command
Julien Cristau <julien.cristau@logilab.fr>
parents: 10526
diff changeset
  1088
        repo = repoapi.get_repository(config=config)
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
  1089
        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
  1090
        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
  1091
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
  1092
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
  1093
for cmdclass in (CreateInstanceDBCommand, InitInstanceCommand,
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
  1094
                 GrantUserOnInstanceCommand, ResetAdminPasswordCommand,
11361
5a857bba1b79 [c-c] Add a command to check database index
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11355
diff changeset
  1095
                 DBDumpCommand, DBRestoreCommand, DBCopyCommand, DBIndexSanityCheckCommand,
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6379
diff changeset
  1096
                 AddSourceCommand, CheckRepositoryCommand, RebuildFTICommand,
9485
2b47e800cea6 [serverctl] remove broken schema-sync command
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
  1097
                 SynchronizeSourceCommand, SchemaDiffCommand,
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
  1098
                 ):
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6132
diff changeset
  1099
    CWCTL.register(cmdclass)
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1100
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1101
# 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
  1102
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1103
db_options = (
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1104
    ('db',
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1105
     {'short': 'd', 'type': 'named', 'metavar': '[section1.]key1:value1,[section2.]key2:value2',
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1106
      'default': None,
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1107
      'help': '''set <key> in <section> to <value> in "source" configuration file. If
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1108
<section> is not specified, it defaults to "system".
10077
1a28c0b0a0b4 [c-c configure] make it possible to specify the section for sources configuration (closes #3477678)
David Douard <david.douard@logilab.fr>
parents: 10010
diff changeset
  1109
1a28c0b0a0b4 [c-c configure] make it possible to specify the section for sources configuration (closes #3477678)
David Douard <david.douard@logilab.fr>
parents: 10010
diff changeset
  1110
Beware that changing admin.login or admin.password using this command
1a28c0b0a0b4 [c-c configure] make it possible to specify the section for sources configuration (closes #3477678)
David Douard <david.douard@logilab.fr>
parents: 10010
diff changeset
  1111
will NOT update the database with new admin credentials.  Use the
1a28c0b0a0b4 [c-c configure] make it possible to specify the section for sources configuration (closes #3477678)
David Douard <david.douard@logilab.fr>
parents: 10010
diff changeset
  1112
reset-admin-pwd command instead.
1a28c0b0a0b4 [c-c configure] make it possible to specify the section for sources configuration (closes #3477678)
David Douard <david.douard@logilab.fr>
parents: 10010
diff changeset
  1113
''',
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1114
      }),
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1115
)
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1116
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1117
ConfigureInstanceCommand.options = merge_options(
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1118
    ConfigureInstanceCommand.options + db_options)
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1119
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1120
configure_instance = ConfigureInstanceCommand.configure_instance
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1121
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1122
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1123
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
  1124
    configure_instance(self, appid)
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1125
    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
  1126
        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
  1127
        srccfg = appcfg.read_sources_file()
10662
10942ed172de [py3k] dict.iteritems → dict.items
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10612
diff changeset
  1128
        for key, value in self.config.db.items():
10077
1a28c0b0a0b4 [c-c configure] make it possible to specify the section for sources configuration (closes #3477678)
David Douard <david.douard@logilab.fr>
parents: 10010
diff changeset
  1129
            if '.' in key:
1a28c0b0a0b4 [c-c configure] make it possible to specify the section for sources configuration (closes #3477678)
David Douard <david.douard@logilab.fr>
parents: 10010
diff changeset
  1130
                section, key = key.split('.', 1)
1a28c0b0a0b4 [c-c configure] make it possible to specify the section for sources configuration (closes #3477678)
David Douard <david.douard@logilab.fr>
parents: 10010
diff changeset
  1131
            else:
1a28c0b0a0b4 [c-c configure] make it possible to specify the section for sources configuration (closes #3477678)
David Douard <david.douard@logilab.fr>
parents: 10010
diff changeset
  1132
                section = 'system'
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1133
            try:
10077
1a28c0b0a0b4 [c-c configure] make it possible to specify the section for sources configuration (closes #3477678)
David Douard <david.douard@logilab.fr>
parents: 10010
diff changeset
  1134
                srccfg[section][key] = value
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1135
            except KeyError:
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1136
                raise ConfigurationError('unknown configuration key "%s" in section "%s" for source'
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1137
                                         % (key, section))
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1138
        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
  1139
        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
  1140
        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
  1141
        srccfg['admin'] = admcfg
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1142
        appcfg.write_sources_file(srccfg)
11126
9bacaf91afbc flake8 serverctl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
  1143
9002
f98d1c46ed9f [cwctl] add configure command to cw-ctl (closes #2709702)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8984
diff changeset
  1144
ConfigureInstanceCommand.configure_instance = configure_instance2