Example #1
0
def update_region(_id):
    where = {'_id': ObjectId(_id)}
    record = db.collection('regions').find_one(where)
    if not record:
        return jsonify({'message': 'record not found', 'code': '124040'}), 404

    payload = request.get_json()
    if not payload:
        return jsonify({
            'message': 'miss required params',
            'code': 124001
        }), 400
    data = dict()
    allow_fields = [
        'platform', 'ip_range', 'bandwidth', 'contact', 'name', 'description'
    ]
    for key, value in payload.items():
        if key in allow_fields:
            data[key] = value

    db.collection('regions').update_one(where, {'$set': data})
    data['_id'] = _id
    logger.info('update region', extra={'record': record, 'changed': data})

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #2
0
def delete(_id):
    record = db.collection('configurations').find_one({'_id': ObjectId(_id)})
    if not record:
        return jsonify({
            'message': 'record not found',
            'code': 104040,
        }), 404

    is_register = Playbook.find_one({'register': {'$in': [str(_id)]}})
    if is_register:
        return jsonify({
            'message':
            'target record is bind to playbook: %s' % is_register.get('name'),
            'code':
            104038
        }), 403

    Configuration.delete_one({'_id': record['_id']})
    msg = 'update configuration, name: {}'.format(record.get('name'))
    logger.info(msg, extra={'record': record, 'force': False})

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #3
0
def delete_task(_id, state):
    record = db.collection('tasks').find_one({'t_id': _id})
    if not record:
        return jsonify({
            'message': 'task not found',
            'code': 194041
        }), 404

    task_id = record.get('t_id')
    queue = record.get('queue')
    try:
        task = Task.from_id(tiger, queue, state, task_id)
        task._move(from_state=state)
        db.collection('tasks').update_one({'_id': record['_id']}, {'$set': {
            'updated_at': datetime.now(),
            'state': 'delete',
        }})
        extra = {
            'queue': queue,
            'task_id': task_id,
            'from_state': state,
            'to_state': None
        }
        logger.info('cancel task', extra=extra)
    except TaskNotFound:
        return jsonify({
            'message': 'invalid task',
            'code': 104044
        }), 404

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #4
0
def update_group(_id):
    where = {'_id': ObjectId(_id)}
    record = db.collection('groups').find_one(where)
    if not record:
        return jsonify({'message': 'record not found', 'code': '124040'}), 404

    payload = request.get_json()
    if not payload:
        return jsonify({
            'message': 'miss required params',
            'code': 124001
        }), 400

    data = dict()
    for key, value in payload.items():
        if record.get('key'):
            data[key] = value

    db.collection('regions').update_one(where, {'$set', data})
    logger.info('update group', extra={'record': record, 'changed': data})

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #5
0
def retry(_id, state):
    record = db.collection('tasks').find_one({'_id': ObjectId(_id)})
    if not record:
        return jsonify({
            'message': 'task not found',
            'code': 194041
        }), 404

    task_id = record.get('t_id')
    queue = record.get('queue')
    try:
        task = Task.from_id(tiger, queue, state, task_id)
        task.retry()
        db.collection('tasks').update_one({'_id': record['_id']}, {'$set': {
            'updated_at': datetime.now(),
            'state': state,
        }})
        extra = {
            'queue': queue,
            'task_id': task_id,
            'from_state': state,
            'to_state': QUEUED
        }
        logger.info('retry task', extra=extra)
    except TaskNotFound:
        return jsonify({
            'message': 'invalid task',
            'code': 104044
        }), 404

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #6
0
def save_alert():
    payload = request.get_json()
    if not payload:
        return jsonify({
            'message': 'invalid params',
            'code': 104000
        }), 400

    alerts = payload.get('alerts')
    alert_type = payload.get('type')
    if not alerts or type(alerts) != list:
        return jsonify({
            'message': 'invalid param alerts',
            'code': 104001
        }), 400

    where = {
        '_id': ObjectId(login_user.get('user_id'))
    }
    field = 'alerts.' + alert_type
    update = {
        '$set': {
            field: alerts
        }
    }

    user = User()
    record = user.collection.find_one(where)
    user.collection.update_one(where, update=update)
    logger.info('add alerts', extra={'change': update, 'record': record})

    return jsonify({
        'message': 'ok',
        'code': 0
    })
Example #7
0
def delete_inventory(_id):
    host = Host()
    record = host.find_by_id(_id)
    if not record:
        return jsonify({'message': 'record not found', 'code': 104040}), 404

    update = {
        '$set': {
            'status': -1,
            'delete_at': time.time(),
            'delete_by': login_user.get('username')
        }
    }

    host.collection.update_one({'_id': record['_id']}, update=update)
    msg = 'delete inventory:, hostname: {}'.format(record.get('hostname'))
    extra = {
        'record': record,
    }

    logger.info(msg, extra=extra)

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #8
0
def ansible_inventory_patrol():
    uuid = str(uuid4())
    logger.info('start check ansible inventory', extra={'uuid': uuid})
    where = {'state': 'active', 'status': {'$ne': -1}}
    page = 1
    limit = 50
    while True:
        skip = (page - 1) * limit
        records = Host.find(where, skip=skip, limit=limit)
        records = list(records)
        if not records:
            break

        try:
            inventory = _pack_inventory(records)
            if not inventory:
                continue

            tasks = [{
                'action': {
                    'module': 'ping',
                }
            }]
            options = {}
            runner = AdHocRunner(inventory, options)
            runner.run(pattern='all', tasks=tasks)
        except Exception as e:
            logger.error('ansible inventory patrol catch exception: {}'.format(
                str(e)))
        finally:
            page += 1

    logger.info('finish check ansible inventory', extra={'uuid': uuid})
Example #9
0
def test_docker():
    # print(current_app.logger.handlers)
    logger.info('aaaatest23412288886666')
    # client = Docker({
    #     'base_url': None,
    #     'image': 'alpine:latest',
    # })
    # # result = client.run(command='pwd', working_dir='/usr/lib', detach=False)
    # # print(result)
    # client.install('/usr/lib')

    return jsonify({'message': 'ok'})
Example #10
0
    def insert_one(cls, data, *args, **kwargs):
        model = cls()
        if data.get('status') is None:
            data['status'] = 1

        result = model.collection.insert_one(data, *args, **kwargs)
        record = data.copy()
        record['_id'] = result.inserted_id
        msg = 'insert new record to {}, _id: {}'.format(
            model.name, record['_id'])
        logger.info(msg, extra={'record': record})

        return result
Example #11
0
def add_key():
    user = login_user
    payload = request.get_json()
    if not payload:
        return jsonify({
            'message': 'illegal params',
            'code': 104000,
        }), 400

    public_key = payload.get('public_key')
    name = payload.get('name')
    if not public_key:
        return jsonify({'message': 'invalid public key', 'code': 104000}), 400

    ssh = SSHKey(public_key)
    try:
        ssh.parse()
    except Exception as err:
        return jsonify({
            'message': 'invalid ssh key: {}'.format(str(err)),
            'code': 104001,
        }), 400

    fingerprint = ssh.hash_md5()
    existed = db.collection('public_keys').find_one(
        {'fingerprint': fingerprint})
    if existed:
        return jsonify({
            'message': 'ssh public key existed',
            'code': 104003
        }), 400

    options = {'vault_pass': config.vault.get('secret')}
    encode = Vault(options).encrypt_string(public_key)
    data = {
        'fingerprint': fingerprint,
        'user_id': user.get('user_id'),
        'content': encode,
        'name': name,
        'created_at': time.time()
    }

    result = db.collection('public_keys').insert_one(data)
    data['_id'] = result.inserted_id
    logger.info('add public_keys', extra={'record': data})

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #12
0
def update_configuration(_id):
    payload = request.get_json()
    if not payload:
        return jsonify({
            'message': 'invalid params',
            'code': 184000,
        }), 400

    name = payload.get('name')
    record = db.collection('configurations').find_one({'_id': ObjectId(_id)})
    if not record:
        return jsonify({
            'message': 'record not found',
            'code': 104040,
        }), 404

    description = payload.get('description')
    maintainer = payload.get('maintainer') or []
    variables = payload.get('variables')
    status = payload.get('status')
    data = {}
    if name:
        data['name'] = name

    if description:
        data['description'] = description

    if variables:
        data['variables'] = variables

    if maintainer:
        data['maintainer'] = maintainer

    if status is not None:
        data['status'] = int(status)

    if len(data.keys()):
        update = {
            '$set': data,
        }
        db.collection('configurations').update_one({'_id': record['_id']},
                                                   update=update)
        msg = 'update configuration, name: {}'.format(record.get('name'))
        logger.info(msg, extra={'record': record, 'changed': data})

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #13
0
def delete_job(_id):
    record = Job.find_by_id(ObjectId(_id))
    if not record:
        return jsonify({'message': 'record not found', 'code': 104040}), 404

    update = {'$set': {'status': -1}}

    Job.update_one({'_id': record['_id']}, update=update)
    extra = {'record': record}
    logger.info('delete job', extra=extra)

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #14
0
def edit_book(_id):
    params = request.get_json() or request.form
    if not params:
        return jsonify({
            'message': 'invalid params',
            'code': 154000,
        }), 400

    name = params.get('name')
    description = params.get('description')
    status = params.get('status', 1)
    maintainer = params.get('maintainer', [])
    import_type = params.get('importType')
    galaxy_repo = params.get('galaxyRepo')
    record = Book.find_one({'_id': ObjectId(_id)})
    if not record:
        return jsonify({
            'message': 'record not found',
            'code': 154041,
        }), 404

    data = {
        'status': status,
    }

    if name:
        data['name'] = name

    if description:
        data['description'] = description

    if maintainer:
        data['maintainer'] = maintainer

    if import_type == 'galaxy':
        galaxy = AnsibleGalaxy([galaxy_repo], {'force': True})
        galaxy.install(record.get('_id'))

    Book.update_one({'_id': ObjectId(_id)}, {'$set': data}, upsert=True)
    logger.info('book update', extra={'record': record, 'changed': data})

    return jsonify({
        'message': 'ok',
        'code': 0,
        'data': data,
    })
Example #15
0
    def update_one(cls, where, update, **kwargs):
        model = cls()
        record = model.collection.find_one(where)
        if not record and not kwargs.get('upsert'):
            return False

        msg = 'update record from {}'.format(model.name)
        if record:
            msg = msg + ', _id: %s' % record.get('_id')

        extra = {
            'record': record,
            'change': update,
            'filter': where,
        }
        logger.info(msg, extra)

        return model.collection.update_one(where, update, **kwargs)
Example #16
0
def _remove_dir(_id):
    collection = db.collection('playbook')
    record = collection.find_one({'_id': ObjectId(_id)})
    if not record:
        return False

    children = collection.find({'parent': record['_id']})
    for item in children:
        if item.get('is_dir'):
            _remove_dir(item['_id'])
            continue

        collection.delete_one({'_id': item['_id']})
        logger.info('delete playbook file', extra={'record': item})

    collection.delete_one({'_id': record['_id']})
    logger.info('delete playbook file', extra={'record': record})

    return True
Example #17
0
def delete_group(_id):
    record = db.collection('groups').find_one({'_id': ObjectId(_id)})
    if not record:
        return jsonify({
            'message': 'record not found',
            'code': 104040,
        }), 404

    if not login_user.get('is_admin'):
        return jsonify({
            'message': 'permission deny',
            'code': 104030,
        }), 403

    if not record.get('add_by'):
        return jsonify({'message': 'protected record', 'code': 10086}), 400

    update = {
        '$set': {
            'status': -1,
            'delete_at': time.time(),
            'delete_by': login_user.get('username')
        }
    }

    group_id = str(record['_id'])
    db.collection('groups').update_one({'_id': record['_id']}, update=update)
    where = {'group': {'$in': [group_id]}}
    Host().collection.update_many(where, {'$pull': {'group': group_id}})
    msg = 'delete inventory:, name: {}'.format(record.get('name'))
    extra = {
        'record': record,
    }
    logger.info(msg, extra=extra)

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #18
0
    def add_menu():
        params = request.get_json()
        if not params:
            return jsonify({'message': 'param required', 'code': 4000}), 400

        checked = True
        if 'name' not in params:
            checked = False
        if 'route' not in params:
            checked = False
        if 'id' not in params:
            checked = False

        if 'status' in params:
            checked = type(params.get('status')) == int

        if checked is False:
            return jsonify({'message': 'param incorrect', 'code': 104001}), 400

        id = str(ObjectId.from_datetime(datetime.datetime.now()))
        data = {
            'name': params['name'],
            'route': params['route'],
            'id': id,
            'apis': params.get('apis') or [],
            'icon': params.get('icon', ''),
            'bpid': params.get('bpid') or '0',
            'mpid': params.get('mpid') or '0',
            'status': params.get('status', 1),
            'add_by': login_user.get('username'),
            'created_at': time.time()
        }
        db.collection('menus').insert_one(data)
        logger.info('add menu', extra={'record': data})

        return jsonify({
            'message': 'ok',
            'code': 0,
        })
Example #19
0
def edit_inventory(_id):
    user = login_user
    payload = request.get_json()
    if not payload:
        return jsonify({
            'message': 'miss required params',
            'code': 124001,
        }), 400
    record = db.collection('machines').find_one({'_id': ObjectId(_id)})
    if not record:
        return jsonify({'message': 'record not found', 'code': 124041}), 400

    payload.pop('_id')
    payload['updated_at'] = time.time()
    update = {'$set': payload}
    db.collection('machines').update_one({'_id': record['_id']}, update=update)
    logger.info('update machine', extra={'record': record, 'changed': payload})

    return jsonify({
        'message': 'ok',
        'code': 0,
        # 'data': diff
    })
Example #20
0
def add_group():
    user = login_user
    payload = request.get_json()
    if not payload:
        return jsonify({'message': 'invalid params', 'code': 124003}), 400
    region = payload.get('region')
    name = payload.get('name')
    if not payload.get('name') or not payload.get('region'):
        return jsonify({'message': 'invalid params', 'code': 124004}), 400
    dc = db.collection('regions').find_one({'_id': ObjectId(region)})
    if not dc:
        return jsonify({
            'message': 'data center existed',
            'code': 124005,
        }), 400
    check = db.collection('groups').find_one({'name': name})
    if check:
        return jsonify({
            'message': 'group existed',
            'code': 124004,
        }), 400

    data = {
        'name': name,
        'region': region,
        'add_by': user.get('username'),
        'description': payload.get('description', ''),
        'created_at': int(time.time())
    }
    result = db.collection('groups').insert_one(data)
    data['_id'] = result.inserted_id
    logger.info('add group', extra={'record': data})

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #21
0
    def delete_one(cls, where, force=False, **kwargs):
        model = cls()
        record = model.collection.find_one(where)
        if not record:
            return None

        msg = 'delete record from {}, _id: {}'.format(model.name,
                                                      record['_id'])
        extra = {
            'record': record,
            'filter': where,
        }
        update = {
            '$set': {
                'delete_at': time.time(),
                'status': -1,
            }
        }

        logger.info(msg, extra)
        if not force:
            return model.collection.update_one(where, update=update, **kwargs)

        return model.collection.delete_one(where)
Example #22
0
def run_task():
    payload = request.get_json()
    if not payload:
        return jsonify({
            'message': 'invalid params',
            'code': 114000,
        }), 400

    run_type = payload.get('type')
    inventory = payload.get('inventory')
    private_key = payload.get('private_key')
    module = payload.get('module')
    args = payload.get('args')
    entry = payload.get('entry')
    become_mehtod = payload.get('become_method')
    become_user = payload.get('become_user')
    verbosity = payload.get('verbosity', 0) or 1
    extra_options = payload.get('extraOptions')
    hosts = parse_cmdb_inventory(inventory)
    if not hosts:
        return jsonify({
            'message': 'invalid inventory',
            'code': 114001,
        }), 400

    options = {}
    if extra_options:
        options.update(extra_options)

    if verbosity:
        options['verbosity'] = verbosity

    if become_mehtod:
        options['become'] = 'yes'
        options['become_method'] = become_mehtod
        if become_user:
            options['become_user'] = become_user

    if run_type == 'adhoc':
        if not module:
            return jsonify({
                'message': 'invalid module',
                'code': 114002,
            }), 400

        tasks = [{'action': {'module': module, 'args': args}}]

        with NamedTemporaryFile('w+t', delete=True) as fd:
            if private_key:
                key_text = get_credential_content_by_id(
                    private_key, 'private_key')
                if not key_text:
                    return jsonify({
                        'message': 'invalid private_key',
                        'code': 104033,
                    }), 401

                fd.write(key_text)
                fd.seek(0)
                options['private_key'] = fd.name

            runner = AdHocRunner(hosts, options=options)
            logger.info('run ansible-adhoc',
                        extra={
                            'hosts': hosts,
                            'options': options
                        })
            res = runner.run('all', tasks)
            result = runner.format_result()

            return jsonify({'message': 'ok', 'code': 0, 'data': result})
    else:
        if not entry:
            return jsonify({
                'message': 'invalid entry',
                'code': 114004,
            }), 400

        with NamedTemporaryFile('w+t', delete=True) as fd:
            if private_key:
                key_text = get_credential_content_by_id(
                    private_key, 'private_key')
                if not key_text:
                    return jsonify({
                        'message': 'invalid private_key',
                        'code': 104033,
                    }), 401

                fd.write(key_text)
                fd.seek(0)
                options['private_key'] = fd.name

            with NamedTemporaryFile('w+t', delete=True) as fh:
                fh.write(entry)
                fh.seek(0)
                runner = PlayBookRunner(hosts, options)
                logger.info('run ansible-playbook',
                            extra={
                                'hosts': hosts,
                                'options': options
                            })
                runner.run(fh.name)
                result = runner.format_result()

                return jsonify({'message': 'ok', 'code': 0, 'data': result})
Example #23
0
def add_book():
    params = request.get_json() or request.form
    if not params:
        return jsonify({
            'message': 'invalid params',
            'code': 154000,
        }), 400

    name = params.get('name')
    if not name:
        return jsonify({
            'message': 'name param required',
            'code': 154001,
        }), 400

    existed = Book.find_one({'name': name})
    if existed:
        return jsonify({
            'message': 'book exist',
            'code': 154003,
        }), 400

    description = params.get('description')
    status = params.get('status', 1)
    bid = params.get('_id')
    import_type = params.get('importType')
    galaxy_repo = params.get('galaxyRepo')
    maintainer = params.get('maintainer', [])
    if bid:
        record = Book.find_one({'_id': ObjectId(bid)})
        if not record:
            return jsonify({
                'message': 'record not found',
                'code': 154041,
            }), 404

    else:
        if import_type == 'galaxy' and galaxy_repo:
            galaxy = AnsibleGalaxy([galaxy_repo])
            galaxy.install()
            logger.info('import galaxy', extra={'repo': galaxy_repo})

    data = {
        'name': name,
        'description': description,
        'maintainer': maintainer,
        'import_type': import_type,
        'galaxy_repo': galaxy_repo,
        'status': int(status),
        'created_at': int(time.time())
    }

    result = Book.update_one({'_id': ObjectId(bid)}, {'$set': data},
                             upsert=True)
    data['_id'] = result.upserted_id

    return jsonify({
        'message': 'ok',
        'code': 0,
        'data': data,
    })
Example #24
0
def update_app(_id):
    payload = request.get_json()
    if not payload:
        return jsonify({
            'message': 'empty params',
            'code': 174000,
        }), 400

    record = db.collection('apps').find_one({'_id': ObjectId(_id)})
    if not record:
        return jsonify({'message': 'record not found', 'code': 104040}), 404

    name = payload.get('name')
    app_type = payload.get('type')
    params = payload.get('params')
    repo = payload.get('repo')
    server = payload.get('server')
    document = payload.get('document')
    protocol = payload.get('protocol')
    port = payload.get('port')
    description = payload.get('description')
    integration = Integration(app_type, params)
    check = integration.check_app_params()
    update = {}
    if not check:
        return jsonify({
            'message': 'invalid ' + app_type + 'params',
            'code': 174003
        }), 400

    if name != record.get('name'):
        existed = db.collection('apps').find_one({'name': name})
        if existed:
            return jsonify({'message': 'name existed', 'code': 104001}), 400

        update['name'] = name

    if app_type:
        update['type'] = app_type

    if params:
        update['params'] = params

    if server:
        update['server'] = server

    if document:
        update['document'] = document

    if repo:
        update['repo'] = repo

    if port:
        update['port'] = port

    if protocol:
        update['protocol'] = protocol

    if description:
        update['description'] = description

    if update:
        update['updated_at'] = time.time()

    data = {'$set': update}
    # maintainer = payload.get('maintainer') or []
    db.collection('apps').update_one({'_id': record['_id']}, update=data)
    logger.info('add apps', extra={'record': record, 'changed': update})

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #25
0
def add_adhoc():
    payload = request.get_json()
    if not payload:
        return jsonify({
            'message': 'invalid params',
            'code': 104001,
        }), 400

    module = payload.get('module')
    args = payload.get('args')
    inventory = payload.get('inventory')
    private_key = payload.get('private_key')
    verbosity = payload.get('verbosity')
    name = payload.get('name')
    schedule = payload.get('schedule')
    check = payload.get('check')
    job_id = payload.get('job_id')
    extra_options = payload.get('extraOptions')
    status = int(payload.get('status', 0))
    notification = payload.get('notification')
    maintainer = payload.get('maintainer') or []
    if maintainer and isinstance(maintainer, list):
        users = db.collection('users').find({'username': {'$in': maintainer}})
        names = list(map(lambda i: i['username'], users))
        maintainer.extend(names)

    maintainer.append(login_user.get('username'))
    if not job_id:
        existed = db.collection('jobs').find_one({'name': name})
        if existed and existed.get('status') != -1:
            return jsonify({'message': 'name exist', 'code': 104007}), 400

    if not module or not inventory or not name:
        return jsonify({
            'message': 'miss required params',
            'code': 104002,
        }), 400

    # check_module = db.collection('ansible_modules').find_one({
    #     'name': module
    # })
    #
    # if not check_module:
    #     return jsonify({
    #         'message': 'invalid module',
    #         'code': 104003,
    #     }), 400

    inventory_content = parse_cmdb_inventory(inventory)
    if not inventory:
        return jsonify({
            'message': 'invalid inventory',
            'code': 104004,
        }), 400

    key_text = get_credential_content_by_id(private_key, 'private_key')
    if not key_text:
        return jsonify({
            'message': 'invalid private key',
            'code': 104004,
        }), 400

    options = {}
    if extra_options:
        options.update(extra_options)

    if verbosity:
        options['verbosity'] = verbosity

    if check:
        with NamedTemporaryFile('w+t', delete=True) as fd:
            fd.write(key_text)
            fd.seek(0)
            options['private_key'] = fd.name
            tasks = [{'action': {'module': module, 'args': args}}]
            hosts = inventory_content
            runner = AdHocRunner(hosts, options=options)
            runner.run('all', tasks)
            result = runner.get_result()

            return jsonify({'message': 'ok', 'code': 0, 'data': result})

    else:
        token = str(base64.b64encode(bytes(current_request_id(), 'utf8')),
                    'utf8')
        data = {
            'name': name,
            'template': {
                'inventory': inventory,
                'private_key': private_key,
                'verbosity': verbosity,
                'module': module,
                'args': args,
                'extraOptions': extra_options,
            },
            'extra': {
                'schedule': schedule,
                'notification': notification,
            },
            'token': token,
            'maintainer': maintainer,
            'type': 'adhoc',
            'created_at': time.time(),
            'status': status,
            'add_by': login_user.get('username')
        }

        if job_id:
            record = db.collection('jobs').find_one({'_id': ObjectId(job_id)})
            if not record:
                return jsonify({
                    'message': 'record not found',
                    'code': 104040
                }), 404

            update = {
                '$set': data,
            }
            db.collection('jobs').update_one({'_id': ObjectId(job_id)},
                                             update=update)
            logger.info('update job',
                        extra={
                            'record': record,
                            'changed': data
                        })
        else:
            result = db.collection('jobs').insert_one(data)
            data['_id'] = result.inserted_id
            logger.info('add job', extra={'record': data})

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #26
0
def add_apps():
    current_user = login_user.get('username')
    payload = request.get_json()
    if not payload:
        return jsonify({
            'message': 'empty params',
            'code': 174000,
        }), 400

    name = payload.get('name')
    app_type = payload.get('type')
    params = payload.get('params')
    integration = Integration(app_type, params)
    check = integration.check_app_params()
    if not check:
        return jsonify({
            'message': 'invalid ' + app_type + 'params',
            'code': 174003
        }), 400

    if not name or not app_type or not params:
        return jsonify({
            'message': 'miss required params',
            'code': 174001,
        }), 400

    existed = db.collection('apps').find_one({'name': name})
    if existed:
        return jsonify({
            'message': 'name existed',
            'code': 174002,
        }), 400

    repo = payload.get('repo')
    server = payload.get('server')
    document = payload.get('document')
    protocol = payload.get('protocol')
    port = payload.get('port')
    description = payload.get('description')
    # @todo
    # maintainer = payload.get('maintainer') or []
    maintainer = [current_user]
    maintainer = set(maintainer)
    data = {
        'name': name,
        'server': server,
        'document': document,
        'type': app_type,
        'params': params,
        'repo': repo,
        'status': 1,
        'protocol': protocol,
        'port': port,
        'description': description,
        'maintainer': list(maintainer),
        'add_by': login_user.get('username'),
        'created_at': int(time.time())
    }
    logger.info('add apps', extra={'record': data})
    Application.insert_one(data)

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #27
0
def add_team():
    payload = request.get_json()
    if not payload:
        return jsonify({'message': 'invalid params', 'code': 104000}), 400

    is_admin = login_user.get('is_admin')
    if not is_admin:
        return jsonify({'message': 'admin required', 'code': 104039}), 403

    name = payload.get('name')
    description = payload.get('description')
    parent = payload.get('parent')
    role_ids = payload.get('role_ids')
    members = payload.get('members') or []
    master = payload.get('master') or [login_user.get('username')]
    record = Team.find_one({'name': name})
    if record:
        return jsonify({'message': 'name existed', 'code': 104001}), 400

    if role_ids:
        role_record = Role.find_by_ids(role_ids)
        if not role_record:
            return jsonify({'message': 'role not found', 'code': 104041}), 404

    data = {
        'name': name,
        'description': description,
        'master': master,
        'parent': parent,
        'add_by': login_user.get('username'),
        'created_at': time.time(),
    }

    result = Team.insert_one(data)
    team_id = str(result.inserted_id)
    data['_id'] = team_id
    logger.info('add team', extra={'record': data})
    if not role_ids:
        role = {
            'name': name,
            'type': 'team',
            'role': 'owner',
            'add_by': login_user.get('username'),
            'created_at': time.time(),
        }
        result = Role.insert_one(role)
        role['_id'] = result.inserted_id
        role['team_id'] = data['_id']
        role_ids = [str(role['_id'])]
        # team_role = {
        #     'role_id': result.inserted_id,
        #     'team_id': role['team_id'],
        #     'add_by': login_user.get('username'),
        #     'created_at': time.time(),
        # }
        # Model.build_model('team_roles').insert_one(team_role)

    for role_id in role_ids:
        team_role = {
            '$set': {
                'team_id': team_id,
                'role_id': role_id,
                'created_at': time.time()
            }
        }
        where = {
            'team_id': team_id,
            'role_id': role_id,
        }

        db.collection('team_roles').update_one(where, team_role, upsert=True)

    Team().add_member(team_id, members, owner_id=login_user.get('user_id'))

    return jsonify({
        'message': 'ok',
        'code': 0,
    })
Example #28
0
    def edit_menu(_id):
        params = request.get_json()
        if not params:
            return jsonify({'message': 'param required', 'code': 4000}), 400

        is_admin = login_user.get('is_admin')
        if not is_admin:
            return jsonify({'message': 'permission deny', 'code': 104010}), 401

        obj_id = ObjectId(_id)
        record = db.collection('menus').find_one({'_id': obj_id})
        if not record:
            return jsonify({
                'message': 'record not found',
                'code': 104040
            }), 404

        name = params.get('name')
        route = params.get('route')
        icon = params.get('icon')
        mpid = params.get('mpid')
        bpid = params.get('bpid')
        status = params.get('status', 1)
        apis = params.get('apis') or []
        update = {'apis': apis}
        if name:
            update['name'] = name

        if route:
            update['route'] = route

        if icon:
            update['icon'] = icon

        if status is not None:
            update['status'] = status

        if mpid:
            if int(mpid) > 0:
                existed = db.collection('menus').find_one({'id': mpid})
                if not existed:
                    return jsonify({
                        'message': 'invalid mpid',
                        'code': 104002
                    }), 400

            elif mpid == record.get('id'):
                return jsonify({
                    'message': 'invalid mpid',
                    'code': 104003
                }), 400

            update['mpid'] = str(mpid)

        if bpid:
            if int(bpid) > 0:
                existed = db.collection('menus').find_one({'id': bpid})
                if not existed:
                    return jsonify({
                        'message': 'invalid bpid',
                        'code': 104002
                    }), 400

            elif bpid == record.get('id'):
                return jsonify({
                    'message': 'invalid bpid',
                    'code': 104003
                }), 400

            update['bpid'] = str(bpid)

        if update:
            update['updated_at'] = datetime.datetime.now()
            db.collection('menus').update_one({'_id': obj_id},
                                              {'$set': update})
            logger.info('update menu',
                        extra={
                            'record': record,
                            'change': update
                        })

        return jsonify({
            'message': 'ok',
            'code': 0,
        })
Example #29
0
def explore():
    payload = request.get_json()
    form = request.form
    payload = payload or form
    if not payload:
        return jsonify({
            'message': 'empty request payload',
            'code': 144000,
        }), 400

    explore_type = payload.get('type')
    credential = payload.get('credential')
    # if not credential:
    #     return jsonify({
    #         'message': 'param credential required',
    #         'code': 144000,
    #     }), 400

    private_key = ''
    if credential:
        credential = Credential.find_by_id(credential)
        if not credential or not credential.get('status'):
            return jsonify({
                'message': 'invalid credential',
                'code': 144040,
            }), 404

        vault = Vault({'vault_pass': config.vault.get('secret')})

        body = credential['body']
        private_key = vault.decrypt_string(body[credential['type']])

    maintainer = payload.get('maintainer')
    if not maintainer or type(maintainer) != list:
        maintainer = [login_user.get('username')]
    else:
        maintainer.extend(login_user.get('username'))

    if explore_type == 'manual':
        region = payload.get('region')
        group = payload.get('group')
        ssh_host = payload.get('ssh_host')
        ssh_user = payload.get('ssh_user')
        ssh_port = payload.get('ssh_port') or 22
        if not ssh_host or not ssh_user or not ssh_port:
            return jsonify({
                'message': 'illegal ssh connection params',
                'code': 144001,
            }), 400

        region_record = Region.find_one({'_id': ObjectId(region)})
        if not region_record:
            return jsonify({
                'message': 'invalid region',
                'code': 144002,
            }), 400

        group_record = Group.find_by_ids(group)
        if not group_record:
            return jsonify({
                'message': 'invalid group',
                'code': 144003,
            }), 400

        options = {
            'remote_user': ssh_user,
            'verbosity': 3,
        }
        hosts = ssh_host + ':' + str(ssh_port) + ','
        runner = setup(hosts, options, private_key)
        result = runner.get_result()
        data = process_ansible_setup(result)
        records = []
        if not data:
            return jsonify({
                'code': 144009,
                'message': 'fetch target host failed',
                'data': result
            }), 406

        for item in data:
            item['ansible_ssh_host'] = ssh_host
            item['ansible_ssh_user'] = ssh_user
            item['ansible_ssh_port'] = ssh_port
            item['maintainer'] = maintainer
            item['group'] = list(map(lambda i: str(i['_id']), group_record))
            item['add_by'] = login_user.get('username')
            item['state'] = 'active'
            where = {'ansible_ssh_host': item['ansible_ssh_host']}
            update = {'$set': item}
            result = db.collection('machines').update_one(where,
                                                          update,
                                                          upsert=True)
            extra = item.copy()
            extra['_id'] = result.upserted_id
            logger.info('add machines hostname: '.format({item['hostname']}),
                        extra={'record': data})
            records.append(item)
        # def func(item):
        #     item['ansible_ssh_host'] = ssh_host
        #     item['ansible_ssh_user'] = ssh_user
        #     item['ansible_ssh_port'] = ssh_port
        #     item['maintainer'] = maintainer
        #     item['group'] = list(map(lambda i: str(i['_id']), group_record))
        #     item['add_by'] = login_user.get('username')
        #     item['state'] = 'active'
        #
        #     return item
        #
        # data = list(map(func, data))
        # db.collection('machines').insert_many(data)

        return jsonify({
            'message': 'ok',
            'code': 0,
            'data': records,
            'records': data
        })

    files = request.files
    if not files:
        return jsonify({
            'message': 'illegal param',
            'code': 104000,
        }), 400

    file = files.get('inventory')
    if not files:
        return jsonify({
            'message': 'files required',
            'code': 104001,
        }), 400

    sources = file.read().decode('utf-8')
    # inventory is not only yaml
    with NamedTemporaryFile('w+t', delete=True) as fd:
        fd.write(sources)
        fd.seek(0)
        options = {
            'verbosity': 0,
        }
        runner = setup(fd.name, options, private_key)
        result = runner.get_result()
        data = process_ansible_setup(result)
        if not data:
            return jsonify({
                'code': 144009,
                'message': 'fetch target host failed',
                'data': result
            }), 400

        manager = runner.inventory
        hosts = parser_inventory(manager)
        records = []
        default_region = db.collection('regions').find_one({'name': 'default'})
        if not default_region:
            result = db.collection('regions').insert_one({
                'name':
                'default',
                'add_by':
                None,
                'description':
                'auto generate',
                'created_at':
                time.time(),
            })
            region_id = str(result.inserted_id)
        else:
            region_id = str(default_region.get('_id'))

        for node in data:
            hostname = node.get('ansible_hostname')
            for group, host in hosts.items():
                where = {'name': group}
                # insert_data = {'$set': insert_data}
                existed = db.collection('groups').find_one(where)
                if not existed:
                    insert_data = {
                        'name': group,
                        'region': region_id,
                        'description': 'auto generator',
                        'state': 'active',
                        'add_by': login_user.get('username'),
                        'maintainer': None,
                        'created_at': int(time.time())
                    }
                    insert_result = db.collection('groups').insert_one(
                        insert_data)
                    group = insert_result.inserted_id
                else:
                    group = existed['_id']

                if host.get('name') == hostname:
                    vars = host.get('vars')
                    node['ansible_ssh_host'] = vars.get('ansible_ssh_host')
                    node['ansible_ssh_user'] = vars.get(
                        'ansible_ssh_user', 'root')
                    node['ansible_ssh_port'] = vars.get(
                        'ansible_ssh_port', '22')
                    node['group'] = [group]
                    node['add_by'] = login_user.get('username')
                    node['state'] = 'active'

                    break

            records.append(node)

        for record in records:
            where = {'ansible_ssh_host': record['ansible_ssh_host']}
            update = {'$set': record}
            result = db.collection('machines').update_one(where,
                                                          update,
                                                          upsert=True)
            extra = record.copy()
            extra['_id'] = result.upserted_id
            logger.info('add machines hostname: '.format({record['hostname']}),
                        extra={'record': data})

        return jsonify({
            'message': 'ok',
            'code': 0,
            'data': data,
            'records': records,
        })
Example #30
0
def add_book():
    params = request.get_json() or request.form
    if not params:
        return jsonify({
            'message': 'invalid params',
            'code': 154000,
        }), 400

    name = params.get('name')
    if not name:
        return jsonify({
            'message': 'name param required',
            'code': 154001,
        }), 400

    existed = Book.find_one({'name': name})
    if existed:
        return jsonify({
            'message': 'book exist',
            'code': 154003,
        }), 400

    description = params.get('description')
    status = params.get('status', 0)
    book_id = params.get('_id')
    import_type = params.get('importType')
    repo = params.get('repo')
    maintainer = params.get('maintainer', [])
    readonly = params.get('readonly', False)

    if book_id:
        record = Book.find_by_id(book_id)
        if not record:
            return jsonify({
                'message': 'record not found',
                'code': 154041,
            }), 404
    else:
        data = {
            'name': name,
            'readonly': readonly,
            'description': description,
            'maintainer': maintainer,
            'import_type': import_type,
            'repo': repo,
            'created_at': int(time.time())
        }
        result = Book.insert_one(data)
        book_id = result.inserted_id
        if import_type == 'galaxy' and repo:
            galaxy = AnsibleGalaxy([repo])
            galaxy.install(book_id)
            logger.info('import galaxy', extra={'repo': repo})
        elif import_type == 'git' and repo:
            git = GitDownload({'repository': repo})
            dest = git.install()
            Workspace().import_book_from_dir(dest, book_id, exclude=['.git'])
    data = {
        'readonly': readonly,
        'description': description,
        'maintainer': maintainer,
        'import_type': import_type,
        'repo': repo,
        'status': int(status),
        'updated_at': time.time(),
    }

    Book.update_one({'_id': ObjectId(book_id)}, {'$set': data}, upsert=True)
    data['_id'] = book_id

    return jsonify({
        'message': 'ok',
        'code': 0,
        'data': data,
    })