From 755725a1b7b3334543b631a1576ac9ce93a159d3 Mon Sep 17 00:00:00 2001 From: pycook Date: Tue, 29 Dec 2015 10:32:49 +0800 Subject: [PATCH 001/159] Initial commit --- LICENSE | 340 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 340 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8cdb845 --- /dev/null +++ b/LICENSE @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + From a91f409525baa275d215b971e0f236d7a5368b01 Mon Sep 17 00:00:00 2001 From: pycook Date: Tue, 29 Dec 2015 10:35:10 +0800 Subject: [PATCH 002/159] first commit to github --- .gitignore | 14 + README.md | 4 + cmdb-api/__init__.py | 126 ++++++ cmdb-api/cmdb_api.md | 637 ++++++++++++++++++++++++++ cmdb-api/cmdb_query_api.md | 99 ++++ cmdb-api/command/__init__.py | 1 + cmdb-api/config-sample.cfg | 69 +++ cmdb-api/core/__init__.py | 11 + cmdb-api/core/account.py | 98 ++++ cmdb-api/core/attribute.py | 145 ++++++ cmdb-api/core/ci.py | 189 ++++++++ cmdb-api/core/ci_relation.py | 70 +++ cmdb-api/core/ci_type.py | 89 ++++ cmdb-api/core/ci_type_relation.py | 55 +++ cmdb-api/core/history.py | 116 +++++ cmdb-api/core/special.py | 16 + cmdb-api/core/statis.py | 12 + cmdb-api/extensions.py | 16 + cmdb-api/gunicornserver.py | 72 +++ cmdb-api/lib/__init__.py | 4 + cmdb-api/lib/account.py | 145 ++++++ cmdb-api/lib/attribute.py | 167 +++++++ cmdb-api/lib/auth.py | 68 +++ cmdb-api/lib/ci.py | 677 ++++++++++++++++++++++++++++ cmdb-api/lib/ci_type.py | 315 +++++++++++++ cmdb-api/lib/const.py | 99 ++++ cmdb-api/lib/decorator.py | 74 +++ cmdb-api/lib/exception.py | 17 + cmdb-api/lib/history.py | 75 +++ cmdb-api/lib/mail.py | 86 ++++ cmdb-api/lib/query_sql.py | 107 +++++ cmdb-api/lib/search.py | 348 ++++++++++++++ cmdb-api/lib/template/__init__.py | 1 + cmdb-api/lib/template/filters.py | 9 + cmdb-api/lib/utils.py | 74 +++ cmdb-api/lib/value.py | 170 +++++++ cmdb-api/manage.py | 77 ++++ cmdb-api/models/__init__.py | 24 + cmdb-api/models/account.py | 230 ++++++++++ cmdb-api/models/attribute.py | 87 ++++ cmdb-api/models/ci.py | 20 + cmdb-api/models/ci_relation.py | 26 ++ cmdb-api/models/ci_type.py | 128 ++++++ cmdb-api/models/ci_type_relation.py | 27 ++ cmdb-api/models/ci_value.py | 117 +++++ cmdb-api/models/history.py | 51 +++ cmdb-api/models/statis.py | 20 + cmdb-api/permissions.py | 9 + cmdb-api/requirements/default.txt | 14 + cmdb-api/settings.py | 7 + cmdb-api/tasks/__init__.py | 1 + cmdb-api/tasks/cmdb.py | 30 ++ cmdb-api/tasks/statis.py | 21 + cmdb-api/templates/search.xml | 27 ++ cmdb-api/templates/search_tidy.xml | 19 + 55 files changed, 5210 insertions(+) create mode 100755 .gitignore create mode 100644 README.md create mode 100644 cmdb-api/__init__.py create mode 100644 cmdb-api/cmdb_api.md create mode 100644 cmdb-api/cmdb_query_api.md create mode 100644 cmdb-api/command/__init__.py create mode 100644 cmdb-api/config-sample.cfg create mode 100644 cmdb-api/core/__init__.py create mode 100644 cmdb-api/core/account.py create mode 100644 cmdb-api/core/attribute.py create mode 100644 cmdb-api/core/ci.py create mode 100644 cmdb-api/core/ci_relation.py create mode 100644 cmdb-api/core/ci_type.py create mode 100644 cmdb-api/core/ci_type_relation.py create mode 100644 cmdb-api/core/history.py create mode 100644 cmdb-api/core/special.py create mode 100644 cmdb-api/core/statis.py create mode 100644 cmdb-api/extensions.py create mode 100644 cmdb-api/gunicornserver.py create mode 100644 cmdb-api/lib/__init__.py create mode 100644 cmdb-api/lib/account.py create mode 100644 cmdb-api/lib/attribute.py create mode 100644 cmdb-api/lib/auth.py create mode 100644 cmdb-api/lib/ci.py create mode 100644 cmdb-api/lib/ci_type.py create mode 100644 cmdb-api/lib/const.py create mode 100644 cmdb-api/lib/decorator.py create mode 100644 cmdb-api/lib/exception.py create mode 100644 cmdb-api/lib/history.py create mode 100644 cmdb-api/lib/mail.py create mode 100644 cmdb-api/lib/query_sql.py create mode 100644 cmdb-api/lib/search.py create mode 100644 cmdb-api/lib/template/__init__.py create mode 100644 cmdb-api/lib/template/filters.py create mode 100644 cmdb-api/lib/utils.py create mode 100644 cmdb-api/lib/value.py create mode 100644 cmdb-api/manage.py create mode 100644 cmdb-api/models/__init__.py create mode 100644 cmdb-api/models/account.py create mode 100644 cmdb-api/models/attribute.py create mode 100644 cmdb-api/models/ci.py create mode 100644 cmdb-api/models/ci_relation.py create mode 100644 cmdb-api/models/ci_type.py create mode 100644 cmdb-api/models/ci_type_relation.py create mode 100644 cmdb-api/models/ci_value.py create mode 100644 cmdb-api/models/history.py create mode 100644 cmdb-api/models/statis.py create mode 100644 cmdb-api/permissions.py create mode 100644 cmdb-api/requirements/default.txt create mode 100644 cmdb-api/settings.py create mode 100644 cmdb-api/tasks/__init__.py create mode 100644 cmdb-api/tasks/cmdb.py create mode 100644 cmdb-api/tasks/statis.py create mode 100644 cmdb-api/templates/search.xml create mode 100644 cmdb-api/templates/search_tidy.xml diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..30b7fe8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*~ +*.pyc +.idea +data +logs +*/logs/* +*.sql +test/* +tools/* +*.log +*.orig +*.zip +*.swp +*.tar.gz diff --git a/README.md b/README.md new file mode 100644 index 0000000..8fd6703 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +## cmdb + +### cmdb即配置管理数据库 +### 目前只发布api部分,安装脚本和portal计划很快push \ No newline at end of file diff --git a/cmdb-api/__init__.py b/cmdb-api/__init__.py new file mode 100644 index 0000000..a4d8219 --- /dev/null +++ b/cmdb-api/__init__.py @@ -0,0 +1,126 @@ +# encoding=utf-8 + +import os +import logging +from logging.handlers import SMTPHandler +from logging.handlers import TimedRotatingFileHandler + +from flask import Flask +from flask import request +from flask import g +from flask.ext.babel import Babel +from flask.ext.principal import identity_loaded + +from extensions import db +from extensions import mail +from extensions import cache +from extensions import celery +from core import attribute +from core import citype +from core import cityperelation +from core import cirelation +from core import ci +from core import history +from core import account +from core import special +from models.account import User +from lib.template import filters + + +APP_NAME = "CMDB-API" + +MODULES = ( + (attribute, "/api/v0.1/attributes"), + (citype, "/api/v0.1/citypes"), + (cityperelation, "/api/v0.1/cityperelations"), + (cirelation, "/api/v0.1/cirelations"), + (ci, "/api/v0.1/ci"), + (history, "/api/v0.1/history"), + (account, "/api/v0.1/accounts"), + (special, ""), +) + + +def make_app(config=None, modules=None): + modules = modules + if not modules: + modules = MODULES + app = Flask(APP_NAME) + app.config.from_pyfile(config) + configure_extensions(app) + configure_i18n(app) + configure_identity(app) + configure_blueprints(app, modules) + configure_logging(app) + configure_template_filters(app) + return app + + +def configure_extensions(app): + db.app = app + celery.init_app(app) + db.init_app(app) + mail.init_app(app) + cache.init_app(app) + celery.init_app(app) + + +def configure_i18n(app): + babel = Babel(app) + + @babel.localeselector + def get_locale(): + accept_languages = app.config.get('ACCEPT_LANGUAGES', ['en', 'zh']) + return request.accept_languages.best_match(accept_languages) + + +def configure_modules(app, modules): + for module, url_prefix in modules: + app.register_module(module, url_prefix=url_prefix) + + +def configure_blueprints(app, modules): + for module, url_prefix in modules: + app.register_blueprint(module, url_prefix=url_prefix) + + +def configure_identity(app): + + @identity_loaded.connect_via(app) + def on_identity_loaded(sender, identity): + g.user = User.query.from_identity(identity) + + +def configure_logging(app): + hostname = os.uname()[1] + mail_handler = SMTPHandler( + app.config['MAIL_SERVER'], + app.config['DEFAULT_MAIL_SENDER'], + app.config['ADMINS'], + '[%s] CMDB error' % hostname, + ( + app.config['MAIL_USERNAME'], + app.config['MAIL_PASSWORD'], + ) + ) + mail_formater = logging.Formatter( + "%(asctime)s %(levelname)s %(pathname)s %(lineno)d\n%(message)s") + mail_handler.setFormatter(mail_formater) + mail_handler.setLevel(logging.ERROR) + if not app.debug: + app.logger.addHandler(mail_handler) + formatter = logging.Formatter( + "%(asctime)s %(levelname)s %(pathname)s %(lineno)d - %(message)s") + log_file = app.config['LOG_PATH'] + file_handler = TimedRotatingFileHandler( + log_file, when='d', interval=1, backupCount=7) + file_handler.setLevel(getattr(logging, app.config['LOG_LEVEL'])) + file_handler.setFormatter(formatter) + app.logger.addHandler(file_handler) + app.logger.setLevel(getattr(logging, app.config['LOG_LEVEL'])) + + +def configure_template_filters(app): + for name in dir(filters): + if callable(getattr(filters, name)): + app.add_template_filter(getattr(filters, name)) diff --git a/cmdb-api/cmdb_api.md b/cmdb-api/cmdb_api.md new file mode 100644 index 0000000..c4e237f --- /dev/null +++ b/cmdb-api/cmdb_api.md @@ -0,0 +1,637 @@ +# CMDB API文档 + +## 状态返回码的定义 +* 200: 成功 +* 400:失败 +* 401:未授权 +* 404:url not found +* 408:超时 +* 410:资源删除 +* 500: 服务器错误 + + +## 用户接口 + +### CI搜索接口 + +* GET `/api/v0.1/ci/s` +* 参数 + * `string:_type` 搜索的ci_type,多个用分号隔开, 例如: _type:(server;vservser) + * `string:q` 搜索表达式, 例如`q=hostname:cmdb*` + * `string:fl` 返回字段(id, attr_name, attr_alias均可),英文半角逗号分隔 + * `string:ret_key` 返回字段类型 `Enum("id", "name", "alias")` 默认 `name` + * `count` 指定一次返回CI数 + * `facet` 属性字段,逗号分隔,返回属性字段对应的所有值 + +* 搜索表达式: + * 简单的字符串 + * `attribute:value` 指定属性搜索, `attribute`可以是`id`,`attr_name`和`attr_alias` + * 以上的组合,逗号分隔 + +* 组合查询支持 + * `AND`关系-`默认关系` + * `OR`关系 - eg.`-hostname:cmdb*`、 + * `NOT`关系-属性字段前加`~`eg. `~hostname:cmdb*` + * `IN`查询. eg. `hostname:(cmdb*;cmdb-web*)` 小括号, 分号分隔 + * `RANGE`查询. eg. `hostname:[cmdb* _TO_ cmdb-web*]` `_TO_`分隔 + * `COMPARISON`查询. eg. `cpu_core_num:>5` 支持`>, >=, <, <=` + +## api key 认证 + +每个用户会自动生成一个 `api key` 和 一个`secret`, 通过API接口使用的时候,需要提供一个参数 `_key`值为您的`api key`, 以及参数`_secret`值为除`_key`以外的参数,按照**参数名的字典序**排列,并连接到`url path` + `secret`之后的`sha1`**十六进制**值。 + + +## 管理接口 + +### Attribute管理接口 +* GET `/api/v0.1/attributes` 列出所有属性 + * param + * `string:q` 属性名称或者别名,允许为空 + * return + + ``` + { + "numfound": 1, + "attributes": [ + { + "attr_name": "idc", + "is_choice": true, + "choice_value": ["南汇", "欧阳路"], + "attr_id": 1, + "is_multivalue": false, + "attr_alias": "IDC", + "value_type": "text", + "is_uniq": false + } + } + ``` + + * error 无 + + +* GET `/api/v0.1/attributes/`、 `/api/v0.1/attributes/` 根据属性名称、别名或ID获取属性 + * param + * `string:attr_name` 属性名称或别名 + * `int:attr_id` 属性ID + * `attr_id`和`attr_name`选其一 + * return + + ``` + { + "attribute": { + "attr_name": "idc", + "is_choice": true, + "choice_value": ["南汇", "欧阳路"], + "attr_id": 1, + "is_multivalue": false, + "attr_alias": "IDC", + "value_type": "text", + "is_uniq": false + }, + } + ``` + + * error + * `404` 找不到属性 + +* POST `/api/v0.1/attributes` 增加新的属性 + * param + * `string:attr_name` 属性名称 + * `string:attr_alias` 属性别名,可为空,为空时等于`attr_name` + * `boolean:choice_value` 若属性有预定义值, 则不能为空 + * `boolean:is_multivalue` 属性是否允许多值,默认`False` + * `boolean:is_uniq` 属性是否唯一,默认`False` + * `string:value_type` 属性值类型, `Enum("text", "int", "float", "date")`, 默认`text` + + * return + + ``` + { + "attr_id":1 + } + ``` + + * error + * `500` 属性已存在 + * `500` 属性增加失败 + + * PUT `/api/v0.1/attributes/` 修改属性 + * param + * `string:attr_name` 属性名称 + * `string:attr_alias` 属性别名,可为空,为空时等于`attr_name` + * `boolean:choice_value` 若属性有预定义值, 则不能为空 + * `boolean:is_multivalue` 属性是否允许多值,值为0或者1,默认`False` + * `boolean:is_uniq` 属性是否唯一,值为0或者1,默认`False` + * `string:value_type` 属性值类型, `Enum("text", "int", "float", "date")`, 默认`text` + + * return + + ``` + { + "attr_id":1 + } + ``` + + * error + * `500` 属性已存在 + * `500` 属性增加失败 + + * DELETE `/api/v0.1/attributes/` 根据ID删除属性 + * param + * `int:attr_id` 属性ID + * return + + ``` + { + "message":"attribute %s deleted" % attr_name + } + ``` + + * error + * `404` 属性不存在 + * `500` 删除属性失败 + +#### CIType属性管理 + + * GET `/api/v0.1/attributes/citype/` 根据type_id查询固有属性列表 + * return + + ``` + { + "attributes": [ + { + "attr_name": "idc", + "is_choice": true, + "choice_value": ["南汇", "欧阳路"], + "attr_id": 1, + "is_multivalue": false, + "attr_alias": "IDC", + "value_type": "text", + "is_uniq": false + }, + ], + "type_id": 1, + } + ``` + +* POST `/api/v0.1/attributes/citype/` 根据`attr_id`增加CIType的属性 + * param + * `string:attr_id` `,`分隔的`attr_id` + * `int:is_required` 0或者1 + + * return + + ``` + { + "attributes":[1, 2, 3] + } + ``` + + * error + * `404` CIType不存在 + * `404` 属性不存在 + * `500` 增加失败 + +* DELETE `/api/v0.1/attributes/citype/` 删除CIType的属性 + * param + * `string:attr_id` `,`分隔的`attr_id` + + * return + + ``` + { + "attributes":[1, 2, 3] + } + ``` + + * error + * `404` CIType不存在 + * `404` 属性不存在 + * `500` 增加失败 + + +### CIType管理接口 + +* `/api/v0.1/citypes` 列出所有CI类型 + * param `string:type_name` 类型名称,允许为空 + * return + + ``` + { + "numfound": 2, + "citypes": [ + { + "uniq_key": "sn", + "type_name": "物理机", + "type_id": 1, + "enabled": True, + "icon_url": "" + }, + { + "uniq_key": "uuid", + "type_name": "KVM", + "type_id": 2, + "enabled": True, + "icon_url": "" + } + ], + } + ``` + * error 无 + +* GET `/api/v0.1/citypes/query` 查询CI类型 + * param `string:type` 可以是type_id, type_name, type_alias + * return + + ``` + { + "citype": { + "type_name": "software", + "type_id": 4, + "icon_url": "", + "type_alias": "\u8f6f\u4ef6", + "enabled": true, + "uniq_key": 21 + } + } + ``` + * error + * `400` message=输入参数缺失 + * `404` message='citype is not found' + +* POST `/api/v0.1/citypes` 增加新CIType + * param (下列参数任意一个或多个) + * `string:type_name` CIType名称 + * `string:type_alias` 类型别名,可为空 + * `int:_id` 唯一属性ID + * `string:unique` 唯一属性名称 + * `_id`和`unique`只能二选一 + * `icon_url` + * `enabled` 0/1 + * return + + ``` + { + "type_id": 2 + } + ``` + + * error + * `400` message=输入参数缺失 + * `500` message=CIType已存在 + * `500` message=唯一属性不存在 + * `500` message=唯一属性不是唯一的 + +* PUT `/api/v0.1/citypes/` 修改CIType + * param (下列参数任意一个或多个) + * `string:type_name` CIType名称 + * `string:type_alias` 类型别名,可为空 + * `int:_id` 唯一属性ID + * `string:unique` 唯一属性名称 + * `_id`和`unique`只能二选一 + * `icon_url` + * `enabled` 0/1 + * return + + ``` + { + "type_id": 2 + } + ``` + + * error + * `400` message=输入参数缺失 + * `500` message=CIType已存在 + * `500` message=唯一属性不存在 + * `500` message=唯一属性不是唯一的 + +* GET/POST `/api/v0.1/citypes/enable/` 修改CIType + * param + * `enabled` 0 or 1 + * return + + ``` + { + "type_id": 2 + } + ``` + + * error + * `500` 设置失败 + * `404` CIType不存在 + +* DELETE `/api/v0.1/citypes/` 根据ID删除CIType + * return + + ``` + { + "message":"ci type %s deleted" % type_name + } + ``` + * error + * `500` 删除失败 + * `404` CIType不存在 + +### CITypeRelation管理接口 + +* GET `/api/v0.1/cityperelations/types` 列出所有CIType关系类型名 + * return + + ``` + { + "relation_types": ["连接", "位置", "附属", "部署"], + } + ``` + * error 无 + +* GET `/api/v0.1/cityperelations//children` 返回所有child id + * return + + ``` + { + "children": [ + { + "ctr_id": 1, + "type_name": "project", + "type_id": 2, + "icon_url": "", + "type_alias": "应用", + "enabled": true, + "uniq_key": 3 + } + ] + } + ``` + * error 无 + +* GET `/api/v0.1/cityperelations//parents` 返回parent id + * return + + ``` + { + "parents": [{'parent':1, 'relaltion_type': 'containes', "ctr_id":1}], + } + ``` + * error 无 + + +* POST `/api/v0.1/cityperelations//` 增加CIType关系 + * param + * `string:relation_type` 类型名称 + * return + + ``` + { + "ctr_id":1 + } + ``` + * error + * `500` 增加失败 + * `404` CIType不存在 + +* DELETE `/api/v0.1/cityperelations/` 根据`ctr_id`删除CIType关系 + * return + + ``` + { + "message":"CIType relation %s deleted" % type + } + ``` + * error + * `500` 删除失败 + * `404` 关系不存在 + + + +### CI管理接口 + +* GET `/api/v0.1/ci/type/` 查询CIType的所有CI,一次返回25条记录 + * param + * `string:fields` 返回属性名、id,逗号隔开 + * `string:ret_key` 返回属性key,默认'name',还可是'id', 'alias' + * `int:page` 页码 + + * return + + ``` + { + "numfound": 1, + "type_id":1, + "page": 1, + "cis": [ + { + "ci_type": "KVM", + "_type": 1, + "nic": [ + 2 + ], + "hostname": "xxxxxx", + "_unique": "xxxxxx", + "_id": 1 + } + ] + } + ``` + * erorr + * `404` CIType不存在 + +* GET `/api/v0.1/ci/` 查询CI + + * return + + ``` + { + "ci": { + "ci_type": "KVM", + "_type": 1, + "nic": [2], + "hostname": "xxxxx", + "_unique": "xxxxx", + "_id": 1 + }, + "ci_id": 1 + } + ``` + * erorr 无 + + + +* POST `/api/v0.1/ci` 增加CI + * param + * `string:ci_type` CIType name 或者id + * `string:_no_attribute_policy` 当添加不存在的attribute时的策略, 默认`ignore` + * 其他url参数`k=v`: `k` 为属性名(id或别名亦可), `v`为对应的值 + * 此CIType的`unique`字段必须包含在url参数中 + * return + + ``` + { + "ci_id":1, + } + ``` + * erorr + * `500` 添加失败 + +* PUT `/api/v0.1/ci` 修改CI + * param + * `string:ci_type` CIType name 或者id + * `string:_no_attribute_policy` 当添加不存在的attribute时的策略, 默认`ignore` + * 其他url参数`k=v`: `k` 为属性名(id或别名亦可), `v`为对应的值 + * 此CIType的`unique`字段必须包含在url参数中 + * return + + ``` + { + "ci_id":1, + } + ``` + * erorr + * `500` 添加失败 + +* DELETE `/api/v0.1/ci/` 删除ci + * return + + ``` + { + "message":"ok", + } + ``` + * erorr + * `500` 删除失败 + + +## CIRelaiton管理接口 + +* GET `/api/v0.1/cirelations/types` 列出所有CI关系类型名 + * return + + ``` + { + "relation_types": ["connect", "install", "deploy", "contain"], + } + ``` + * error 无 + +* GET `/api/v0.1/cirelations//second_cis` 返回所有second id + * return + + ``` + { + "numfound": 1, + "second_cis": [ + { + "ci_type": "project", + "ci_type_alias": "应用", + "_type": 2, + "_id": 18, + "project_name": "cmdb-api" + } + ] + } + ``` + * error 无 + +* GET `/api/v0.1/cirelations//first_cis` 返回first ci id + * return + + ``` + { + "first_cis": [ + { + "ci_type": "project", + "ci_type_alias": "应用", + "_type": 2, + "_id": 18, + "project_name": "cmdb-api" + } + ], + "numfound": 1 + } + ``` + * error 无 + + +* POST `/api/v0.1/cirelations//` 增加CI关系 + * param + * `int: more` more实例 + * `string:relation_type` 类型名称 + * return + + ``` + { + "cr_id":1 + } + ``` + * error + * `500` 增加失败 + * `404` CI不存在 + +* DELETE `/api/v0.1/cirelations/delete/` 根据`cr_id`删除CI关系 + * return + + ``` + { + "message":"CIType relation %s deleted" % type + } + ``` + * error + * `500` 删除失败 + * `404` 关系不存在 + + + +## 历史记录管理接口 +* GET `/api/v0.1/history/record` 查询历史记录 + * param + * `int: page` + * `string: username` 变更用户 + * `string: start` 变更开始时间 + * `string: end` 变更结束时间 + * return + + ``` + { + "username": "", + "start": "2014-12-31 14:57:43", + "end": "2015-01-07 14:57:43", + "records": [ + { + "origin": null, + "attr_history": [], + "timestamp": "2015-01-01 22:12:39", + "reason": null, + "rel_history": { + "add": 1 + }, + "user": 1, + "record_id": 1234, + "ticket_id": null + } + ] + } + ``` + * error 无 + + * GET `/api/v0.1/history/` 历史记录详情 + * return + + ``` + { + "username": "pycook", + "timestamp": "2015-01-02 20:21:16", + "rel_history": { + "add": [ + [ + 123, + "deploy", + 234 + ] + ], + "delete": [] + }, + "attr_history": {} + } + ``` + + * error + * `404` 该记录不存在 diff --git a/cmdb-api/cmdb_query_api.md b/cmdb-api/cmdb_query_api.md new file mode 100644 index 0000000..ed51597 --- /dev/null +++ b/cmdb-api/cmdb_query_api.md @@ -0,0 +1,99 @@ +# CMDB查询 API文档 + + + +## 用户接口 + +### CI通用搜索接口 + +* GET `/api/v0.1/ci/s` +* 参数 + * `string:_type` 搜索的ci_type,多个用分号隔开, 例如: _type:(docker;kvm) + * `string:q` 搜索表达式, 例如`q=hostname:cmdb*` + * `string:fl` 返回字段(id, attr_name, attr_alias均可),英文半角逗号分隔 + * `string:ret_key` 返回字段类型 `Enum("id", "name", "alias")` 默认 `name` + * `count` 指定一次返回CI数 + * `facet` 属性字段,逗号分隔,返回属性字段对应的所有值 + * `wt` 返回的数据格式,默认为`json`, 可选参数为`xml` + +* 搜索表达式: + * 简单的字符串 + * `attribute:value` 指定属性搜索, `attribute`可以是`id`,`attr_name`和`attr_alias` + * 以上的组合,逗号分隔 + +* 组合查询支持 + * `AND`关系-`默认关系` + * `OR`关系 - eg.`-hostname:cmdb*`、 + * `NOT`关系-属性字段前加`~`eg. `~hostname:cmdb*` + * `IN`查询. eg. `hostname:(cmdb*;cmdb-web*)` 小括号, 分号分隔 + * `RANGE`查询. eg. `hostname:[cmdb* _TO_ cmdb-web*]` `_TO_`分隔 + * `COMPARISON`查询. eg. `cpu_count:>5` 支持`>, >=, <, <=` + +* 返回结果 + * 搜索表达式 `/api/v0.1/ci/s?q=_type:kvm,status:在线,idc:南汇,private_ip:10.1.1.1*&page=1&fl=hostname,private_ip&facet=private_ip&count=1` + * 返回数据(默认json) + + ``` + { + facet: { + private_ip: [ + [ + "10.1.1.11", + 1, + "private_ip" + ], + [ + "10.1.1.12", + 1, + "private_ip" + ], + [ + "10.1.1.13", + 1, + "private_ip" + ] + ] + }, + total: 1, + numfound: 3, + result: [ + { + ci_type: "kvm", + _type: 8, + _id: 3213, + hostname: "xxx11", + private_ip: [ + "10.1.1.11" + ] + }, + { + ci_type: "kvm", + _type: 8, + _id: 123232, + hostname: "xxx12", + private_ip: [ + "10.1.1.12" + ] + }, + { + ci_type: "kvm", + _type: 8, + _id: 123513, + hostname: "xxx13", + private_ip: [ + "10.1.1.13" + ] + } + ], + counter: { + kvm: 3 + }, + page: 1 + } +``` + + +### CI专用搜索接口 +##### 根据需求实现 + + \ No newline at end of file diff --git a/cmdb-api/command/__init__.py b/cmdb-api/command/__init__.py new file mode 100644 index 0000000..44d37d3 --- /dev/null +++ b/cmdb-api/command/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/cmdb-api/config-sample.cfg b/cmdb-api/config-sample.cfg new file mode 100644 index 0000000..fb1eba7 --- /dev/null +++ b/cmdb-api/config-sample.cfg @@ -0,0 +1,69 @@ +# coding: utf-8 +# common + +DEBUG = True +SECRET_KEY = 'dsfdjsf@3213!@JKJWL' +HOST = 'http://127.0.0.1:5000' + +# # database +SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://mysqluser:password@127.0.0.1:3306/cmdb?charset=utf8' + +SQLALCHEMY_ECHO = False +SQLALCHEMY_POOL_SIZE = 10 +SQLALCHEMY_POOL_RECYCLE = 300 + +# # upload +UPLOADS_DEFAULT_DEST = './static/' +UPLOADS_DEFAULT_URL = '/static' + +# # cache +CACHE_TYPE = "redis" +CACHE_REDIS_HOST = "127.0.0.1" +CACHE_REDIS_PORT = 6379 +CACHE_KEY_PREFIX = "CMDB-API" +CACHE_DEFAULT_TIMEOUT = 3000 + +# # i18n +ACCEPT_LANGUAGES = ['en', 'zh'] +BABEL_DEFAULT_LOCALE = 'zh' +BABEL_DEFAULT_TIMEZONE = 'Asia/Shanghai' + +# # log +LOG_PATH = './logs/app.log' + +LOG_LEVEL = 'DEBUG' +ADMINS = ('@') + +# # mail +MAIL_SERVER = '' +MAIL_PORT = 25 +MAIL_USE_TLS = False +MAIL_USE_SSL = False +MAIL_DEBUG = True +MAIL_USERNAME = '' +MAIL_PASSWORD = '' +DEFAULT_MAIL_SENDER = '' + +# # LDAP +LDAP_SERVER = 'ldap://' +LDAP_DOMAIN = '' + +# # queue +CELERY_RESULT_BACKEND = "redis://127.0.0.1//" +BROKER_URL = 'redis://127.0.0.1//' +BROKER_VHOST = '/' + +# # zookeeper +ZK_SERVERS = "127.0.0.1:2181" + +# # assets +ASSETS_DEBUG = False + +# application + +# # pagination +PER_PAGE_COUNT_RANGE = (10, 25, 50, 100) +DEFAULT_PAGE_COUNT = 25 + + +WHITE_LIST = ["127.0.0.1"] diff --git a/cmdb-api/core/__init__.py b/cmdb-api/core/__init__.py new file mode 100644 index 0000000..99d8104 --- /dev/null +++ b/cmdb-api/core/__init__.py @@ -0,0 +1,11 @@ +# -*- coding:utf-8 -*- + + +from attribute import attribute +from ci_type import citype +from ci_type_relation import cityperelation +from ci_relation import cirelation +from ci import ci +from history import history +from account import account +from special import special \ No newline at end of file diff --git a/cmdb-api/core/account.py b/cmdb-api/core/account.py new file mode 100644 index 0000000..1a1ae82 --- /dev/null +++ b/cmdb-api/core/account.py @@ -0,0 +1,98 @@ +# -*- coding:utf-8 -*- + + +from flask import Blueprint +from flask import request + +from flask import g +from flask import abort +from flask import jsonify + +from models import row2dict +from lib.account import AccountManager +from lib.auth import auth_with_key + + +account = Blueprint('account', __name__) + + +@account.route("/", methods=["GET"]) +@auth_with_key +def get_user(uid=None): + manager = AccountManager() + user = manager.get_user_by_uid(uid) + if user: + return jsonify(rolenames=user.rolenames, user=row2dict(user)) + else: + return jsonify(user=None) + + +@account.route("", methods=["POST"]) +@auth_with_key +def create_user(): + manager = AccountManager() + params = {} + for k, v in request.values.iteritems(): + params[k] = v + user = manager.create_user(**params) + return jsonify(user=row2dict(user)) + + +@account.route("/", methods=["PUT"]) +@auth_with_key +def update_user(uid=None): + manager = AccountManager() + params = {} + for k, v in request.values.iteritems(): + params[k] = v + ret, res = manager.update_user(uid, **params) + if not ret: + abort(res[0], res[1]) + return jsonify(user=row2dict(res), rolenames=res.rolenames) + + +@account.route("/", methods=["DELETE"]) +@auth_with_key +def delete_user(uid=None): + manager = AccountManager() + ret, res = manager.delete_user(uid) + if not ret: + abort(res[0], res[1]) + return jsonify(uid=uid) + + +@account.route("/validate", methods=["POST"]) +@auth_with_key +def validate(): + username = request.values.get("username") + password = request.values.get("password") + manager = AccountManager() + user, authenticated = manager.validate(username, password) + if user and not authenticated: + return jsonify(code=401, user=row2dict(user), rolenames=user.rolenames) + elif not user: + return jsonify(code=404, message="user is not existed") + return jsonify(code=200, user=row2dict(user), rolenames=user.rolenames) + + +@account.route("/key", methods=["PUT"]) +@auth_with_key +def update_key(): + manager = AccountManager() + ret, res = manager.reset_key(g.user.uid) + if not ret: + abort(res[0], res[1]) + return jsonify(user=row2dict(res), rolenames=res.rolenames) + + +@account.route("/password", methods=["PUT"]) +@auth_with_key +def update_password(): + manager = AccountManager() + old = request.values.get("password") + new = request.values.get("new_password") + confirm = request.values.get("confirm") + ret, res = manager.update_password(g.user.uid, old, new, confirm) + if not ret: + abort(res[0], res[1]) + return jsonify(user=row2dict(res), rolenames=res.rolenames) diff --git a/cmdb-api/core/attribute.py b/cmdb-api/core/attribute.py new file mode 100644 index 0000000..edff09e --- /dev/null +++ b/cmdb-api/core/attribute.py @@ -0,0 +1,145 @@ +# -*- coding:utf-8 -*- + + +from flask import jsonify +from flask import request +from flask import Blueprint +from flask import abort +from flask import current_app + +from lib.attribute import AttributeManager +from lib.ci_type import CITypeAttributeManager +from lib.decorator import argument_required +from lib.exception import InvalidUsageError +from lib.auth import auth_with_key + +attribute = Blueprint("attribute", __name__) + + +@attribute.route("", methods=["GET"]) +def get_attributes(): + q = request.values.get("q") + attrs = AttributeManager().get_attributes(name=q) + count = len(attrs) + return jsonify(numfound=count, attributes=attrs) + + +@attribute.route("/", methods=["GET"]) +@attribute.route("/", methods=["GET"]) +def get_attribute(attr_name=None, attr_id=None): + attr_manager = AttributeManager() + attr_dict = None + if attr_name is not None: + attr_dict = attr_manager.get_attribute_by_name(attr_name) + if attr_dict is None: + attr_dict = attr_manager.get_attribute_by_alias(attr_name) + elif attr_id is not None: + attr_dict = attr_manager.get_attribute_by_id(attr_id) + if attr_dict is not None: + return jsonify(attribute=attr_dict) + abort(404, "attribute not found") + + +@attribute.route("", methods=["POST"]) +@auth_with_key +def create_attribute(): + with argument_required("attr_name"): + attr_name = request.values.get("attr_name") + current_app.logger.info(attr_name) + attr_alias = request.values.get("attr_alias", attr_name) + choice_value = request.values.get("choice_value") + is_multivalue = request.values.get("is_multivalue", False) + is_uniq = request.values.get("is_uniq", False) + is_index = request.values.get("is_index", False) + value_type = request.values.get("value_type", "text") + try: + is_multivalue = int(is_multivalue) + is_uniq = int(is_uniq) + is_index = int(is_index) + except ValueError: + raise InvalidUsageError("argument format is error") + attr_manager = AttributeManager() + kwargs = {"choice_value": choice_value, "is_multivalue": is_multivalue, + "is_uniq": is_uniq, "value_type": value_type, + "is_index": is_index} + ret, res = attr_manager.add(attr_name, attr_alias, **kwargs) + if not ret: + return abort(500, res) + return jsonify(attr_id=res) + + +@attribute.route("/", methods=["PUT"]) +@auth_with_key +def update_attribute(attr_id=None): + with argument_required("attr_name"): + attr_name = request.values.get("attr_name") + attr_alias = request.values.get("attr_alias", attr_name) + choice_value = request.values.get("choice_value") + is_multivalue = request.values.get("is_multivalue", False) + is_uniq = request.values.get("is_uniq", False) + value_type = request.values.get("value_type", "text") + try: + is_multivalue = int(is_multivalue) + is_uniq = int(is_uniq) + except ValueError: + raise InvalidUsageError("argument format is error") + attr_manager = AttributeManager() + kwargs = {"choice_value": choice_value, "is_multivalue": is_multivalue, + "is_uniq": is_uniq, "value_type": value_type} + ret, res = attr_manager.update(attr_id, attr_name, + attr_alias, **kwargs) + if not ret: + return abort(500, res) + return jsonify(attr_id=res) + + +@attribute.route("/", methods=["DELETE"]) +@auth_with_key +def delete_attribute(attr_id=None): + attr_manager = AttributeManager() + res = attr_manager.delete(attr_id) + return jsonify(message="attribute {0} deleted".format(res)) + + +@attribute.route("/citype/", methods=["GET"]) +def get_attributes_by_type(type_id=None): + manager = CITypeAttributeManager() + from models.cmdb import CITypeCache, CIAttributeCache + + t = CITypeCache.get(type_id) + if not t: + return abort(400, "CIType {0} is not existed".format(type_id)) + uniq_id = t.uniq_id + unique = CIAttributeCache.get(uniq_id).attr_name + return jsonify(attributes=manager.get_attributes_by_type_id(type_id), + type_id=type_id, uniq_id=uniq_id, unique=unique) + + +@attribute.route("/citype/", methods=["POST"]) +@auth_with_key +def create_attributes_to_citype(type_id=None): + with argument_required("attr_id"): + attr_ids = request.values.get("attr_id", "") + is_required = request.values.get("is_required", False) + attr_id_list = attr_ids.strip().split(",") + if "" in attr_id_list: + attr_id_list.remove("") + attr_id_list = map(int, attr_id_list) + try: + is_required = int(is_required) + except ValueError: + abort(500, "argument format is error") + manager = CITypeAttributeManager() + manager.add(type_id, attr_id_list, is_required=is_required) + return jsonify(attributes=attr_id_list) + + +@attribute.route("/citype/", methods=["DELETE"]) +@auth_with_key +def delete_attribute_in_type(type_id=None): + with argument_required("attr_id"): + attr_ids = request.values.get("attr_id", "") + attr_id_list = attr_ids.strip().split(",") + manager = CITypeAttributeManager() + manager.delete(type_id, attr_id_list) + return jsonify(attributes=attr_id_list) \ No newline at end of file diff --git a/cmdb-api/core/ci.py b/cmdb-api/core/ci.py new file mode 100644 index 0000000..151e0aa --- /dev/null +++ b/cmdb-api/core/ci.py @@ -0,0 +1,189 @@ +# -*- coding:utf-8 -*- + +import sys +reload(sys) +sys.setdefaultencoding("utf-8") +import time +import urllib + +from flask import Blueprint +from flask import request +from flask import jsonify +from flask import current_app +from flask import make_response +from flask import render_template +from flask import abort + +from lib.auth import auth_with_key +from lib.ci import CIManager +from lib.search import Search +from lib.search import SearchError +from lib.utils import get_page +from lib.utils import get_per_page +from models.ci_type import CITypeCache + +ci = Blueprint("ci", __name__) + + +@ci.route("/type/", methods=["GET"]) +def get_cis_by_type(type_id=None): + fields = request.args.get("fields", "").strip().split(",") + fields = filter(lambda x: x != "", fields) + + ret_key = request.args.get("ret_key", "name") + if ret_key not in ('name', 'alias', 'id'): + ret_key = 'name' + + page = get_page(request.values.get("page", 1)) + count = get_per_page(request.values.get("count")) + manager = CIManager() + res = manager.get_cis_by_type(type_id, ret_key=ret_key, + fields=fields, page=page, per_page=count) + return jsonify(type_id=type_id, numfound=res[0], + total=len(res[2]), page=res[1], cis=res[2]) + + +@ci.route("/", methods=['GET']) +def get_ci(ci_id=None): + fields = request.args.get("fields", "").strip().split(",") + fields = filter(lambda x: x != "", fields) + + ret_key = request.args.get("ret_key", "name") + if ret_key not in ('name', 'alias', 'id'): + ret_key = 'name' + + manager = CIManager() + ci = manager.get_ci_by_id(ci_id, ret_key=ret_key, fields=fields) + return jsonify(ci_id=ci_id, ci=ci) + + +@ci.route("/s", methods=["GET"]) +@ci.route("/search", methods=["GET"]) +def search(): + """@params: q: query statement + fl: filter by column + count: the number of ci + ret_key: id, name, alias + facet: statistic + wt: result format + """ + page = get_page(request.values.get("page", 1)) + count = get_per_page(request.values.get("count")) + + query = request.values.get('q', "") + fl = request.values.get('fl', "").split(",") + ret_key = request.values.get('ret_key', "name") + if ret_key not in ('name', 'alias', 'id'): + ret_key = 'name' + facet = request.values.get("facet", "").split(",") + wt = request.values.get('wt', 'json') + fl = filter(lambda x: x != "", fl) + facet = filter(lambda x: x != "", facet) + sort = request.values.get("sort") + + start = time.time() + s = Search(query, fl, facet, page, ret_key, count, sort) + try: + response, counter, total, page, numfound, facet = s.search() + except SearchError, e: + return abort(400, str(e)) + except Exception, e: + current_app.logger.error(str(e)) + return abort(500, "search unknown error") + + if wt == 'xml': + res = make_response( + render_template("search.xml", + counter=counter, + total=total, + result=response, + page=page, + numfound=numfound, + facet=facet)) + res.headers['Content-type'] = 'text/xml' + return res + current_app.logger.debug("search time is :{0}".format( + time.time() - start)) + return jsonify(numfound=numfound, + total=total, + page=page, + facet=facet, + counter=counter, + result=response) + + +@ci.route("", methods=["POST"]) +@auth_with_key +def create_ci(): + ci_type = request.values.get("ci_type") + _no_attribute_policy = request.values.get("_no_attribute_policy", "ignore") + + ci_dict = dict() + for k, v in request.values.iteritems(): + if k != "ci_type" and not k.startswith("_"): + ci_dict[k] = v.strip() + + manager = CIManager() + current_app.logger.debug(ci_dict) + ci_id = manager.add(ci_type, exist_policy="reject", + _no_attribute_policy=_no_attribute_policy, **ci_dict) + return jsonify(ci_id=ci_id) + + +@ci.route("", methods=["PUT"]) +@auth_with_key +def update_ci(): + if request.data: + args = dict() + _args = request.data.split("&") + for arg in _args: + if arg: + args[arg.split("=")[0]] = \ + urllib.unquote(urllib.unquote(arg.split("=")[1])) + else: + args = request.values + + ci_type = args.get("ci_type") + _no_attribute_policy = args.get("_no_attribute_policy", "ignore") + ci_dict = dict() + for k, v in args.items(): + if k != "ci_type" and not k.startswith("_"): + ci_dict[k] = v.strip() + + manager = CIManager() + ci_id = manager.add(ci_type, exist_policy="replace", + _no_attribute_policy=_no_attribute_policy, **ci_dict) + return jsonify(ci_id=ci_id) + + +@ci.route("/", methods=["DELETE"]) +@auth_with_key +def delete_ci(ci_id=None): + manager = CIManager() + manager.delete(ci_id) + return jsonify(message="ok") + + +@ci.route("/heartbeat//", methods=["POST"]) +def add_heartbeat(ci_type, unique): + if not unique or not ci_type: + return jsonify(message="error") + # return jsonify(message="ok") + return jsonify(message=CIManager().add_heartbeat(ci_type, unique)) + + +@ci.route("/heartbeat", methods=["GET"]) +def get_heartbeat(): + page = get_page(request.values.get("page", 1)) + ci_type = request.values.get("ci_type", "").strip() + try: + ci_type = CITypeCache.get(ci_type).type_id + except: + return jsonify(numfound=0, result=[]) + agent_status = request.values.get("agent_status", None) + if agent_status: + agent_status = int(agent_status) + numfound, result = CIManager().get_heartbeat(page, + ci_type, + agent_status=agent_status) + return jsonify(numfound=numfound, result=result) \ No newline at end of file diff --git a/cmdb-api/core/ci_relation.py b/cmdb-api/core/ci_relation.py new file mode 100644 index 0000000..63233df --- /dev/null +++ b/cmdb-api/core/ci_relation.py @@ -0,0 +1,70 @@ +# -*- coding:utf-8 -*- + + +from flask import Blueprint +from flask import jsonify +from flask import request + +from lib.ci import CIRelationManager +from lib.utils import get_page +from lib.utils import get_per_page +from lib.auth import auth_with_key + + +cirelation = Blueprint("cirelation", __name__) + + +@cirelation.route("/types", methods=["GET"]) +def get_types(): + manager = CIRelationManager() + return jsonify(relation_types=manager.relation_types) + + +@cirelation.route("//second_cis", methods=["GET"]) +def get_second_cis_by_first_ci(first_ci=None): + page = get_page(request.values.get("page", 1)) + count = get_per_page(request.values.get("count")) + relation_type = request.values.get("relation_type", "contain") + manager = CIRelationManager() + numfound, total, second_cis = manager.get_second_cis( + first_ci, page=page, per_page=count, relation_type=relation_type) + return jsonify(numfound=numfound, total=total, + page=page, second_cis=second_cis) + + +@cirelation.route("//first_cis", methods=["GET"]) +def get_first_cis_by_second_ci(second_ci=None): + page = get_page(request.values.get("page", 1)) + count = get_per_page(request.values.get("count")) + relation_type = request.values.get("relation_type", "contain") + + manager = CIRelationManager() + numfound, total, first_cis = manager.get_first_cis( + second_ci, per_page=count, page=page, relation_type=relation_type) + return jsonify(numfound=numfound, total=total, + page=page, first_cis=first_cis) + + +@cirelation.route("//", methods=["POST"]) +@auth_with_key +def create_ci_relation(first_ci=None, second_ci=None): + relation_type = request.values.get("relation_type", "contain") + manager = CIRelationManager() + res = manager.add(first_ci, second_ci, relation_type=relation_type) + return jsonify(cr_id=res) + + +@cirelation.route("/", methods=["DELETE"]) +@auth_with_key +def delete_ci_relation(cr_id=None): + manager = CIRelationManager() + manager.delete(cr_id) + return jsonify(message="CIType Relation is deleted") + + +@cirelation.route("//", methods=["DELETE"]) +@auth_with_key +def delete_ci_relation_2(first_ci, second_ci): + manager = CIRelationManager() + manager.delete_2(first_ci, second_ci) + return jsonify(message="CIType Relation is deleted") \ No newline at end of file diff --git a/cmdb-api/core/ci_type.py b/cmdb-api/core/ci_type.py new file mode 100644 index 0000000..85efa12 --- /dev/null +++ b/cmdb-api/core/ci_type.py @@ -0,0 +1,89 @@ +# -*- coding:utf-8 -*- + + +from flask import Blueprint +from flask import jsonify +from flask import request +from flask import abort + +from lib.ci_type import CITypeManager +from lib.decorator import argument_required +from lib.auth import auth_with_key + + +citype = Blueprint("citype", __name__) + + +@citype.route("", methods=["GET"]) +def get_citypes(): + type_name = request.args.get("type_name") + manager = CITypeManager() + citypes = manager.get_citypes(type_name) + count = len(citypes) + return jsonify(numfound=count, citypes=citypes) + + +@citype.route("/query", methods=["GET"]) +def query(): + with argument_required("type"): + _type = request.args.get("type") + manager = CITypeManager() + res = manager.query(_type) + return jsonify(citype=res) + + +@citype.route("", methods=["POST"]) +@auth_with_key +def create_citype(): + with argument_required("type_name"): + type_name = request.values.get("type_name") + type_alias = request.values.get("type_alias") + if type_alias is None: + type_alias = type_name + _id = request.values.get("_id") + unique = request.values.get("unique") + enabled = request.values.get("enabled", True) + icon_url = request.values.get("icon_url", "") + manager = CITypeManager() + ret, res = manager.add(type_name, type_alias, _id=_id, + unique=unique, enabled=enabled, + icon_url=icon_url) + if ret: + return jsonify(type_id=res) + abort(500, res) + + +@citype.route("/", methods=["PUT"]) +@auth_with_key +def update_citype(type_id=None): + type_name = request.values.get("type_name") + type_alias = request.values.get("type_alias") + _id = request.values.get("_id") + unique = request.values.get("unique") + icon_url = request.values.get("icon_url") + enabled = request.values.get("enabled") + enabled = False if enabled in (0, "0") else True \ + if enabled is not None else None + manager = CITypeManager() + ret, res = manager.update(type_id, type_name, type_alias, _id=_id, + unique=unique, icon_url=icon_url, + enabled=enabled) + if ret: + return jsonify(type_id=type_id) + abort(500, res) + + +@citype.route("/", methods=["DELETE"]) +@auth_with_key +def delete_citype(type_id=None): + manager = CITypeManager() + res = manager.delete(type_id) + return jsonify(message=res) + + +@citype.route("/enable/", methods=["GET", "POST"]) +def enable(type_id=None): + enable = request.values.get("enable", True) + manager = CITypeManager() + manager.set_enabled(type_id, enabled=enable) + return jsonify(type_id=type_id) \ No newline at end of file diff --git a/cmdb-api/core/ci_type_relation.py b/cmdb-api/core/ci_type_relation.py new file mode 100644 index 0000000..36d72ca --- /dev/null +++ b/cmdb-api/core/ci_type_relation.py @@ -0,0 +1,55 @@ +# -*- coding:utf-8 -*- + + +from flask import Blueprint +from flask import jsonify +from flask import request + +from lib.ci_type import CITypeRelationManager +from lib.auth import auth_with_key + + +cityperelation = Blueprint("cityperelation", __name__) + + +@cityperelation.route("/types", methods=["GET"]) +def get_types(): + manager = CITypeRelationManager() + return jsonify(relation_types=manager.relation_types) + + +@cityperelation.route("//children", methods=["GET"]) +def get_children_by_parent(parent=None): + manager = CITypeRelationManager() + return jsonify(children=manager.get_children(parent)) + + +@cityperelation.route("//parents", methods=["GET"]) +def get_parents_by_child(child=None): + manager = CITypeRelationManager() + return jsonify(parents=manager.get_parents(child)) + + +@cityperelation.route("//", methods=["POST"]) +@auth_with_key +def create_citype_realtions(parent=None, child=None): + relation_type = request.values.get("relation_type", "contain") + manager = CITypeRelationManager() + res = manager.add(parent, child, relation_type=relation_type) + return jsonify(ctr_id=res) + + +@cityperelation.route("/", methods=["DELETE"]) +@auth_with_key +def delete_citype_relation(ctr_id=None): + manager = CITypeRelationManager() + manager.delete(ctr_id) + return jsonify(message="CIType Relation is deleted") + + +@cityperelation.route("//", methods=["DELETE"]) +@auth_with_key +def delete_citype_relation_2(parent=None, child=None): + manager = CITypeRelationManager() + manager.delete_2(parent, child) + return jsonify(message="CIType Relation is deleted") diff --git a/cmdb-api/core/history.py b/cmdb-api/core/history.py new file mode 100644 index 0000000..5eee828 --- /dev/null +++ b/cmdb-api/core/history.py @@ -0,0 +1,116 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from flask import jsonify +from flask import current_app +from flask import Blueprint +from flask import request +from flask import abort + +from models.history import OperationRecord +from models.history import CIRelationHistory +from models.history import CIAttributeHistory +from models.attribute import CIAttributeCache +from extensions import db +from models import row2dict +from models.account import UserCache +from lib.ci import CIManager +from lib.utils import get_page + +history = Blueprint("history", __name__) + + +@history.route("/record", methods=["GET"]) +def get_record(): + page = get_page(request.values.get("page", 1)) + _start = request.values.get("start") + _end = request.values.get("end") + username = request.values.get("username", "") + per_page_cnt = current_app.config.get("DEFAULT_PAGE_COUNT") + start, end = None, None + if _start: + try: + start = datetime.datetime.strptime(_start, '%Y-%m-%d %H:%M:%S') + except ValueError: + abort(400, 'incorrect start date time') + if _end: + try: + end = datetime.datetime.strptime(_end, '%Y-%m-%d %H:%M:%S') + except ValueError: + abort(400, 'incorrect end date time') + records = db.session.query(OperationRecord) + numfound = db.session.query(db.func.count(OperationRecord.record_id)) + if start: + records = records.filter(OperationRecord.timestamp >= start) + numfound = numfound.filter(OperationRecord.timestamp >= start) + if end: + records = records.filter(OperationRecord.timestamp <= end) + numfound = records.filter(OperationRecord.timestamp <= end) + if username: + user = UserCache.get(username) + if user: + records = records.filter(OperationRecord.uid == user.uid) + else: + return jsonify(numfound=0, records=[], + page=1, total=0, start=_start, + end=_end, username=username) + records = records.order_by(-OperationRecord.record_id).offset( + per_page_cnt * (page - 1)).limit(per_page_cnt).all() + total = len(records) + numfound = numfound.first()[0] + res = [] + for record in records: + _res = row2dict(record) + _res["user"] = UserCache.get(_res.get("uid")).nickname \ + if UserCache.get(_res.get("uid")).nickname \ + else UserCache.get(_res.get("uid")).username + attr_history = db.session.query(CIAttributeHistory.attr_id).filter( + CIAttributeHistory.record_id == _res.get("record_id")).all() + _res["attr_history"] = [CIAttributeCache.get(h.attr_id).attr_alias + for h in attr_history] + rel_history = db.session.query(CIRelationHistory.operate_type).filter( + CIRelationHistory.record_id == _res.get("record_id")).all() + rel_statis = {} + for rel in rel_history: + if rel.operate_type not in rel_statis: + rel_statis[rel.operate_type] = 1 + else: + rel_statis[rel.res.operate_type] += 1 + _res["rel_history"] = rel_statis + res.append(_res) + + return jsonify(numfound=numfound, records=res, page=page, total=total, + start=_start, end=_end, username=username) + + +@history.route("/", methods=["GET"]) +def get_detail_by_record(record_id=None): + record = db.session.query(OperationRecord).filter( + OperationRecord.record_id == record_id).first() + if record is None: + abort(404, "record is not found") + username = UserCache.get(record.uid).nickname \ + if UserCache.get(record.uid).nickname \ + else UserCache.get(record.uid).username + timestamp = record.timestamp.strftime("%Y-%m-%d %H:%M:%S") + attr_history = db.session.query(CIAttributeHistory).filter( + CIAttributeHistory.record_id == record_id).all() + rel_history = db.session.query(CIRelationHistory).filter( + CIRelationHistory.record_id == record_id).all() + attr_dict, rel_dict = dict(), {"add": [], "delete": []} + for attr_h in attr_history: + attr_dict[CIAttributeCache.get(attr_h.attr_id).attr_alias] = { + "old": attr_h.old, "new": attr_h.new, + "operate_type": attr_h.operate_type} + manager = CIManager() + for rel_h in rel_history: + _, first = manager.get_ci_by_id(rel_h.first_ci_id) + _, second = manager.get_ci_by_id(rel_h.second_ci_id) + rel_dict[rel_h.operate_type].append( + (first, rel_h.relation_type, second)) + + return jsonify(username=username, timestamp=timestamp, + attr_history=attr_dict, + rel_history=rel_dict) diff --git a/cmdb-api/core/special.py b/cmdb-api/core/special.py new file mode 100644 index 0000000..019e5f5 --- /dev/null +++ b/cmdb-api/core/special.py @@ -0,0 +1,16 @@ +# -*- coding:utf-8 -*- + + +from flask import Blueprint +from flask import jsonify + + +special = Blueprint(__name__, "special") + + +@special.route("/api/v0.1/special", methods=["GET"]) +def index(): + """ + 定义专用接口 + """ + return jsonify(code=200) \ No newline at end of file diff --git a/cmdb-api/core/statis.py b/cmdb-api/core/statis.py new file mode 100644 index 0000000..20b5061 --- /dev/null +++ b/cmdb-api/core/statis.py @@ -0,0 +1,12 @@ +# -*- coding:utf-8 -*- + + +from flask import Blueprint + + +statis = Blueprint("statis", __name__) + + +@statis.route("") +def statis(): + pass \ No newline at end of file diff --git a/cmdb-api/extensions.py b/cmdb-api/extensions.py new file mode 100644 index 0000000..5dfb606 --- /dev/null +++ b/cmdb-api/extensions.py @@ -0,0 +1,16 @@ +# encoding=utf-8 + + +from flask.ext.mail import Mail +from flask.ext.sqlalchemy import SQLAlchemy +from flask.ext.cache import Cache +from flask.ext.celery import Celery + + +__all__ = ['mail', 'db', 'cache', 'celery'] + + +mail = Mail() +db = SQLAlchemy() +cache = Cache() +celery = Celery() \ No newline at end of file diff --git a/cmdb-api/gunicornserver.py b/cmdb-api/gunicornserver.py new file mode 100644 index 0000000..6c5feab --- /dev/null +++ b/cmdb-api/gunicornserver.py @@ -0,0 +1,72 @@ +# encoding=utf-8 + +from flask_script import Command, Option + + +class GunicornServer(Command): + description = 'Run the app within Gunicorn' + + def __init__(self, host='127.0.0.1', port=5000, workers=8, + worker_class="gevent", daemon=False): + self.port = port + self.host = host + self.workers = workers + self.worker_class = worker_class + self.daemon = daemon + + def get_options(self): + return ( + Option('-H', '--host', + dest='host', + default=self.host), + + Option('-p', '--port', + dest='port', + type=int, + default=self.port), + + Option('-w', '--workers', + dest='workers', + type=int, + default=self.workers), + + Option("-c", "--worker_class", + dest='worker_class', + type=str, + default=self.worker_class), + + Option("-d", "--daemon", + dest="daemon", + type=bool, + default=self.daemon) + ) + + def handle(self, app, host, port, workers, worker_class, daemon): + + from gunicorn import version_info + + if version_info < (0, 9, 0): + from gunicorn.arbiter import Arbiter + from gunicorn.config import Config + + arbiter = Arbiter(Config({'bind': "%s:%d" % (host, int(port)), + 'workers': workers, + 'worker_class': worker_class, + 'daemon': daemon}), app) + arbiter.run() + else: + from gunicorn.app.base import Application + + class FlaskApplication(Application): + def init(self, parser, opts, args): + return { + 'bind': '{0}:{1}'.format(host, port), + 'workers': workers, + 'worker_class': worker_class, + 'daemon': daemon + } + + def load(self): + return app + + FlaskApplication().run() diff --git a/cmdb-api/lib/__init__.py b/cmdb-api/lib/__init__.py new file mode 100644 index 0000000..ef612ed --- /dev/null +++ b/cmdb-api/lib/__init__.py @@ -0,0 +1,4 @@ +# -*- coding:utf-8 -*- + + +__all__ = [] \ No newline at end of file diff --git a/cmdb-api/lib/account.py b/cmdb-api/lib/account.py new file mode 100644 index 0000000..31bb2b1 --- /dev/null +++ b/cmdb-api/lib/account.py @@ -0,0 +1,145 @@ +# -*- coding:utf-8 -*- + + +import uuid +import random +import string +import datetime + +from flask import current_app +from flask import abort + +from extensions import db +from models.account import UserCache +from models.account import User +from models.account import UserRole + + +class AccountManager(object): + def __init__(self): + pass + + def get_user_by_uid(self, uid): + user = UserCache.get(uid) + return user + + def _generate_key(self): + key = uuid.uuid4().hex + secret = ''.join(random.sample(string.ascii_letters + + string.digits + '~!@#$%^&*?', 32)) + return key, secret + + def validate(self, username, password): + user, authenticated = User.query.authenticate(username, password) + return user, authenticated + + def create_user(self, **kwargs): + username = kwargs.get("username") + if username: + user = UserCache.get(username) + if user is not None: + user, authenticated = self.validate( + username, kwargs.get("password")) + if authenticated: + return user + else: + return abort(401, "authenticate validate failed") + else: + return abort(400, "argument username is required") + user = User() + email = kwargs.get("email", "") + if not email: + return abort(400, "argument email is required") + user.email = email + user.password = kwargs.get("password") + user.username = kwargs.get("username", "") + user.nickname = kwargs.get("nickname") if kwargs.get("nickname") \ + else kwargs.get("username", "") + key, secret = self._generate_key() + user.key = key + user.secret = secret + user.date_joined = datetime.datetime.now() + user.block = 0 + + db.session.add(user) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("create user is error {0}".format(str(e))) + return abort(500, "create user is error, {0}".format(str(e))) + return user + + def update_user(self, uid, **kwargs): + user = UserCache.get(uid) + if user is None: + return abort(400, "the user[{0}] is not existed".format(uid)) + user.username = kwargs.get("username", "") \ + if kwargs.get("username") else user.username + user.nickname = kwargs.get("nickname") \ + if kwargs.get("nickname") else user.nickname + user.department = kwargs.get("department") \ + if kwargs.get("department") else user.department + user.catalog = kwargs.get("catalog") \ + if kwargs.get("catalog") else user.catalog + user.email = kwargs.get("email") \ + if kwargs.get("email") else user.email + user.mobile = kwargs.get("mobile") \ + if kwargs.get("mobile") else user.mobile + db.session.add(user) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("create user is error {0}".format(str(e))) + return abort(500, "create user is error, {0}".format(str(e))) + return True, user + + def delete_user(self, uid): + user = UserCache.get(uid) + if user is None: + return abort(400, "the user[{0}] is not existed".format(uid)) + db.session.query(UserRole).filter(UserRole.uid == uid).delete() + db.session.delete(user) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("delete user error, {0}".format(str(e))) + return abort(500, "delete user error, {0}".format(str(e))) + return True, uid + + def update_password(self, uid, old, new, confirm): + user = User.query.get(uid) + if not user: + return abort(400, "user is not existed") + if not user.check_password(old): + return abort(400, "invalidate old password") + if not (new and confirm and new == confirm): + return abort(400, """Password cannot be empty, + two inputs must be the same""") + user.password = new + db.session.add(user) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("set password error, %s" % str(e)) + return abort(500, "set password errors, {0:s}".format(str(e))) + return True, user + + def reset_key(self, uid): + user = UserCache.get(uid) + if user is None: + return abort(400, "the user[{0}] is not existed".format(uid)) + key, secret = self._generate_key() + user.key = key + user.secret = secret + db.session.add(user) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("reset key is error, {0}".format(str(e))) + return abort(500, "reset key is error, {0}".format(str(e))) + return True, user \ No newline at end of file diff --git a/cmdb-api/lib/attribute.py b/cmdb-api/lib/attribute.py new file mode 100644 index 0000000..19e889d --- /dev/null +++ b/cmdb-api/lib/attribute.py @@ -0,0 +1,167 @@ +# -*- coding:utf-8 -*- + +from flask import current_app +from flask import abort + +from extensions import db +from models.attribute import CIAttribute +from models.attribute import CIAttributeCache +from models import row2dict +from lib.const import type_map + + +class AttributeManager(object): + """ + CI attributes manager + """ + + def __init__(self): + pass + + def _get_choice_value(self, attr_id, value_type): + _table = type_map.get("choice").get(value_type) + choice_values = db.session.query(_table.value).filter( + _table.attr_id == attr_id).all() + return [choice_value.value for choice_value in choice_values] + + def _add_choice_value(self, choice_value, attr_id, value_type): + _table = type_map.get("choice").get(value_type) + db.session.query(_table).filter(_table.attr_id == attr_id).delete() + db.session.flush() + for v in choice_value.strip().split(","): + table = _table() + table.attr_id = attr_id + table.value = v + db.session.add(table) + db.session.flush() + + def get_attributes(self, name=None): + """ + return attribute by name, + if name is None, then return all attributes + """ + attrs = db.session.query(CIAttribute).filter( + CIAttribute.attr_name.ilike("%{0}%".format(name))).all() \ + if name is not None else db.session.query(CIAttribute).all() + res = list() + for attr in attrs: + attr_dict = row2dict(attr) + if attr.is_choice: + attr_dict["choice_value"] = self._get_choice_value( + attr.attr_id, attr.value_type) + res.append(attr_dict) + return res + + def get_attribute_by_name(self, attr_name): + attr = db.session.query(CIAttribute).filter( + CIAttribute.attr_name == attr_name).first() + if attr: + attr_dict = row2dict(attr) + if attr.is_choice: + attr_dict["choice_value"] = self._get_choice_value( + attr.attr_id, attr.value_type) + return attr_dict + + def get_attribute_by_alias(self, attr_alias): + attr = db.session.query(CIAttribute).filter( + CIAttribute.attr_alias == attr_alias).first() + if attr: + attr_dict = row2dict(attr) + if attr.is_choice: + attr_dict["choice_value"] = self._get_choice_value( + attr.attr_id, attr.value_type) + return attr_dict + + def get_attribute_by_id(self, attr_id): + attr = db.session.query(CIAttribute).filter( + CIAttribute.attr_id == attr_id).first() + if attr: + attr_dict = row2dict(attr) + if attr.is_choice: + attr_dict["choice_value"] = self._get_choice_value( + attr.attr_id, attr.value_type) + return attr_dict + + def add(self, attr_name, attr_alias, **kwargs): + choice_value = kwargs.get("choice_value", False) + attr = CIAttributeCache.get(attr_name) + if attr is not None: + return False, "attribute {0} is already existed".format(attr_name) + is_choice = False + if choice_value: + is_choice = True + if not attr_alias: + attr_alias = attr_name + attr = CIAttribute() + attr.attr_name = attr_name + attr.attr_alias = attr_alias + attr.is_choice = is_choice + attr.is_multivalue = kwargs.get("is_multivalue", False) + attr.is_uniq = kwargs.get("is_uniq", False) + attr.is_index = kwargs.get("is_index", False) + attr.value_type = kwargs.get("value_type", "text") + db.session.add(attr) + db.session.flush() + + if choice_value: + self._add_choice_value(choice_value, attr.attr_id, attr.value_type) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("add attribute error, {0}".format(str(e))) + return False, str(e) + CIAttributeCache.clean(attr) + return True, attr.attr_id + + def update(self, attr_id, *args, **kwargs): + attr = db.session.query(CIAttribute).filter_by(attr_id=attr_id).first() + if not attr: + return False, "CI attribute you want to update is not existed" + choice_value = kwargs.get("choice_value", False) + is_choice = False + if choice_value: + is_choice = True + attr.attr_name = args[0] + attr.attr_alias = args[1] + if not args[1]: + attr.attr_alias = args[0] + attr.is_choice = is_choice + attr.is_multivalue = kwargs.get("is_multivalue", False) + attr.is_uniq = kwargs.get("is_uniq", False) + attr.value_type = kwargs.get("value_type", "text") + db.session.add(attr) + db.session.flush() + if is_choice: + self._add_choice_value(choice_value, attr.attr_id, attr.value_type) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("update attribute error, {0}".format( + str(e))) + return False, str(e) + CIAttributeCache.clean(attr) + return True, attr.attr_id + + def delete(self, attr_id): + attr, name = db.session.query(CIAttribute).filter_by( + attr_id=attr_id).first(), None + if attr: + if attr.is_choice: + choice_table = type_map["choice"].get(attr.value_type) + db.session.query(choice_table).filter( + choice_table.attr_id == attr_id).delete() + name = attr.attr_name + CIAttributeCache.clean(attr) + db.session.delete(attr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("delete attribute error, {0}".format( + str(e))) + return abort(500, str(e)) + else: + return abort(404, "attribute you want to delete is not existed") + return name \ No newline at end of file diff --git a/cmdb-api/lib/auth.py b/cmdb-api/lib/auth.py new file mode 100644 index 0000000..ce43d43 --- /dev/null +++ b/cmdb-api/lib/auth.py @@ -0,0 +1,68 @@ +# -*- coding:utf-8 -*- + +import urllib +from functools import wraps + +from flask import current_app +from flask import g +from flask import request +from flask import abort +from flask.ext.principal import identity_changed +from flask.ext.principal import Identity +from flask.ext.principal import AnonymousIdentity + +from models.account import User +from models.account import UserCache + + +def auth_with_key(func): + @wraps(func) + def wrapper(*args, **kwargs): + if isinstance(getattr(g, 'user', None), User): + identity_changed.send(current_app._get_current_object(), + identity=Identity(g.user.uid)) + return func(*args, **kwargs) + ip = request.remote_addr + if request.data: + request_args = dict() + _args = request.data.split("&") + for arg in _args: + if arg: + request_args[arg.split("=")[0]] = \ + urllib.unquote(arg.split("=")[1]) + else: + request_args = request.values + + key = request_args.get('_key') + secret = request_args.get('_secret') + if not key and not secret and \ + ip.strip() in current_app.config.get("WHITE_LIST"): + ip = ip.strip() + user = UserCache.get(ip) + if user: + identity_changed.send(current_app._get_current_object(), + identity=Identity(user.uid)) + return func(*args, **kwargs) + else: + identity_changed.send(current_app._get_current_object(), + identity=AnonymousIdentity()) + return abort(400, "invalid _key and _secret") + + path = request.path + + keys = sorted(request_args.keys()) + req_args = [request_args[k] for k in keys + if str(k) not in ("_key", "_secret")] + current_app.logger.debug('args is %s' % req_args) + user, authenticated = User.query.authenticate_with_key( + key, secret, req_args, path) + if user and authenticated: + identity_changed.send(current_app._get_current_object(), + identity=Identity(user.get("uid"))) + return func(*args, **kwargs) + else: + identity_changed.send(current_app._get_current_object(), + identity=AnonymousIdentity()) + return abort(400, "invalid _key and _secret") + + return wrapper diff --git a/cmdb-api/lib/ci.py b/cmdb-api/lib/ci.py new file mode 100644 index 0000000..a6282b0 --- /dev/null +++ b/cmdb-api/lib/ci.py @@ -0,0 +1,677 @@ +# -*- coding:utf-8 -*- + + +import uuid +import time +import datetime +import json + +from flask import current_app +from flask import abort +from sqlalchemy import or_ + +from extensions import db +from models.ci import CI +from models.ci_relation import CIRelation +from models.ci_type import CITypeAttribute +from models.ci_type import CITypeCache +from models.ci_type import CITypeSpecCache +from models.history import CIAttributeHistory +from models.attribute import CIAttributeCache +from lib.const import TableMap +from lib.const import type_map +from lib.value import AttributeValueManager +from lib.history import CIAttributeHistoryManger +from lib.history import CIRelationHistoryManager +from lib.query_sql import QUERY_HOSTS_NUM_BY_PRODUCT +from lib.query_sql import QUERY_HOSTS_NUM_BY_BU +from lib.query_sql import QUERY_HOSTS_NUM_BY_PROJECT +from lib.query_sql import QUERY_CIS_BY_IDS +from lib.query_sql import QUERY_CIS_BY_VALUE_TABLE +from lib.utils import rd +from tasks.cmdb import ci_cache +from tasks.cmdb import ci_delete + + +class CIManager(object): + """ manage CI interface + """ + + def __init__(self): + pass + + def get_ci_by_id(self, ci_id, ret_key="name", + fields=None, need_children=True, use_master=False): + """@params: `ret_key` is one of 'name', 'id', 'alias' + `fields` is list of attribute name/alias/id + """ + ci = CI.query.get(ci_id) or \ + abort(404, "CI {0} is not existed".format(ci_id)) + + res = dict() + + if need_children: + children = self.get_children(ci_id, ret_key=ret_key) # one floor + res.update(children) + ci_type = CITypeCache.get(ci.type_id) + res["ci_type"] = ci_type.type_name + uniq_key = CIAttributeCache.get(ci_type.uniq_id) + if not fields: # fields are all attributes + attr_ids = db.session.query(CITypeAttribute.attr_id).filter_by( + type_id=ci.type_id) + fields = [CIAttributeCache.get(_.attr_id).attr_name + for _ in attr_ids] + + if uniq_key.attr_name not in fields: + fields.append(uniq_key.attr_name) + if fields: + value_manager = AttributeValueManager() + _res = value_manager._get_attr_values( + fields, ci_id, + ret_key=ret_key, uniq_key=uniq_key, use_master=use_master) + res.update(_res) + res['_type'] = ci_type.type_id + res['_id'] = ci_id + return res + + def get_ci_by_ids(self, ci_id_list, ret_key="name", fields=None): + result = list() + for ci_id in ci_id_list: + res = self.get_ci_by_id(ci_id, ret_key=ret_key, fields=fields) + result.append(res) + return result + + def get_children(self, ci_id, ret_key='name', relation_type="contain"): + second_cis = db.session.query(CIRelation.second_ci_id).filter( + CIRelation.first_ci_id == ci_id).filter(or_( + CIRelation.relation_type == relation_type, + CIRelation.relation_type == "deploy")) + second_ci_ids = (second_ci.second_ci_id for second_ci in second_cis) + ci_types = {} + for ci_id in second_ci_ids: + type_id = db.session.query(CI.type_id).filter( + CI.ci_id == ci_id).first().type_id + if type_id not in ci_types: + ci_types[type_id] = [ci_id] + else: + ci_types[type_id].append(ci_id) + res = {} + for type_id in ci_types: + ci_type = CITypeCache.get(type_id) + children = get_cis_by_ids(map(str, ci_types.get(type_id)), + ret_key=ret_key) + res[ci_type.type_name] = children + return res + + def get_cis_by_type(self, type_id, ret_key="name", fields="", + page=1, per_page=None): + if per_page is None: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + cis = db.session.query(CI.ci_id).filter(CI.type_id == type_id) + numfound = cis.count() + cis = cis.offset((page - 1) * per_page).limit(per_page) + res = list() + ci_ids = [str(ci.ci_id) for ci in cis] + if ci_ids: + res = get_cis_by_ids(ci_ids, ret_key, fields) + return numfound, page, res + + def ci_is_exist(self, ci_type, unique_key, unique): + table = TableMap(attr_name=unique_key.attr_name).table + unique = db.session.query(table).filter( + table.attr_id == unique_key.attr_id).filter( + table.value == unique).first() + if unique: + return db.session.query(CI).filter( + CI.ci_id == unique.ci_id).first() + + def _delete_ci_by_id(self, ci_id): + db.session.query(CI.ci_id).filter(CI.ci_id == ci_id).delete() + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("delete ci is error, {0}".format(str(e))) + + def add(self, ci_type_name, exist_policy="replace", + _no_attribute_policy="ignore", **ci_dict): + ci_existed = False + ci_type = CITypeCache.get(ci_type_name) or \ + abort(404, "CIType {0} is not existed".format(ci_type_name)) + + unique_key = CIAttributeCache.get(ci_type.uniq_id) \ + or abort(500, 'illegality unique attribute') + + unique = ci_dict.get(unique_key.attr_name) \ + or abort(500, '{0} missing'.format(unique_key.attr_name)) + + old_ci = self.ci_is_exist(ci_type, unique_key, unique) + if old_ci is not None: + ci_existed = True + if exist_policy == 'reject': + return abort(500, 'CI is existed') + if old_ci.type_id != ci_type.type_id: # update ci_type + old_ci.type_id = ci_type.type_id + db.session.add(old_ci) + db.session.flush() + ci = old_ci + else: + if exist_policy == 'need': + return abort(404, 'CI {0} not exist'.format(unique)) + ci = CI() + ci.type_id = ci_type.type_id + _uuid = uuid.uuid4().hex + ci.uuid = _uuid + ci.created_time = datetime.datetime.now() + db.session.add(ci) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error('add CI error: {0}'.format(str(e))) + return abort(500, 'add CI error') + value_manager = AttributeValueManager() + histories = list() + for p, v in ci_dict.items(): + ret, res = value_manager.add_attr_value( + p, v, ci.ci_id, ci_type, + _no_attribute_policy=_no_attribute_policy, + ci_existed=ci_existed) + if not ret: + db.session.rollback() + if not ci_existed: + self.delete(ci.ci_id) + current_app.logger.info(res) + return abort(500, res) + if res is not None: + histories.append(res) + try: + db.session.commit() + except Exception as e: + current_app.logger.error(str(e)) + db.session.rollback() + if not ci_existed: # only add + self.delete(ci.ci_id) + return abort(500, "add CI error") + his_manager = CIAttributeHistoryManger() + his_manager.add(ci.ci_id, histories) + ci_cache.apply_async([ci.ci_id], queue="cmdb_async") + return ci.ci_id + + def delete(self, ci_id): + ci = db.session.query(CI).filter(CI.ci_id == ci_id).first() + if ci is not None: + attrs = db.session.query(CITypeAttribute.attr_id).filter( + CITypeAttribute.type_id == ci.type_id).all() + attr_names = [] + for attr in attrs: + attr_names.append(CIAttributeCache.get(attr.attr_id).attr_name) + attr_names = set(attr_names) + for attr_name in attr_names: + Table = TableMap(attr_name=attr_name).table + db.session.query(Table).filter(Table.ci_id == ci_id).delete() + db.session.query(CIRelation).filter( + CIRelation.first_ci_id == ci_id).delete() + db.session.query(CIRelation).filter( + CIRelation.second_ci_id == ci_id).delete() + db.session.query(CIAttributeHistory).filter( + CIAttributeHistory.ci_id == ci_id).delete() + + db.session.flush() + db.session.delete(ci) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("delete CI error, {0}".format(str(e))) + return abort(500, "delete CI error, {0}".format(str(e))) + # TODO: write history + ci_delete.apply_async([ci.ci_id], queue="cmdb_async") + return ci_id + return abort(404, "CI {0} not found".format(ci_id)) + + def add_heartbeat(self, ci_type, unique): + ci_type = CITypeCache.get(ci_type) + if not ci_type: + return 'error' + uniq_key = CIAttributeCache.get(ci_type.uniq_id) + Table = TableMap(attr_name=uniq_key.attr_name).table + ci_id = db.session.query(Table.ci_id).filter( + Table.attr_id == uniq_key.attr_id).filter( + Table.value == unique).first() + if ci_id is None: + return 'error' + ci = db.session.query(CI).filter(CI.ci_id == ci_id.ci_id).first() + if ci is None: + return 'error' + + ci.heartbeat = datetime.datetime.now() + + db.session.add(ci) + db.session.commit() + return "ok" + + def get_heartbeat(self, page, type_id, agent_status=None): + query = db.session.query(CI.ci_id, CI.heartbeat) + expire = datetime.datetime.now() - datetime.timedelta(minutes=72) + if type_id: + query = query.filter(CI.type_id == type_id) + else: + query = query.filter(db.or_(CI.type_id == 7, CI.type_id == 8)) + if agent_status == -1: + query = query.filter(CI.heartbeat == None) + elif agent_status == 0: + query = query.filter(CI.heartbeat <= expire) + elif agent_status == 1: + query = query.filter(CI.heartbeat > expire) + numfound = query.count() + per_page_count = current_app.config.get("DEFAULT_PAGE_COUNT") + cis = query.offset((page - 1) * per_page_count).limit( + per_page_count).all() + ci_ids = [ci.ci_id for ci in cis] + heartbeat_dict = {} + for ci in cis: + if agent_status is not None: + heartbeat_dict[ci.ci_id] = agent_status + else: + if ci.heartbeat is None: + heartbeat_dict[ci.ci_id] = -1 + elif ci.heartbeat <= expire: + heartbeat_dict[ci.ci_id] = 0 + else: + heartbeat_dict[ci.ci_id] = 1 + current_app.logger.debug(heartbeat_dict) + ci_ids = map(str, ci_ids) + res = get_cis_by_ids(ci_ids, fields=["hostname", "private_ip"]) + result = [(i.get("hostname"), i.get("private_ip")[0], i.get("ci_type"), + heartbeat_dict.get(i.get("_id"))) for i in res + if i.get("private_ip")] + return numfound, result + + +class CIRelationManager(object): + """ + manage relation between CIs + """ + + def __init__(self): + pass + + @property + def relation_types(self): + """ all CIType relation types + """ + from lib.const import CI_RELATION_TYPES + + return CI_RELATION_TYPES + + def get_second_cis(self, first_ci, relation_type="contain", + page=1, per_page=None, **kwargs): + if per_page is None: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + second_cis = db.session.query( + CI.ci_id).join( + CIRelation, CIRelation.second_ci_id == CI.ci_id).filter( + CIRelation.first_ci_id == first_ci).filter( + CIRelation.relation_type == relation_type) + if kwargs: # special for devices + second_cis = self._query_wrap_for_device(second_cis, **kwargs) + numfound = second_cis.count() + second_cis = second_cis.offset( + (page - 1) * per_page).limit(per_page).all() + ci_ids = [str(son.ci_id) for son in second_cis] + total = len(ci_ids) + result = get_cis_by_ids(ci_ids) + return numfound, total, result + + def get_grandsons(self, ci_id, page=1, per_page=None, **kwargs): + if per_page is None: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + children = db.session.query(CIRelation.second_ci_id).filter( + CIRelation.first_ci_id == ci_id).subquery() + grandsons = db.session.query(CIRelation.second_ci_id).join( + children, + children.c.second_ci_id == CIRelation.first_ci_id).subquery() + grandsons = db.session.query(CI.ci_id).join( + grandsons, grandsons.c.second_ci_id == CI.ci_id) + if kwargs: + grandsons = self._query_wrap_for_device(grandsons, **kwargs) + + numfound = grandsons.count() + grandsons = grandsons.offset( + (page - 1) * per_page).limit(per_page).all() + if not grandsons: + return 0, 0, [] + ci_ids = [str(son.ci_id) for son in grandsons] + total = len(ci_ids) + result = get_cis_by_ids(ci_ids) + + return numfound, total, result + + def _sort_handler(self, sort_by, query_sql): + + if sort_by.startswith("+"): + sort_type = "asc" + sort_by = sort_by[1:] + elif sort_by.startswith("-"): + sort_type = "desc" + sort_by = sort_by[1:] + else: + sort_type = "asc" + attr = CIAttributeCache.get(sort_by) + if attr is None: + return query_sql + + attr_id = attr.attr_id + Table = TableMap(attr_name=sort_by).table + + CI_table = query_sql.subquery() + query_sql = db.session.query(CI_table.c.ci_id, Table.value).join( + Table, Table.ci_id == CI_table.c.ci_id).filter( + Table.attr_id == attr_id).order_by( + getattr(Table.value, sort_type)()) + + return query_sql + + def _query_wrap_for_device(self, query_sql, **kwargs): + _type = kwargs.pop("_type", False) or kwargs.pop("type", False) \ + or kwargs.pop("ci_type", False) + if _type: + ci_type = CITypeCache.get(_type) + if ci_type is None: + return + query_sql = query_sql.filter(CI.type_id == ci_type.type_id) + + for k, v in kwargs.iteritems(): + attr = CIAttributeCache.get(k) + if attr is None: + continue + Table = TableMap(attr_name=k).table + CI_table = query_sql.subquery() + query_sql = db.session.query(CI_table.c.ci_id).join( + Table, Table.ci_id == CI_table.c.ci_id).filter( + Table.attr_id == attr.attr_id).filter( + Table.value.ilike(v.replace("*", "%"))) + + current_app.logger.debug(query_sql) + sort_by = kwargs.pop("sort", False) + if sort_by: + query_sql = self._sort_handler(sort_by, query_sql) + return query_sql + + def get_great_grandsons(self, ci_id, page=1, per_page=None, **kwargs): + if per_page is None: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + + children = db.session.query(CIRelation.second_ci_id).filter( + CIRelation.first_ci_id == ci_id).subquery() + grandsons = db.session.query(CIRelation.second_ci_id).join( + children, + children.c.second_ci_id == CIRelation.first_ci_id).subquery() + great_grandsons = db.session.query(CIRelation.second_ci_id).join( + grandsons, + grandsons.c.second_ci_id == CIRelation.first_ci_id).subquery() + great_grandsons = db.session.query(CI.ci_id).join( + great_grandsons, great_grandsons.c.second_ci_id == CI.ci_id) + if kwargs: + great_grandsons = self._query_wrap_for_device( + great_grandsons, **kwargs) + if great_grandsons is None: + return 0, 0, [] + numfound = great_grandsons.count() + great_grandsons = great_grandsons.offset( + (page - 1) * per_page).limit(per_page).all() + ci_ids = [str(son.ci_id) for son in great_grandsons] + total = len(ci_ids) + result = get_cis_by_ids(ci_ids) + + return numfound, total, result + + def get_first_cis(self, second_ci, relation_type="contain", + page=1, per_page=None): + """only for CI Type + """ + if per_page is None: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + first_cis = db.session.query(CIRelation.first_ci_id).filter( + CIRelation.second_ci_id == second_ci).filter( + CIRelation.relation_type == relation_type) + numfound = first_cis.count() + first_cis = first_cis.offset( + (page - 1) * per_page).limit(per_page).all() + result = [] + first_ci_ids = [str(first_ci.first_ci_id) for first_ci in first_cis] + total = len(first_ci_ids) + if first_ci_ids: + result = get_cis_by_ids(first_ci_ids) + return numfound, total, result + + def get_grandfather(self, ci_id, relation_type="contain"): + """only for CI Type + """ + grandfather = db.session.query(CIRelation.first_ci_id).filter( + CIRelation.second_ci_id.in_(db.session.query( + CIRelation.first_ci_id).filter( + CIRelation.second_ci_id == ci_id).filter( + CIRelation.relation_type == relation_type))).filter( + CIRelation.relation_type == relation_type).first() + if grandfather: + return CIManager().get_ci_by_id(grandfather.first_ci_id, + need_children=False) + + def add(self, first_ci, second_ci, more=None, relation_type="contain"): + ci = db.session.query(CI.ci_id).filter(CI.ci_id == first_ci).first() + if ci is None: + return abort(404, "first_ci {0} is not existed".format(first_ci)) + c = db.session.query(CI.ci_id).filter(CI.ci_id == second_ci).first() + if c is None: + return abort(404, "second_ci {0} is not existed".format( + second_ci)) + existed = db.session.query(CIRelation.cr_id).filter( + CIRelation.first_ci_id == first_ci).filter( + CIRelation.second_ci_id == second_ci).first() + if existed is not None: + return existed.cr_id + cr = CIRelation() + cr.first_ci_id = first_ci + cr.second_ci_id = second_ci + if more is not None: + cr.more = more + cr.relation_type = relation_type + db.session.add(cr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("add CIRelation is error, {0}".format( + str(e))) + return abort(500, "add CIRelation is error, {0}".format(str(e))) + # write history + his_manager = CIRelationHistoryManager() + his_manager.add(cr.cr_id, cr.first_ci_id, cr.second_ci_id, + relation_type, operate_type="add") + return cr.cr_id + + def delete(self, cr_id): + cr = db.session.query(CIRelation).filter( + CIRelation.cr_id == cr_id).first() + cr_id = cr.cr_id + first_ci = cr.first_ci_id + second_ci = cr.second_ci_id + if cr is not None: + db.session.delete(cr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "delete CIRelation is error, {0}".format(str(e))) + return abort( + 500, "delete CIRelation is error, {0}".format(str(e))) + his_manager = CIRelationHistoryManager() + his_manager.add(cr_id, first_ci, second_ci, + cr.relation_type, operate_type="delete") + return True + return abort(404, "CI relation is not existed") + + def delete_2(self, first_ci, second_ci): + cr = db.session.query(CIRelation).filter( + CIRelation.first_ci_id == first_ci).filter( + CIRelation.second_ci_id == second_ci).first() + return self.delete(cr.cr_id) + + +class HostNumStatis(object): + def __init__(self): + pass + + def get_hosts_by_project(self, project_id_list=None): + res = {} + if not project_id_list: + project = CITypeCache.get("project") + projects = db.session.query(CI.ci_id).filter( + CI.type_id == project.type_id).all() + project_id_list = (project.ci_id for project in projects) + project_id_list = map(str, project_id_list) + project_ids = ",".join(project_id_list) + nums = db.session.execute(QUERY_HOSTS_NUM_BY_PROJECT.format( + "".join(["(", project_ids, ")"]))).fetchall() + if nums: + for ci_id in project_id_list: + res[int(ci_id)] = 0 + for ci_id, num in nums: + res[ci_id] = num + return res + + def get_hosts_by_product(self, product_id_list=None): + res = {} + if not product_id_list: + product = CITypeCache.get("product") + products = db.session.query(CI.ci_id).filter( + CI.type_id == product.type_id).all() + product_id_list = (product.ci_id for product in products) + product_id_list = map(str, product_id_list) + product_ids = ",".join(product_id_list) + nums = db.session.execute(QUERY_HOSTS_NUM_BY_PRODUCT.format( + "".join(["(", product_ids, ")"]))).fetchall() + if nums: + for ci_id in product_id_list: + res[int(ci_id)] = 0 + for ci_id, num in nums: + res[ci_id] = num + return res + + def get_hosts_by_bu(self, bu_id_list=None): + res = {} + if not bu_id_list: + bu = CITypeCache.get("bu") + bus = db.session.query(CI.ci_id).filter( + CI.type_id == bu.type_id).all() + bu_id_list = (bu.ci_id for bu in bus) + bu_id_list = map(str, bu_id_list) + bu_ids = ",".join(bu_id_list) + current_app.logger.debug(QUERY_HOSTS_NUM_BY_BU.format( + "".join(["(", bu_ids, ")"]))) + if not bu_ids: + return res + nums = db.session.execute( + QUERY_HOSTS_NUM_BY_BU.format( + "".join(["(", bu_ids, ")"]))).fetchall() + if nums: + for ci_id in bu_id_list: + res[int(ci_id)] = 0 + for ci_id, num in nums: + res[ci_id] = num + return res + + +def get_cis_by_ids(ci_ids, ret_key="name", fields="", value_tables=None): + """ argument ci_ids are string list of CI instance ID, eg. ['1', '2'] + """ + if not ci_ids: + return [] + start = time.time() + ci_id_tuple = tuple(map(int, ci_ids)) + res = rd.get(ci_id_tuple) + if res is not None and None not in res and ret_key == "name": + res = map(json.loads, res) + if not fields: + return res + else: + _res = [] + for d in res: + _d = dict() + _d["_id"], _d["_type"] = d.get("_id"), d.get("_type") + _d["ci_type"] = d.get("ci_type") + for field in fields: + _d[field] = d.get(field) + _res.append(_d) + current_app.logger.debug("filter time: %s" % (time.time() - start)) + return _res + current_app.logger.warning("cache not hit...............") + if not fields: + _fields = "" + else: + _fields = list() + for field in fields: + attr = CIAttributeCache.get(field) + if attr is not None: + _fields.append(str(attr.attr_id)) + _fields = "WHERE A.attr_id in ({0})".format(",".join(_fields)) + ci_ids = ",".join(ci_ids) + if value_tables is None: + value_tables = type_map["table_name"].values() + current_app.logger.debug(value_tables) + value_sql = " UNION ".join([QUERY_CIS_BY_VALUE_TABLE.format(value_table, + ci_ids) + for value_table in value_tables]) + query_sql = QUERY_CIS_BY_IDS.format(ci_ids, _fields, value_sql) + current_app.logger.debug(query_sql) + start = time.time() + hosts = db.session.execute(query_sql).fetchall() + current_app.logger.info("get cis time is: {0}".format( + time.time() - start)) + + ci_list = set() + res = list() + ci_dict = dict() + start = time.time() + for ci_id, type_id, attr_id, attr_name, \ + attr_alias, value, value_type, is_multivalue in hosts: + if ci_id not in ci_list: + ci_dict = dict() + ci_type = CITypeSpecCache.get(type_id) + ci_dict["_id"] = ci_id + ci_dict["_type"] = type_id + ci_dict["ci_type"] = ci_type.type_name + ci_dict["ci_type_alias"] = ci_type.type_alias + ci_list.add(ci_id) + res.append(ci_dict) + if ret_key == "name": + if is_multivalue: + if isinstance(ci_dict.get(attr_name), list): + ci_dict[attr_name].append(value) + else: + ci_dict[attr_name] = [value] + else: + ci_dict[attr_name] = value + elif ret_key == "alias": + if is_multivalue: + if isinstance(ci_dict.get(attr_alias), list): + ci_dict[attr_alias].append(value) + else: + ci_dict[attr_alias] = [value] + else: + ci_dict[attr_alias] = value + elif ret_key == "id": + if is_multivalue: + if isinstance(ci_dict.get(attr_id), list): + ci_dict[attr_id].append(value) + else: + ci_dict[attr_id] = [value] + else: + ci_dict[attr_id] = value + + current_app.logger.debug("result parser time is: {0}".format( + time.time() - start)) + return res \ No newline at end of file diff --git a/cmdb-api/lib/ci_type.py b/cmdb-api/lib/ci_type.py new file mode 100644 index 0000000..728beed --- /dev/null +++ b/cmdb-api/lib/ci_type.py @@ -0,0 +1,315 @@ +# -*- coding:utf-8 -*- + + +from flask import current_app +from flask import abort + +from extensions import db +from models import row2dict +from models.ci_type import CITypeAttribute +from models.ci_type import CIType +from models.ci_type import CITypeAttributeCache +from models.ci_type import CITypeCache +from models.ci_type_relation import CITypeRelation +from models.attribute import CIAttributeCache +from lib.attribute import AttributeManager + + +class CITypeAttributeManager(object): + """ + manage CIType's attributes, include query, add, update, delete + """ + + def __init__(self): + pass + + def get_attributes_by_type_id(self, type_id): + attrs = CITypeAttributeCache.get(type_id) + attr_manager = AttributeManager() + result = list() + for attr in attrs: + attr_dict = attr_manager.get_attribute_by_id(attr.attr_id) + attr_dict["is_required"] = attr.is_required + result.append(attr_dict) + return result + + def add(self, type_id, attr_ids=None, is_required=False): + """ + add attributes to CIType, attr_ids are list + """ + if not attr_ids or not isinstance(attr_ids, list): + return abort(500, "attr_ids must be required") + ci_type = CITypeCache.get(type_id) + if ci_type is None: + return abort(404, "CIType ID({0}) is not existed".format(type_id)) + for attr_id in attr_ids: + attr = CIAttributeCache.get(attr_id) + if attr is None: + return abort(404, + "attribute id {0} is not existed".format(attr_id)) + existed = db.session.query(CITypeAttribute.attr_id).filter_by( + type_id=type_id).filter_by(attr_id=attr_id).first() + if existed is not None: + continue + current_app.logger.debug(attr_id) + db.session.add(CITypeAttribute( + type_id=type_id, attr_id=attr_id, is_required=is_required)) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "add attribute to CIType is error, {0}".format(str(e))) + return abort( + 500, "add attribute to CIType is error, maybe duplicate entry") + + CITypeAttributeCache.clean(type_id) + return True + + def delete(self, type_id, attr_ids=None): + """ + delete attributes at CIType, attr_ids are list + """ + if not attr_ids or not isinstance(attr_ids, list): + return abort( + 500, "delete attribute of CIType, attr_ids must be required") + ci_type = CITypeCache.get(type_id) + if ci_type is None: + return abort( + 404, "CIType ID({0}) is not existed".format(type_id)) + for attr_id in attr_ids: + attr = CIAttributeCache.get(attr_id) + if attr is None: + return abort( + 404, "attribute id {0} is not existed".format(attr_id)) + db.session.query(CITypeAttribute).filter_by( + type_id=type_id).filter_by(attr_id=attr_id).delete() + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "delete attributes of CIType is error, {0}".format(str(e))) + return abort(500, "delete attributes of CIType is error") + CITypeAttributeCache.clean(type_id) + return True + + +class CITypeManager(object): + """ + manage CIType + """ + + def __init__(self): + pass + + def get_citypes(self, type_name=None): + ci_types = db.session.query(CIType).all() if type_name is None else \ + db.session.query(CIType).filter( + CIType.type_name.ilike("%{0}%".format(type_name))).all() + res = list() + for ci_type in ci_types: + type_dict = row2dict(ci_type) + type_dict["uniq_key"] = CIAttributeCache.get( + type_dict["uniq_id"]).attr_name + res.append(type_dict) + return res + + def query(self, _type): + citype = CITypeCache.get(_type) + if citype: + return row2dict(citype) + return abort(404, "citype is not found") + + def add(self, type_name, type_alias, _id=None, unique=None, + icon_url="", enabled=True): + uniq_key = CIAttributeCache.get(_id) or CIAttributeCache.get(unique) + if uniq_key is None: + return False, "uniq_key is not existed" + citype = CITypeCache.get(type_name) + if citype: + return False, "this CIType {0} is existed".format(type_name) + _citype = CIType() + _citype.type_name = type_name + _citype.type_alias = type_alias + _citype.uniq_id = uniq_key.attr_id + _citype.enabled = enabled + _citype.icon_url = icon_url + db.session.add(_citype) + db.session.flush() + _citype_attr = CITypeAttribute() + _citype_attr.attr_id = uniq_key.attr_id + _citype_attr.type_id = _citype.type_id + _citype_attr.is_required = True + db.session.add(_citype_attr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("add CIType is error, {0}".format(str(e))) + return False, str(e) + CITypeCache.clean(type_name) + return True, _citype.type_id + + def update(self, type_id, type_name, type_alias, _id=None, unique=None, + icon_url="", enabled=None): + citype = CITypeCache.get(type_id) + if citype is None: + return False, "CIType {0} is not existed".format(type_name) + uniq_key = CIAttributeCache.get(_id) or CIAttributeCache.get(unique) + if uniq_key is not None: + citype.uniq_id = uniq_key.attr_id + citype_attr = db.session.query(CITypeAttribute).filter( + CITypeAttribute.type_id == type_id).filter( + CITypeAttribute.attr_id == uniq_key.attr_id).first() + if citype_attr is None: + citype_attr = CITypeAttribute() + citype_attr.attr_id = uniq_key.attr_id + citype_attr.type_id = type_id + citype_attr.is_required = True + db.session.add(citype_attr) + if type_name: + citype.type_name = type_name + if type_alias: + citype.type_alias = type_alias + if icon_url: + citype.icon_url = icon_url + if enabled is not None: + citype.enabled = enabled + db.session.add(citype) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("add CIType is error, {0}".format(str(e))) + return False, str(e) + CITypeCache.clean(type_id) + return True, type_id + + def set_enabled(self, type_id, enabled=True): + citype = CITypeCache.get(type_id) + if citype is None: + return abort(404, "CIType[{0}] is not existed".format(type_id)) + citype.enabled = enabled + db.session.add(citype) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "set CIType enabled is error, {0}".format(str(e))) + return abort(500, str(e)) + return type_id + + def delete(self, type_id): + citype = db.session.query(CIType).filter_by(type_id=type_id).first() + type_name = citype.type_name + if citype: + db.session.delete(citype) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "delete CIType is error, {0}".format(str(e))) + return abort(500, str(e)) + CITypeCache.clean(type_id) + return "CIType {0} deleted".format(type_name) + return abort(404, "CIType is not existed") + + +class CITypeRelationManager(object): + """ + manage relation between CITypes + """ + + def __init__(self): + pass + + @property + def relation_types(self): + """ all CIType relation types + """ + from lib.const import CITYPE_RELATION_TYPES + + return CITYPE_RELATION_TYPES + + def get_children(self, parent_id): + children = db.session.query(CITypeRelation).filter( + CITypeRelation.parent_id == parent_id).all() + result = [] + for child in children: + ctr_id = child.ctr_id + citype = CITypeCache.get(child.child_id) + citype_dict = row2dict(citype) + citype_dict["ctr_id"] = ctr_id + manager = CITypeAttributeManager() + citype_dict["attributes"] = manager.get_attributes_by_type_id( + citype.type_id) + citype_dict["relation_type"] = child.relation_type + result.append(citype_dict) + return result + + def get_parents(self, child_id): + parents = db.session.query(CITypeRelation).filter( + CITypeRelation.child_id == child_id).all() + result = [] + for parent in parents: + ctr_id = parent.ctr_id + citype = CITypeCache.get(parent.parent_id) + citype_dict = row2dict(citype) + citype_dict["ctr_id"] = ctr_id + manager = CITypeAttributeManager() + citype_dict["attributes"] = manager.get_attributes_by_type_id( + citype.type_id) + citype_dict["relation_type"] = parent.relation_type + result.append(citype_dict) + return result + + def add(self, parent, child, relation_type="contain"): + p = CITypeCache.get(parent) + if p is None: + return abort(404, "parent {0} is not existed".format(parent)) + c = CITypeCache.get(child) + if c is None: + return abort(404, "child {0} is not existed".format(child)) + existed = db.session.query(CITypeRelation.ctr_id).filter_by( + parent_id=parent).filter_by(child_id=child).first() + if existed is not None: + return True, existed.ctr_id + ctr = CITypeRelation() + ctr.parent_id = parent + ctr.child_id = child + ctr.relation_type = relation_type + db.session.add(ctr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "add CITypeRelation is error, {0}".format(str(e))) + return abort( + 500, "add CITypeRelation is error, {0}".format(str(e))) + return ctr.ctr_id + + def delete(self, ctr_id): + ctr = db.session.query(CITypeRelation).filter( + CITypeRelation.ctr_id == ctr_id).first() + if ctr: + db.session.delete(ctr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "delete CITypeRelation is error, {0}".format(str(e))) + return abort( + 500, "delete CITypeRelation is error, {0}".format(str(e))) + return True + return abort(404, "CIType relation is not existed") + + def delete_2(self, parent, child): + ctr = db.session.query(CITypeRelation).filter( + CITypeRelation.parent_id == parent).filter( + CITypeRelation.child_id == child).first() + return self.delete(ctr.ctr_id) \ No newline at end of file diff --git a/cmdb-api/lib/const.py b/cmdb-api/lib/const.py new file mode 100644 index 0000000..51409a4 --- /dev/null +++ b/cmdb-api/lib/const.py @@ -0,0 +1,99 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from models.attribute import TextChoice +from models.attribute import FloatChoice +from models.attribute import IntegerChoice +from models.attribute import CIAttributeCache +from models.ci_value import CIValueText +from models.ci_value import CIValueInteger +from models.ci_value import CIValueFloat +from models.ci_value import CIValueDateTime +from models.ci_value import CIIndexValueDateTime +from models.ci_value import CIIndexValueFloat +from models.ci_value import CIIndexValueInteger +from models.ci_value import CIIndexValueText + + +def string2int(x): + return int(float(x)) + + +def str2datetime(x): + try: + v = datetime.datetime.strptime(x, "%Y-%m-%d") + return v + except ValueError: + pass + try: + v = datetime.datetime.strptime(x, "%Y-%m-%d %H:%M:%S") + return v + except ValueError: + pass + raise ValueError + + +type_map = { + 'converter': { + 'int': string2int, + 'float': float, + 'text': unicode, + 'datetime': str2datetime, + }, + 'choice': { + 'int': IntegerChoice, + 'float': FloatChoice, + 'text': TextChoice, + }, + 'table': { + 'int': CIValueInteger, + 'text': CIValueText, + 'datetime': CIValueDateTime, + 'float': CIValueFloat, + 'index_int': CIIndexValueInteger, + 'index_text': CIIndexValueText, + 'index_datetime': CIIndexValueDateTime, + 'index_float': CIIndexValueFloat, + }, + 'table_name': { + 'int': 'integers', + 'text': 'texts', + 'datetime': 'datetime', + 'float': 'floats', + 'index_int': 'index_integers', + 'index_text': 'index_texts', + 'index_datetime': 'index_datetime', + 'index_float': 'index_floats', + } +} + + +class TableMap(): + def __init__(self, attr_name=None): + self.attr_name = attr_name + + @property + def table(self): + if self.attr_name is not None: + attr = CIAttributeCache.get(self.attr_name) + if attr.is_index: + i = "index_{0}".format(attr.value_type) + else: + i = attr.value_type + return type_map["table"].get(i) + + @property + def table_name(self): + if self.attr_name is not None: + attr = CIAttributeCache.get(self.attr_name) + if attr.is_index: + i = "index_{0}".format(attr.value_type) + else: + i = attr.value_type + return type_map["table_name"].get(i) + + +CITYPE_RELATION_TYPES = ["connect", "deploy", "install", "contain"] +CI_RELATION_TYPES = ["connect", "deploy", "install", "contain"] \ No newline at end of file diff --git a/cmdb-api/lib/decorator.py b/cmdb-api/lib/decorator.py new file mode 100644 index 0000000..8cafba7 --- /dev/null +++ b/cmdb-api/lib/decorator.py @@ -0,0 +1,74 @@ +# -*- coding:utf-8 -*- + + +import time +from functools import wraps + +from flask import request +from flask import render_template +from flask import current_app + +from lib.exception import InvalidUsageError + + +def templated(template=None): + def decorator(f): + @wraps(f) + def decorated_function(*args, **kwargs): + template_name = template + if template_name is None: + template_name = request.endpoint.replace('.', '/') + '.html' + ctx = f(*args, **kwargs) + if ctx is None: + ctx = {} + elif not isinstance(ctx, dict): + return ctx + return render_template(template_name, **ctx) + + return decorated_function + + return decorator + + +def argument_required1(*args_required): + from manage import InvalidUsageError + + def decorator(f): + @wraps(f) + def decorated_function(*args, **kwargs): + for arg in args_required: + if request.values.get(arg, None) is None: + raise InvalidUsageError( + "argument {0} is required".format(arg), 400) + return f(*args, **kwargs) + + return decorated_function + + return decorator + + +class argument_required(object): + def __init__(self, *args): + self.args = args + + def __enter__(self): + for arg in self.args: + if not request.values.get(arg): + raise InvalidUsageError( + "argument {0} is required".format(arg), status_code=400) + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + +def url_statistic(f): + @wraps(f) + def decorated_func(*args, **kwargs): + start = time.time() + r = f(*args, **kwargs) + spend = time.time() - start + url = request.path + current_app.logger.info(url) + current_app.logger.info(spend) + return r + return decorated_func \ No newline at end of file diff --git a/cmdb-api/lib/exception.py b/cmdb-api/lib/exception.py new file mode 100644 index 0000000..a11af85 --- /dev/null +++ b/cmdb-api/lib/exception.py @@ -0,0 +1,17 @@ +# -*- coding:utf-8 -*- + + +class InvalidUsageError(Exception): + status_code = 400 + + def __init__(self, message, status_code=None, payload=None): + Exception.__init__(self) + self.message = message + if status_code is not None: + self.status_code = status_code + self.payload = payload + + def to_dict(self): + rv = dict(self.payload or ()) + rv['message'] = self.message + return rv \ No newline at end of file diff --git a/cmdb-api/lib/history.py b/cmdb-api/lib/history.py new file mode 100644 index 0000000..ebcef62 --- /dev/null +++ b/cmdb-api/lib/history.py @@ -0,0 +1,75 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from flask import current_app +from flask import g + +from extensions import db +from models.history import OperationRecord +from models.history import CIAttributeHistory +from models.history import CIRelationHistory + + +class CIAttributeHistoryManger(object): + def __init__(self): + pass + + def add(self, ci_id, history_list): + if history_list: + record = OperationRecord() + record.uid = g.user.uid + record.timestamp = datetime.datetime.now() + db.session.add(record) + db.session.commit() + for attr_id, operate_type, old, new in history_list: + history = CIAttributeHistory() + history.attr_id = attr_id + history.operate_type = operate_type + history.old = old + history.new = new + history.ci_id = ci_id + history.record_id = record.record_id + db.session.add(history) + + try: + db.session.commit() + except Exception as e: + db.session.rollback() + db.session.rollback() + current_app.logger.error( + "add attribute history error, {0}".format(str(e))) + return False, "add attribute history error, {0}".format(str(e)) + return True, None + + +class CIRelationHistoryManager(object): + def __init__(self): + pass + + def add(self, relation, first_ci, second_ci, + relation_type, operate_type="add"): + record = OperationRecord() + record.uid = g.user.uid + record.timestamp = datetime.datetime.now() + db.session.add(record) + db.session.flush() + + history = CIRelationHistory() + history.relation = relation + history.record_id = record.record_id + history.operate_type = operate_type + history.first_ci_id = first_ci + history.second_ci_id = second_ci + history.relation_type = relation_type + db.session.add(history) + + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "add relation history is error, {0}".format(str(e))) + return False, "add relation history is error, {0}".format(str(e)) + return True, None diff --git a/cmdb-api/lib/mail.py b/cmdb-api/lib/mail.py new file mode 100644 index 0000000..57d8e03 --- /dev/null +++ b/cmdb-api/lib/mail.py @@ -0,0 +1,86 @@ +# -*- coding:utf-8 -*- + + +import requests + +from flask import current_app +from flask.ext.mail import Message + +from extensions import mail +from models.account import User + + +def sendmail(users, subject, message, html=False, app=None): + if app: + mail.app = app + else: + app = current_app + recipients = [x.email for x in users if isinstance(x, User)] + recipients.extend( + [x for x in users if isinstance(x, basestring) and '@' in x]) + sender = app.config.get('DEFAULT_MAIL_SENDER') + if html: + msg = Message(recipients=recipients, + html=message, + subject=subject, + sender=sender) + else: + msg = Message(recipients=recipients, + body=message, + subject=subject, + sender=sender) + mail.send(msg) + + +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from email.header import Header +from email.mime.image import MIMEImage +import smtplib +import time +from email import Utils + + +def send_mail(sender, receiver, subject, content, ctype="html", pics=(), + smtpserver='mail.51ping.com', + username="networkbench@51ping.com", password="12qwaszx"): + """subject and body are unicode objects""" + if ctype == "html": + msg = MIMEText(content, 'html', 'utf-8') + else: + msg = MIMEText(content, 'plain', 'utf-8') + + if len(pics) != 0: + msgRoot = MIMEMultipart('related') + msgText = MIMEText(content, 'html', 'utf-8') + msgRoot.attach(msgText) + i = 1 + for pic in pics: + fp = open(pic, "rb") + image = MIMEImage(fp.read()) + fp.close() + image.add_header('Content-ID', '' % i) + msgRoot.attach(image) + i += 1 + msg = msgRoot + + msg['Subject'] = Header(subject, 'utf-8') + msg['From'] = sender + msg['To'] = ';'.join(receiver) + msg['Message-ID'] = Utils.make_msgid() + msg['date'] = time.strftime('%a, %d %b %Y %H:%M:%S %z') + + smtp = smtplib.SMTP() + smtp.connect(smtpserver, 25) + smtp.login(username, password) + smtp.sendmail(sender, receiver, msg.as_string()) + smtp.quit() + + +def send_sms(mobile, content): + sms_uri = current_app.config.get("SMS_URI") % (mobile, content) + try: + current_app.logger.info(sms_uri) + requests.get(sms_uri) + except Exception as e: + current_app.logger.error("send sms error, %s" % str(e)) \ No newline at end of file diff --git a/cmdb-api/lib/query_sql.py b/cmdb-api/lib/query_sql.py new file mode 100644 index 0000000..960f02b --- /dev/null +++ b/cmdb-api/lib/query_sql.py @@ -0,0 +1,107 @@ +# -*- coding:utf-8 -*- + + +QUERY_HOSTS_BY_APP = """ + SELECT * + FROM cis + INNER JOIN ci_relations AS cr ON cis.`ci_id`=cr.`second_ci` + WHERE cr.`first_ci` = {0:d} LIMIT {1:d}, {2:d}; +""" + +QUERY_HOSTS_NUM_BY_PROJECT = """ + SELECT cr.first_ci_id, + count(DISTINCT cr.second_ci_id) + FROM ci_relations AS cr + WHERE cr.first_ci_id IN {0} + GROUP BY cr.first_ci_id +""" + +QUERY_HOSTS_NUM_BY_BU = """ + SELECT B.first_ci_id, + count(DISTINCT cr.second_ci_id) + FROM + (SELECT A.first_ci_id, + cr.second_ci_id + FROM + (SELECT cr.first_ci_id, + cis.ci_id + FROM cis + INNER JOIN ci_relations AS cr ON cis.ci_id=cr.second_ci_id + WHERE cr.first_ci_id IN {0}) AS A + INNER JOIN ci_relations AS cr ON cr.first_ci_id=A.ci_id) AS B + INNER JOIN ci_relations AS cr ON B.second_ci_id=cr.first_ci_id + GROUP BY B.first_ci_id +""" + +QUERY_HOSTS_NUM_BY_PRODUCT = """ + SELECT A.first_ci_id, + count(DISTINCT cr.second_ci_id) + FROM + (SELECT cr.first_ci_id, + cis.ci_id + FROM cis + INNER JOIN ci_relations AS cr ON cis.ci_id=cr.second_ci_id + WHERE cr.first_ci_id IN {0}) AS A + INNER JOIN ci_relations AS cr ON cr.first_ci_id=A.ci_id + GROUP BY A.first_ci_id; +""" + +QUERY_CIS_BY_VALUE_TABLE = """ + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + {0}.ci_id, + {0}.attr_id, + {0}.value + FROM {0} + INNER JOIN cis ON {0}.ci_id=cis.ci_id + AND {0}.`ci_id` IN ({1}) + INNER JOIN ci_attributes as attr ON attr.attr_id = {0}.attr_id +""" + +QUERY_CIS_BY_IDS = """ + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ({2}) AS A {1} + ORDER BY A.ci_id; +""" + +FACET_QUERY1 = """ + SELECT {0}.value, + count({0}.ci_id) + FROM {0} + INNER JOIN ci_attributes AS attr ON attr.attr_id={0}.attr_id + WHERE attr.attr_name="{1}" + GROUP BY {0}.ci_id; +""" + +FACET_QUERY = """ + SELECT {0}.value, + count({0}.ci_id) + FROM {0} + INNER JOIN ({1}) AS B ON B.ci_id={0}.ci_id + WHERE {0}.attr_id={2:d} + GROUP BY {0}.ci_id +""" + +QUERY_CI_BY_ATTR_NAME = """ + SELECT {0}.ci_id + FROM {0} + WHERE {0}.attr_id={1:d} + AND {0}.value {2} +""" + +QUERY_CI_BY_TYPE = """ + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in ({0}) +""" \ No newline at end of file diff --git a/cmdb-api/lib/search.py b/cmdb-api/lib/search.py new file mode 100644 index 0000000..341950d --- /dev/null +++ b/cmdb-api/lib/search.py @@ -0,0 +1,348 @@ +# -*- coding:utf-8 -*- + + +import time + +from flask import current_app + +from lib.const import TableMap +from models.attribute import CIAttributeCache +from models.ci_type import CITypeCache +from extensions import db +from models import CI +from lib.ci import get_cis_by_ids +from lib.query_sql import FACET_QUERY +from lib.query_sql import QUERY_CI_BY_TYPE +from lib.query_sql import QUERY_CI_BY_ATTR_NAME + + +class SearchError(Exception): + def __init__(self, v): + self.v = v + + def __str__(self): + return self.v + + +class Search(object): + def __init__(self, query=None, fl=None, facet_field=None, + page=1, ret_key="name", count=1, sort=None): + self.orig_query = query + self.fl = fl + self.facet_field = facet_field + self.page = page + self.ret_key = ret_key + try: + self.count = int(count) + except ValueError: + self.count = current_app.config.get("DEFAULT_PAGE_COUNT") + self.sort = sort + self.query_sql = "" + self.type_id_list = [] + + def tor_proc(self, key): + tor = list() + if key.startswith("+"): + tor.append('&') + key = key[1:].strip() + elif key.startswith("-"): + tor.append('|') + key = key[1:].strip() + elif key.startswith("~"): + tor.append('~') + key = key[1:].strip() + if not tor: + tor = ['&', ''] + if len(tor) < 2: + tor.append('') + return tor, key + + def attr_name_proc(self, key): + tor, key = self.tor_proc(key) + if key in ('ci_type', 'type', '_type'): + return '_type', 'text', tor, None + if key in ('id', 'ci_id', '_id'): + return '_id', 'text', tor, None + attr = CIAttributeCache.get(key) + if attr is not None: + # if not attr.is_index: + # raise SearchError("{0} is not indexed".format(attr.attr_name)) + field_name = attr.attr_name + return field_name, attr.value_type, tor, attr + else: + raise SearchError("{0} is not existed".format(key)) + + def type_query_handler(self, v, only_type_query): + new_v = [v] + if v.startswith("(") and v.endswith(")"): + new_v = v[1:-1].split(";") + for _v in new_v: + ci_type = CITypeCache.get(_v) + if ci_type is not None: + self.type_id_list.append(str(ci_type.type_id)) + if self.type_id_list: + type_ids = ",".join(self.type_id_list) + _query_sql = QUERY_CI_BY_TYPE.format(type_ids) + if only_type_query: + return _query_sql + else: + return "" + return "" + + def in_query_handler(self, attr, v): + new_v = v[1:-1].split(";") + table_name = TableMap(attr_name=attr.attr_name).table_name + _query_sql = QUERY_CI_BY_ATTR_NAME.format( + table_name, attr.attr_id, + " OR {0}.value ".format(table_name).join(['LIKE "{0}"'.format( + _v.replace("*", "%")) for _v in new_v])) + return _query_sql + + def range_query_handler(self, attr, v): + start, end = [x.strip() for x in v[1:-1].split("_TO_")] + table_name = TableMap(attr_name=attr.attr_name).table_name + _query_sql = QUERY_CI_BY_ATTR_NAME.format( + table_name, attr.attr_id, "BETWEEN '{0}' AND '{1}'".format( + start.replace("*", "%"), end.replace("*", "%"))) + return _query_sql + + def comparison_query_handler(self, attr, v): + table_name = TableMap(attr_name=attr.attr_name).table_name + if (v.startswith("<") and not v.startswith("<=")) or \ + (v.startswith(">") and not v.startswith(">=")): + _query_sql = QUERY_CI_BY_ATTR_NAME.format( + table_name, attr.attr_id, "{0} '{1}'".format( + v[0], v[1:].replace("*", "%"))) + elif v.startswith(">=") or v.startswith("<="): + _query_sql = QUERY_CI_BY_ATTR_NAME.format( + table_name, attr.attr_id, "{0} '{1}'".format( + v[:2], v[2:].replace("*", "%"))) + return _query_sql + + def sort_query_handler(self, field, query_sql, only_type_query): + if field is None: + field = "" + if field.startswith("+"): + field = field[1:] + sort_type = "ASC" + elif field.startswith("-"): + field = field[1:] + sort_type = "DESC" + else: + sort_type = "ASC" + + if field in ("_id", "ci_id") or not field: + if only_type_query: + return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ({0}) AS B {1}""".format( + query_sql, + "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( + (self.page - 1) * self.count, sort_type, self.count)) + elif self.type_id_list: + return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ({0}) AS B {1}""".format( + query_sql, + "INNER JOIN cis on cis.ci_id=B.ci_id " + "WHERE cis.type_id in ({3}) " + "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( + (self.page - 1) * self.count, sort_type, self.count, + ",".join(self.type_id_list))) + else: + return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ({0}) AS B {1}""".format( + query_sql, + "INNER JOIN cis on cis.ci_id=B.ci_id " + "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( + (self.page - 1) * self.count, sort_type, self.count)) + else: + attr = CIAttributeCache.get(field) + attr_id = attr.attr_id + + table_name = TableMap(attr_name=attr.attr_name).table_name + _v_query_sql = """SELECT {0}.ci_id, {1}.value FROM + ({2}) AS {0} INNER JOIN {1} ON {1}.ci_id = {0}.ci_id + WHERE {1}.attr_id = {3}""".format("ALIAS", table_name, + query_sql, attr_id) + new_table = _v_query_sql + if only_type_query: + return "SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id " \ + "FROM ({0}) AS C " \ + "ORDER BY C.value {2} " \ + "LIMIT {1:d}, {3};".format(new_table, + (self.page - 1) * self.count, + sort_type, self.count) + elif self.type_id_list: + return """SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id + FROM ({0}) AS C + INNER JOIN cis on cis.ci_id=C.ci_id + WHERE cis.type_id in ({4}) + ORDER BY C.value {2} + LIMIT {1:d}, {3};""".format(new_table, + (self.page - 1) * self.count, + sort_type, self.count, + ",".join(self.type_id_list)) + else: + return """SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id + FROM ({0}) AS C + ORDER BY C.value {2} + LIMIT {1:d}, {3};""".format(new_table, + (self.page - 1) * self.count, + sort_type, self.count) + + def _wrap_sql(self, tor, alias, _query_sql, query_sql): + if tor[0] == "&": + query_sql = """SELECT * FROM ({0}) as {1} + INNER JOIN ({2}) as {3} USING(ci_id)""".format( + query_sql, alias, _query_sql, alias + "A") + elif tor[0] == "|": + query_sql = "SELECT * FROM ({0}) as {1} UNION ALL ({2})".format( + query_sql, alias, _query_sql) + elif tor[0] == "~": + query_sql = "SELECT * FROM ({0}) as {1} LEFT JOIN ({2}) as {3} " \ + "USING(ci_id) WHERE {3}.ci_id is NULL".format( + query_sql, alias, _query_sql, alias + "A") + return query_sql + + def _execute_sql(self, query_sql, only_type_query): + v_query_sql = self.sort_query_handler(self.sort, query_sql, + only_type_query) + start = time.time() + execute = db.session.execute + current_app.logger.debug(v_query_sql) + res = execute(v_query_sql).fetchall() + end_time = time.time() + current_app.logger.debug("query ci ids time is: {0}".format( + end_time - start)) + numfound = execute("SELECT FOUND_ROWS();").fetchall()[0][0] + current_app.logger.debug("statistics ci ids time is: {0}".format( + time.time() - end_time) + ) + return numfound, res + + def query_build_raw(self): + query_sql, alias, tor = "", "A", ["&"] + is_first = True + only_type_query = False + queries = self.orig_query.split(",") + queries = filter(lambda x: x != "", queries) + for q in queries: + if q.startswith("_type"): + queries.remove(q) + queries.insert(0, q) + if len(queries) == 1 or queries[1].startswith("-") or \ + queries[1].startswith("~"): + only_type_query = True + break + current_app.logger.debug(queries) + special = True + for q in queries: + _query_sql = "" + if ":" in q: + k = q.split(":")[0].strip() + v = ":".join(q.split(":")[1:]).strip() + current_app.logger.info(v) + field, field_type, tor, attr = self.attr_name_proc(k) + if field == "_type": + _query_sql = self.type_query_handler(v, only_type_query) + current_app.logger.debug(_query_sql) + elif field == "_id": # exclude all others + _ci_ids = [str(v)] + ci = db.session.query(CI.ci_id).filter( + CI.ci_id == int(v)).first() + if ci is not None: + return 1, _ci_ids + elif field: + if attr is None: + raise SearchError("{0} is not found".format(field)) + # in query + if v.startswith("(") and v.endswith(")"): + _query_sql = self.in_query_handler(attr, v) + # range query + elif v.startswith("[") and v.endswith("]") and "_TO_" in v: + _query_sql = self.range_query_handler(attr, v) + # comparison query + elif v.startswith(">=") or v.startswith("<=") or \ + v.startswith(">") or v.startswith("<"): + _query_sql = self.comparison_query_handler(attr, v) + else: + table_name = \ + TableMap(attr_name=attr.attr_name).table_name + _query_sql = QUERY_CI_BY_ATTR_NAME.format( + table_name, attr.attr_id, + 'LIKE "{0}"'.format(v.replace("*", "%"))) + else: + return 0, [] + elif q: + return 0, [] + + if is_first and _query_sql and not only_type_query: + query_sql = "SELECT * FROM ({0}) AS {1}".format(_query_sql, + alias) + is_first = False + alias += "A" + elif only_type_query and special: + is_first = False + special = False + query_sql = _query_sql + elif _query_sql: + query_sql = self._wrap_sql(tor, alias, _query_sql, query_sql) + alias += "AA" + + _start = time.time() + if query_sql: + self.query_sql = query_sql + current_app.logger.debug(query_sql) + numfound, res = self._execute_sql(query_sql, only_type_query) + current_app.logger.info("query ci ids is: {0}".format( + time.time() - _start)) + return numfound, [_res[0] for _res in res] + return 0, [] + + def facet_build(self): + facet = {} + for f in self.facet_field: + k, field_type, _, attr = self.attr_name_proc(f) + if k: + table_name = TableMap(attr_name=k).table_name + query_sql = FACET_QUERY.format( + table_name, self.query_sql, attr.attr_id) + result = db.session.execute(query_sql).fetchall() + facet[k] = result + facet_result = dict() + for k, v in facet.items(): + if not k.startswith('_'): + a = getattr(CIAttributeCache.get(k), "attr_%s" % self.ret_key) + facet_result[a] = list() + for f in v: + if f[1] != 0: + facet_result[a].append((f[0], f[1], a)) + return facet_result + + def fl_build(self): + _fl = list() + for f in self.fl: + k, _, _, _ = self.attr_name_proc(f) + if k: + _fl.append(k) + return _fl + + def search(self): + numfound, ci_ids = self.query_build_raw() + ci_ids = map(str, ci_ids) + _fl = self.fl_build() + + if self.facet_field and numfound: + facet = self.facet_build() + else: + facet = dict() + + response, counter = [], {} + if ci_ids: + response = get_cis_by_ids(ci_ids, ret_key=self.ret_key, fields=_fl) + for res in response: + ci_type = res.get("ci_type") + if ci_type not in counter.keys(): + counter[ci_type] = 0 + counter[ci_type] += 1 + total = len(response) + return response, counter, total, self.page, numfound, facet \ No newline at end of file diff --git a/cmdb-api/lib/template/__init__.py b/cmdb-api/lib/template/__init__.py new file mode 100644 index 0000000..44d37d3 --- /dev/null +++ b/cmdb-api/lib/template/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/cmdb-api/lib/template/filters.py b/cmdb-api/lib/template/filters.py new file mode 100644 index 0000000..149d4f7 --- /dev/null +++ b/cmdb-api/lib/template/filters.py @@ -0,0 +1,9 @@ +# -*- coding:utf-8 -*- + + +def convert_to_list(v): + if isinstance(v, list): + return v + if isinstance(v, tuple): + return list(v) + return [v, ] diff --git a/cmdb-api/lib/utils.py b/cmdb-api/lib/utils.py new file mode 100644 index 0000000..2a31655 --- /dev/null +++ b/cmdb-api/lib/utils.py @@ -0,0 +1,74 @@ +# -*- coding:utf-8 -*- + + +import redis + +from flask import current_app +import settings + + +class RedisHandler(object): + def __init__(self): + try: + pool = redis.ConnectionPool( + max_connections=settings.REDIS_MAX_CONN, + host=settings.REDIS_HOST, + port=settings.REDIS_PORT, + db=settings.REDIS_DB) + self.r = redis.Redis(connection_pool=pool) + except Exception as e: + print e + current_app.logger.error("init redis connection failed") + + @classmethod + def instance(cls): + if not hasattr(cls, "_instance"): + cls._instance = cls() + return cls._instance + + def get(self, ci_ids, key="CMDB_CI"): + try: + value = self.r.hmget(key, ci_ids) + except Exception as e: + current_app.logger.error("get redis error, %s" % str(e)) + return + return value + + def _set(self, ci, key="CMDB_CI"): + try: + self.r.hmset(key, ci) + except Exception as e: + current_app.logger.error("set redis error, %s" % str(e)) + + def add(self, ci): + self._set(ci) + + def delete(self, ci_id, key="CMDB_CI"): + try: + ret = self.r.hdel(key, ci_id) + if not ret: + current_app.logger.warn("ci [%d] is not in redis" % ci_id) + except Exception as e: + current_app.logger.error("delete redis key error, %s" % str(e)) + +rd = RedisHandler.instance() + + +def get_page(page): + try: + page = int(page) + except ValueError: + page = 1 + if page < 1: + page = 1 + return page + + +def get_per_page(per_page): + try: + per_page = int(per_page) + except: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + if per_page < 1: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + return per_page \ No newline at end of file diff --git a/cmdb-api/lib/value.py b/cmdb-api/lib/value.py new file mode 100644 index 0000000..f9916f7 --- /dev/null +++ b/cmdb-api/lib/value.py @@ -0,0 +1,170 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from flask import current_app + +from extensions import db +from models.attribute import CIAttributeCache +from lib.attribute import AttributeManager +from lib.const import type_map +from lib.const import TableMap + + +class AttributeValueManager(object): + """ + manage CI attribute values + """ + + def __init__(self): + pass + + def _get_attr(self, key): + """key is one of attr_id, attr_name and attr_alias + """ + attr = CIAttributeCache.get(key) + return attr + + def _get_attr_values(self, fields, ci_id, + ret_key="name", + uniq_key=None, + use_master=False): + res = dict() + for field in fields: + attr = CIAttributeCache.get(field) + if not attr: + current_app.logger.warn('attribute %s not found' % field) + return res + table = TableMap(attr_name=attr.attr_name).table + if use_master: + rs = db.session().using_bind("master").query( + table.value).filter_by(ci_id=ci_id).filter_by( + attr_id=attr.attr_id) + else: + rs = db.session.query(table.value).filter_by( + ci_id=ci_id).filter_by(attr_id=attr.attr_id) + field_name = getattr(attr, "attr_{0}".format(ret_key)) + try: + if attr.is_multivalue: + if attr.value_type == 'datetime': + res[field_name] = [datetime.datetime.strftime( + x.value, '%Y-%m-%d %H:%M:%S') for x in rs.all()] + else: + res[field_name] = [x.value for x in rs.all()] + else: + x = rs.first() + if x: + if attr.value_type == 'datetime': + res[field_name] = datetime.datetime.strftime( + rs.first().value, '%Y-%m-%d %H:%M:%S') + else: + res[field_name] = rs.first().value + else: + res[field_name] = None + except AttributeError as e: + current_app.logger.warn("get ci by id error, {0}".format(e)) + if attr.is_multivalue: + res[field_name] = list() + else: + res[field_name] = "" + if uniq_key is not None and attr.attr_id == uniq_key.attr_id \ + and rs.first() is not None: + res['unique'] = uniq_key.attr_name + return res + + def _validate(self, attr, value, table, ci_id): + converter = type_map.get("converter").get(attr.value_type) + try: + v = converter(value) + except ValueError: + return False, "attribute value {0} converter fail".format(value) + if attr.is_choice: + choice_list = AttributeManager()._get_choice_value( + attr.attr_id, attr.value_type) + if v not in choice_list: + return False, "{0} is not existed in choice values".format( + value) + elif attr.is_uniq: + old_value = db.session.query(table.attr_id).filter( + table.attr_id == attr.attr_id).filter( + table.value == v).filter(table.ci_id != ci_id).first() + if old_value is not None: + return False, "attribute {0} value {1} must be unique".format( + attr.attr_name, value) + return True, v + + def add_attr_value(self, key, value, ci_id, ci_type, + _no_attribute_policy="ignore", ci_existed=False): + """key is one of attr_id, attr_name and attr_alias + """ + attr = self._get_attr(key) + if attr is None: + if _no_attribute_policy == 'ignore': + return True, None + if _no_attribute_policy == 'reject': + return False, 'attribute {0} not exist'.format(key) + table, old_value, old_value_table = TableMap( + attr_name=attr.attr_name).table, None, None + if ci_existed: + old_value_table = db.session.query(table).filter( + table.attr_id == attr.attr_id).filter( + table.ci_id == ci_id).first() + if old_value_table is not None: + old_value = old_value_table.value + if not value and ci_existed: + db.session.query(table).filter( + table.attr_id == attr.attr_id).filter( + table.ci_id == ci_id).delete() + if old_value: + return True, (attr.attr_id, "delete", old_value, None) + else: + return True, None + elif not value: + return True, None + if not attr.is_multivalue: + ret, res = self._validate(attr, value, table, ci_id) + if not ret: + return False, res + value_table = table() + if ci_existed: # for history + old = db.session.query(table).filter( + table.attr_id == attr.attr_id).filter( + table.value == value).filter( + table.ci_id == ci_id).first() + if old is not None: + return True, None + elif old_value_table: + value_table = old_value_table + value_table.ci_id = ci_id + value_table.attr_id = attr.attr_id + value_table.value = res + db.session.add(value_table) + elif attr.is_multivalue: + if ci_existed: + db.session.query(table).filter( + table.attr_id == attr.attr_id).filter( + table.ci_id == ci_id).delete() + + for v in value.strip().split(","): + ret, res = self._validate(attr, v, table, ci_id) + if not ret: + return False, res + value_table = table() + value_table.ci_id = ci_id + value_table.attr_id = attr.attr_id + value_table.value = res + db.session.add(value_table) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "add attribute value is error, {0}".format(str(e))) + return False, "add attribute value is error, {0}".format(str(e)) + if ci_existed: + if old_value != value: + return True, (attr.attr_id, "update", old_value, value) + else: + return True, None + return True, (attr.attr_id, "add", None, value) \ No newline at end of file diff --git a/cmdb-api/manage.py b/cmdb-api/manage.py new file mode 100644 index 0000000..3488926 --- /dev/null +++ b/cmdb-api/manage.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- + + +from flask import jsonify +from flask import make_response +from flask.ext.script import Manager +from flask.ext.script import prompt_bool +from flask.ext.celery import install_commands as install_celery_command + +from __init__ import make_app +from extensions import db +from gunicornserver import GunicornServer +from lib.exception import InvalidUsageError + + +app = make_app('config.cfg') + + +@app.errorhandler(InvalidUsageError) +def handle_invalid_usage(error): + response = jsonify(error.to_dict()) + response.status_code = error.status_code + return response + + +@app.errorhandler(404) +def not_found(error): + return make_response(jsonify({'message': error.description}), 404) + + +@app.errorhandler(400) +def bad_request(error): + return make_response(jsonify({'message': error.description}), 400) + + +@app.errorhandler(401) +def auth_lack(error): + return make_response(jsonify({'message': error.description}), 401) + + +@app.errorhandler(403) +def exception_403(error): + return make_response(jsonify({'message': error.description}), 403) + + +@app.errorhandler(405) +def exception_405(error): + return make_response(jsonify({'message': error.description}), 405) + + +@app.errorhandler(500) +def server_error(error): + return make_response(jsonify({"message": error.description}), 500) + + +manager = Manager(app) + +install_celery_command(manager) + + +@manager.command +def db_setup(): + "create all database tables" + db.create_all() + + +@manager.command +def db_dropall(): + "drop all databse tables" + if prompt_bool("Are you sure ? You will lose all your data !"): + db.drop_all() + + +manager.add_command("run", GunicornServer()) + +if __name__ == '__main__': + manager.run(default_command="runserver") diff --git a/cmdb-api/models/__init__.py b/cmdb-api/models/__init__.py new file mode 100644 index 0000000..b5f28a6 --- /dev/null +++ b/cmdb-api/models/__init__.py @@ -0,0 +1,24 @@ +# -*- coding:utf-8 -*- + + +def row2dict(row): + d = dict() + for c in row.__table__.columns: + if not isinstance(getattr(row, c.name), + (basestring, long, int, float, list, tuple, dict)) \ + and getattr(row, c.name): + d[c.name] = getattr(row, c.name).strftime("%Y-%m-%d %H:%M:%S") + else: + d[c.name] = getattr(row, c.name) + return d + + +from account import * +from attribute import * +from ci import * +from ci_relation import * +from ci_type import * +from ci_type_relation import * +from ci_value import * +from history import * +from statis import * diff --git a/cmdb-api/models/account.py b/cmdb-api/models/account.py new file mode 100644 index 0000000..0a3b322 --- /dev/null +++ b/cmdb-api/models/account.py @@ -0,0 +1,230 @@ +# -*- coding:utf-8 -*- + + +import hashlib +import copy +from datetime import datetime + +from werkzeug.utils import cached_property +from flask.ext.sqlalchemy import BaseQuery +from flask.ext.principal import RoleNeed +from flask.ext.principal import UserNeed +from flask.ext.principal import Permission + +from extensions import db +from extensions import cache +from permissions import admin +from models import row2dict + + +class UserQuery(BaseQuery): + def from_identity(self, identity): + """ + Loads user from flask.ext.principal.Identity instance and + assigns permissions from user. + + A "user" instance is monkey patched to the identity instance. + + If no user found then None is returned. + """ + + try: + _id = identity.id + if _id: + _id = int(_id) + user = self.get(_id) + except ValueError: + user = None + except Exception: + user = None + if user: + identity.provides.update(user.provides) + identity.user = user + return user + + def authenticate(self, login, password): + user = self.filter(db.or_(User.username == login, + User.email == login)).first() + if user: + authenticated = user.check_password(password) + else: + authenticated = False + return user, authenticated + + def authenticate_with_key(self, key, secret, args, path): + user = self.filter(User.key == key).filter(User.block == 0).first() + if not user: + return None, False + if user and hashlib.sha1('%s%s%s' % ( + path, user.secret, "".join(args))).hexdigest() == secret: + authenticated = True + else: + authenticated = False + return row2dict(user), authenticated + + def search(self, key): + query = self.filter(db.or_(User.email == key, + User.nickname.ilike('%' + key + '%'), + User.username.ilike('%' + key + '%'))) + return query + + def get_by_username(self, username): + user = self.filter(User.username == username).first() + return user + + def get_by_nickname(self, nickname): + user = self.filter(User.nickname == nickname).first() + return user + + def get(self, uid): + user = self.filter(User.uid == uid).first() + return copy.deepcopy(user) + + def is_exits(self, username): + user = self.filter(User.username == username).first() + return user is not None + + +class User(db.Model): + __tablename__ = 'users' + query_class = UserQuery + + ADMIN = 1 + + uid = db.Column(db.Integer, primary_key=True, autoincrement=True) + username = db.Column(db.String(32), unique=True) + nickname = db.Column(db.String(20), nullable=True) + department = db.Column(db.String(20)) + catalog = db.Column(db.String(64)) + email = db.Column(db.String(100), unique=True, nullable=False) + mobile = db.Column(db.String(14), unique=True) + _password = db.Column("password", db.String(80), nullable=False) + key = db.Column(db.String(32), nullable=False) + secret = db.Column(db.String(32), nullable=False) + date_joined = db.Column(db.DateTime, default=datetime.utcnow) + last_login = db.Column(db.DateTime, default=datetime.utcnow) + block = db.Column(db.Boolean, default=False) + has_logined = db.Column(db.Boolean, default=False) + + class Permissions(object): + def __init__(self, obj): + self.obj = obj + + @cached_property + def is_admin(self): + return Permission(UserNeed(self.obj.id)) & admin + + def __init__(self, *args, **kwargs): + super(User, self).__init__(*args, **kwargs) + + def __str__(self): + return self.username + + @cached_property + def permissions(self): + return self.Permissions(self) + + def _get_password(self): + return self._password + + def _set_password(self, password): + self._password = password + + password = db.synonym("_password", descriptor=property( + _get_password, _set_password)) + + def check_password(self, password): + return self.password == password + + @cached_property + def provides(self): + needs = [RoleNeed('authenticated'), UserNeed(self.uid)] + for r in self.rolenames: + needs.append(RoleNeed(r)) + if self.is_admin: + needs.append(RoleNeed('admin')) + return needs + + @property + def roles(self): + urs = db.session.query(UserRole.rid).filter( + UserRole.uid == self.uid).all() + return [x.rid for x in urs] + + @property + def rolenames(self): + return [db.session.query(Role.role_name).filter( + Role.rid == rid).first().role_name for rid in self.roles] + + @property + def is_admin(self): + return self.ADMIN in self.roles + + +class Role(db.Model): + __tablename__ = 'roles' + + rid = db.Column(db.Integer, primary_key=True, autoincrement=True) + role_name = db.Column(db.String(64), nullable=False, unique=True) + + +class UserRole(db.Model): + __tablename__ = 'users_roles' + + uid = db.Column(db.Integer, db.ForeignKey('users.uid'), primary_key=True) + rid = db.Column(db.Integer, db.ForeignKey('roles.rid'), primary_key=True) + + +class UserCache(object): + @classmethod + def get(cls, key): + user = cache.get("User::uid::%s" % key) or \ + cache.get("User::username::%s" % key) or \ + cache.get("User::nickname::%s" % key) + if not user: + user = User.query.get(key) or \ + User.query.get_by_username(key) or \ + User.query.get_by_nickname(key) + if user: + cls.set(user) + return user + + @classmethod + def set(cls, user): + cache.set("User::uid::%s" % user.uid, user) + cache.set("User::username::%s" % user.username, user) + cache.set("User::nickname::%s" % user.nickname, user) + + @classmethod + def clean(cls, user): + cache.delete("User::uid::%s" % user.uid) + cache.delete("User::username::%s" % user.username) + cache.delete("User::nickname::%s" % user.nickname) + + +class RoleCache(object): + @classmethod + def get(cls, rid): + role = None + if isinstance(rid, (int, long)): + role = cache.get("Role::rid::%s" % rid) + if not role: + role = db.session.query(Role).filter(Role.rid == rid).first() + cls.set(role) + elif isinstance(rid, basestring): + role = cache.get("Role::role_name::%s" % rid) + if not role: + role = db.session.query(Role).filter( + Role.role_name == rid).first() + cls.set(role) + return role + + @classmethod + def set(cls, role): + cache.set("Role::rid::%s" % role.rid, role) + cache.set("Role::role_name::%s" % role.role_name, role) + + @classmethod + def clean(cls, role): + cache.delete("Role::rid::%s" % role.rid, role) + cache.delete("Role::role_name::%s" % role.role_name, role) \ No newline at end of file diff --git a/cmdb-api/models/attribute.py b/cmdb-api/models/attribute.py new file mode 100644 index 0000000..fbc5c0b --- /dev/null +++ b/cmdb-api/models/attribute.py @@ -0,0 +1,87 @@ +# -*- coding:utf-8 -*- + +from extensions import db, cache + + +class CIAttribute(db.Model): + __tablename__ = "ci_attributes" + + attr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + attr_name = db.Column(db.String(32), nullable=False, unique=True) + attr_alias = db.Column(db.String(32), nullable=False, unique=True) + value_type = db.Column( + db.String(8), + db.Enum("int", "float", "text", "datetime", name='value_type'), + default="text", + nullable=False) + is_choice = db.Column(db.Boolean, default=False) + is_multivalue = db.Column(db.Boolean, default=False) + is_uniq = db.Column(db.Boolean, default=False) + is_index = db.Column(db.Boolean, default=False) + + +class IntegerChoice(db.Model): + __tablename__ = 'choice_integers' + + choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + attr = db.relationship("CIAttribute", backref="choice_integers") + value = db.Column(db.Integer, nullable=False) + + +class FloatChoice(db.Model): + __tablename__ = 'choice_floats' + + choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + attr = db.relationship("CIAttribute", backref="choice_floats") + value = db.Column(db.Float, nullable=False) + + +class TextChoice(db.Model): + __tablename__ = 'choice_texts' + + choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + attr = db.relationship("CIAttribute", backref="choice_texts") + value = db.Column(db.Text, nullable=False) + + +class CIAttributeCache(object): + @classmethod + def get(cls, key): + if key is None: + return + attr = cache.get('Field::Name::%s' % key) or \ + cache.get('Field::ID::%s' % key) or \ + cache.get('Field::Alias::%s' % key) + if attr is None: + attr = db.session.query(CIAttribute).filter_by( + attr_name=key).first() or \ + db.session.query(CIAttribute).filter( + CIAttribute.attr_id == key).first() or \ + db.session.query(CIAttribute).filter( + CIAttribute.attr_alias == key).first() + db.session.close() + if attr is not None: + CIAttributeCache.set(attr) + return attr + + @classmethod + def set(cls, attr): + cache.set('Field::ID::%s' % attr.attr_id, attr) + cache.set('Field::Name::%s' % attr.attr_name, attr) + cache.set('Field::Alias::%s' % attr.attr_alias, attr) + + @classmethod + def clean(cls, attr): + if cache.get('Field::ID::%s' % attr.attr_id): + cache.delete('Field::ID::%s' % attr.attr_id) + cache.delete('Field::Name::%s' % attr.attr_name) + cache.delete('Field::Alias::%s' % attr.attr_alias) \ No newline at end of file diff --git a/cmdb-api/models/ci.py b/cmdb-api/models/ci.py new file mode 100644 index 0000000..b4ee4cf --- /dev/null +++ b/cmdb-api/models/ci.py @@ -0,0 +1,20 @@ +# -*- coding:utf-8 -*- + +import datetime + +from extensions import db + + +class CI(db.Model): + __tablename__ = "cis" + + ci_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + uuid = db.Column(db.String(32), nullable=False) + type_id = db.Column(db.Integer, + db.ForeignKey("ci_types.type_id"), + nullable=False) + ci_type = db.relationship("CIType", backref="cis") + status = db.Column(db.String(8), + db.Enum("review", "validate", name="stauts")) + created_time = db.Column(db.DateTime, default=datetime.datetime.now()) + heartbeat = db.Column(db.DateTime, default=datetime.datetime.now()) \ No newline at end of file diff --git a/cmdb-api/models/ci_relation.py b/cmdb-api/models/ci_relation.py new file mode 100644 index 0000000..6a347ea --- /dev/null +++ b/cmdb-api/models/ci_relation.py @@ -0,0 +1,26 @@ +# -*- coding:utf-8 -*- + + +from extensions import db + + +class CIRelation(db.Model): + __tablename__ = "ci_relations" + cr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + first_ci_id = db.Column(db.Integer, + db.ForeignKey("cis.ci_id"), + primary_key=True) + second_ci_id = db.Column(db.Integer, + db.ForeignKey("cis.ci_id"), + primary_key=True) + first_ci = db.relationship("CI", + primaryjoin="CI.ci_id==CIRelation.first_ci_id") + second_ci = db.relationship( + "CI", primaryjoin="CI.ci_id==CIRelation.second_ci_id") + relation_type = db.Column( + db.String(8), db.Enum("connect", "deploy", "install", "contain", + name="relation_type"), nullable=False) + more = db.Column(db.Integer, db.ForeignKey("cis.ci_id")) + + __table_args__ = (db.UniqueConstraint("first_ci_id", "second_ci_id", + name="first_second_uniq"), ) diff --git a/cmdb-api/models/ci_type.py b/cmdb-api/models/ci_type.py new file mode 100644 index 0000000..a995c82 --- /dev/null +++ b/cmdb-api/models/ci_type.py @@ -0,0 +1,128 @@ +# -*- coding:utf-8 -*- + +from extensions import db +from extensions import cache + + +class CIType(db.Model): + __tablename__ = "ci_types" + + type_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + type_name = db.Column(db.String(32)) + type_alias = db.Column(db.String(32)) + uniq_id = db.Column(db.Integer, + db.ForeignKey("ci_attributes.attr_id"), + nullable=False) + uniq_key = db.relationship("CIAttribute", backref="ci_types") + enabled = db.Column(db.Boolean, default=True, nullable=False) + is_attached = db.Column(db.Boolean, default=False, nullable=False) + icon_url = db.Column(db.String(256)) + order = db.Column(db.SmallInteger, default=0, nullable=False) + + +class CITypeAttribute(db.Model): + __tablename__ = "type_attributes" + + type_id = db.Column(db.Integer, + db.ForeignKey("ci_types.type_id"), + primary_key=True) + attr_id = db.Column(db.Integer, + db.ForeignKey("ci_attributes.attr_id"), + primary_key=True) + is_required = db.Column(db.Boolean, default=False) + + __table_args__ = (db.UniqueConstraint("type_id", "attr_id", + name="type_attr_uniq"), ) + + +class CITypeCache(object): + @classmethod + def get(cls, key): + if key is None: + return + ct = cache.get("CIType::ID::%s" % key) or \ + cache.get("CIType::Name::%s" % key) + if ct is None: + ct = db.session.query(CIType).filter( + CIType.type_name == key).first() or \ + db.session.query(CIType).filter(CIType.type_id == key).first() + if ct is not None: + CITypeCache.set(ct) + return ct + + @classmethod + def set(cls, ct): + cache.set("CIType::Name::%s" % ct.type_name, ct) + cache.set("CIType::ID::%d" % ct.type_id, ct) + + @classmethod + def clean(cls, key): + ct = CITypeCache.get(key) + if ct is not None: + cache.delete("CIType::Name::%s" % ct.type_name) + cache.delete("CIType::ID::%s" % ct.type_id) + + +class CITypeSpecCache(object): + @classmethod + def get(cls, key): + if key is None: + return + ct = cache.get("CITypeSPEC::ID::%d" % key) + if ct is None: + ct = db.session.query(CIType).filter(CIType.type_id == key).first() + if ct is not None: + CITypeSpecCache.set(ct) + return ct + + @classmethod + def set(cls, ct): + cache.set("CITypeSPEC::ID::%d" % ct.type_id, ct) + + @classmethod + def clean(cls, key): + ct = CITypeCache.get(key) + if ct is not None: + cache.delete("CITypeSPEC::ID::%d" % ct.type_id) + + +class CITypeAttributeCache(object): + """ + key is type_id or type_name + """ + + @classmethod + def get(cls, key): + if key is None: + return + if isinstance(key, basestring) and isinstance(key, unicode): + key = unicode(key, 'utf8') + citypes = cache.get("CITypeAttribute::Name::%s" % key) or \ + cache.get("CITypeAttribute::ID::%s" % key) + if not citypes: + citypes = db.session.query(CITypeAttribute).filter( + CITypeAttribute.type_id == key).all() + if citypes is None: + ci_type = db.session.query(CIType).filter( + CIType.type_name == key).first() + if ci_type is not None: + citypes = db.session.query(CITypeAttribute).filter_by( + type_id=ci_type.type_id).all() + if citypes is not None: + CITypeAttributeCache.set(key, citypes) + return citypes + + @classmethod + def set(cls, key, values): + citype = CITypeCache.get(key) + if citype is not None: + cache.set("CITypeAttribute::ID::%s" % citype.type_id, values) + cache.set("CITypeAttribute::Name::%s" % citype.type_name, values) + + @classmethod + def clean(cls, key): + citype = CITypeCache.get(key) + attrs = CITypeAttributeCache.get(key) + if attrs is not None and citype: + cache.delete("CITypeAttribute::ID::%s" % citype.type_id) + cache.delete("CITypeAttribute::Name::%s" % citype.type_name) \ No newline at end of file diff --git a/cmdb-api/models/ci_type_relation.py b/cmdb-api/models/ci_type_relation.py new file mode 100644 index 0000000..cde0486 --- /dev/null +++ b/cmdb-api/models/ci_type_relation.py @@ -0,0 +1,27 @@ +# -*- coding:utf-8 -*- + +from extensions import db + + +class CITypeRelation(db.Model): + __tablename__ = "ci_type_relations" + + ctr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + parent_id = db.Column(db.Integer, + db.ForeignKey("ci_types.type_id"), + primary_key=True) + parent = db.relationship( + "CIType", primaryjoin="CIType.type_id==CITypeRelation.parent_id") + child_id = db.Column(db.Integer, + db.ForeignKey("ci_types.type_id"), + primary_key=True) + child = db.relationship( + "CIType", primaryjoin="CIType.type_id==CITypeRelation.child_id") + relation_type = db.Column( + db.String(7), + db.Enum("contain", "connect", "deploy", "install", + name="relation_type"), + default="contain") + + __table_args__ = (db.UniqueConstraint("parent_id", "child_id", + name="parent_child_uniq"), ) \ No newline at end of file diff --git a/cmdb-api/models/ci_value.py b/cmdb-api/models/ci_value.py new file mode 100644 index 0000000..f99068c --- /dev/null +++ b/cmdb-api/models/ci_value.py @@ -0,0 +1,117 @@ +# -*- coding:utf-8 -*- + + +from extensions import db +from sqlalchemy import Index + + +class CIIndexValueInteger(db.Model): + __tablename__ = "index_integers" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="index_integers") + attr = db.relationship("CIAttribute", backref="index_integers") + value = db.Column(db.Integer, nullable=False) + + __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) + + +class CIIndexValueFloat(db.Model): + __tablename__ = "index_floats" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="index_floats") + attr = db.relationship("CIAttribute", backref="index_floats") + value = db.Column(db.Float, nullable=False) + + __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) + + +class CIIndexValueText(db.Model): + __tablename__ = "index_texts" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="index_texts") + attr = db.relationship("CIAttribute", backref="index_texts") + value = db.Column(db.String(128), nullable=False) + + __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) + + +class CIIndexValueDateTime(db.Model): + __tablename__ = "index_datetime" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="index_datetime") + attr = db.relationship("CIAttribute", backref="index_datetime") + value = db.Column(db.DateTime, nullable=False) + + __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) + + +class CIValueInteger(db.Model): + __tablename__ = "integers" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="integers") + attr = db.relationship("CIAttribute", backref="integers") + value = db.Column(db.Integer, nullable=False) + + +class CIValueFloat(db.Model): + __tablename__ = "floats" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="floats") + attr = db.relationship("CIAttribute", backref="floats") + value = db.Column(db.Float, nullable=False) + + +class CIValueText(db.Model): + __tablename__ = "texts" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="texts") + attr = db.relationship("CIAttribute", backref="texts") + value = db.Column(db.Text, nullable=False) + + +class CIValueDateTime(db.Model): + __tablename__ = "datetime" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="datetime") + attr = db.relationship("CIAttribute", backref="datetime") + value = db.Column(db.DateTime, nullable=False) diff --git a/cmdb-api/models/history.py b/cmdb-api/models/history.py new file mode 100644 index 0000000..8fb9e7a --- /dev/null +++ b/cmdb-api/models/history.py @@ -0,0 +1,51 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from extensions import db + + +class OperationRecord(db.Model): + __tablename__ = "records" + + record_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + uid = db.Column(db.Integer, db.ForeignKey('users.uid'), nullable=False) + timestamp = db.Column(db.DateTime, + nullable=False, + default=datetime.datetime.now()) + origin = db.Column(db.String(32)) + ticket_id = db.Column(db.String(32)) + reason = db.Column(db.Text) + + +class CIAttributeHistory(db.Model): + __tablename__ = "histories" + + h_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + operate_type = db.Column(db.String(6), db.Enum("add", "delete", "update", + name="operate_type")) + record_id = db.Column(db.Integer, + db.ForeignKey("records.record_id"), + nullable=False) + ci_id = db.Column(db.Integer, nullable=False) + attr_id = db.Column(db.Integer, nullable=False) + old = db.Column(db.Text) + new = db.Column(db.Text) + + +class CIRelationHistory(db.Model): + __tablename__ = "relation_histories" + + rh_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + operate_type = db.Column(db.String(6), + db.Enum("add", "delete", name="operate_type")) + record_id = db.Column(db.Integer, + db.ForeignKey("records.record_id"), + nullable=False) + first_ci_id = db.Column(db.Integer) + second_ci_id = db.Column(db.Integer) + relation_type = db.Column( + db.String(8), db.Enum("connect", "deploy", "install", "contain", + name="relation_type")) + relation = db.Column(db.Integer, nullable=False) diff --git a/cmdb-api/models/statis.py b/cmdb-api/models/statis.py new file mode 100644 index 0000000..64e03a4 --- /dev/null +++ b/cmdb-api/models/statis.py @@ -0,0 +1,20 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from extensions import db + + +class UrlRecord(db.Model): + + url_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + + url = db.Column(db.String(64), nullable=False) + response_time = db.Column(db.Float, nullable=False) + is_ok = db.Column(db.Boolean, default=True) + source = db.Column(db.String(32)) + remote_addr = db.Column(db.String(20)) + hits = db.Column(db.Integer) + method = db.Column(db.String(5), default="GET") + created_at = db.Column(db.DateTime, default=datetime.datetime.now()) \ No newline at end of file diff --git a/cmdb-api/permissions.py b/cmdb-api/permissions.py new file mode 100644 index 0000000..891b952 --- /dev/null +++ b/cmdb-api/permissions.py @@ -0,0 +1,9 @@ +# -*- coding:utf-8 -*- + + +from flask.ext.principal import RoleNeed, Permission + + +admin = Permission(RoleNeed('admin')) +auth = Permission(RoleNeed('authenticated')) +null = Permission(RoleNeed('null')) \ No newline at end of file diff --git a/cmdb-api/requirements/default.txt b/cmdb-api/requirements/default.txt new file mode 100644 index 0000000..6ee0a59 --- /dev/null +++ b/cmdb-api/requirements/default.txt @@ -0,0 +1,14 @@ +Flask==0.9 +Flask-Script==0.5.2 +Flask-Babel==0.8 +Flask-principal==0.3.5 +Flask-mail==0.7.4 +pymysql==0.5 +sqlalchemy==0.8.2 +Flask-sqlalchemy==0.16 +Flask-cache==0.9.2 +redis==2.7.2 +gunicorn==0.17.4 +celery==3.0.18 +flask-celery=2.4.3 +Jinja2==2.7.1 \ No newline at end of file diff --git a/cmdb-api/settings.py b/cmdb-api/settings.py new file mode 100644 index 0000000..9819a83 --- /dev/null +++ b/cmdb-api/settings.py @@ -0,0 +1,7 @@ +# -*- coding:utf-8 -*- + +## CI cache +REDIS_HOST = "127.0.0.1" +REDIS_PORT = 6379 +REDIS_DB = 0 +REDIS_MAX_CONN = 30 diff --git a/cmdb-api/tasks/__init__.py b/cmdb-api/tasks/__init__.py new file mode 100644 index 0000000..44d37d3 --- /dev/null +++ b/cmdb-api/tasks/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/cmdb-api/tasks/cmdb.py b/cmdb-api/tasks/cmdb.py new file mode 100644 index 0000000..11f5cbe --- /dev/null +++ b/cmdb-api/tasks/cmdb.py @@ -0,0 +1,30 @@ +# -*- coding:utf-8 -*- + + +import json +import time + +from flask import current_app + +from extensions import celery +from extensions import db +from lib.utils import rd +import lib.ci + + +@celery.task(name="cmdb.ci_cache", queue="cmdb_async") +def ci_cache(ci_id): + time.sleep(0.1) + db.session.close() + m = lib.ci.CIManager() + ci = m.get_ci_by_id(ci_id, need_children=False, use_master=True) + rd.delete(ci_id) + rd.add({ci_id: json.dumps(ci)}) + current_app.logger.info("%d caching.........." % ci_id) + + +@celery.task(name="cmdb.ci_delete", queue="cmdb_async") +def ci_delete(ci_id): + current_app.logger.info(ci_id) + rd.delete(ci_id) + current_app.logger.info("%d delete.........." % ci_id) diff --git a/cmdb-api/tasks/statis.py b/cmdb-api/tasks/statis.py new file mode 100644 index 0000000..0971117 --- /dev/null +++ b/cmdb-api/tasks/statis.py @@ -0,0 +1,21 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from flask import current_app + +from extensions import celery +from extensions import db +from models.statis import UrlRecord + + +@celery.task(name="statis.url_record", queue="statis_async") +def url_record(url, method, remote_addr, response_time, status_code, source): + current_app.logger.info("%s add 1" % url) + now = datetime.datetime.now() + u = UrlRecord(url=url, response_time=response_time, is_ok=1, + source="default", hits=1, method=method, created_at=now, + remote_addr=remote_addr) + db.session.add(u) + db.session.commit() \ No newline at end of file diff --git a/cmdb-api/templates/search.xml b/cmdb-api/templates/search.xml new file mode 100644 index 0000000..e30f791 --- /dev/null +++ b/cmdb-api/templates/search.xml @@ -0,0 +1,27 @@ + + + {{ numfound }} + {{ page }} + + {% for ci in result %} + + {% for k, v in ci.items() %} + {% if not k.startswith('_') %} + {% for item in v | convert_to_list %} + {{ item }} + {% endfor %} + {% endif %} + {% endfor %} + + {% endfor %} + + + {% for k,v in facet.items() %} + + {% for item in v %} + {{ item[1] }} + {% endfor %} + + {% endfor %} + + \ No newline at end of file diff --git a/cmdb-api/templates/search_tidy.xml b/cmdb-api/templates/search_tidy.xml new file mode 100644 index 0000000..52832a0 --- /dev/null +++ b/cmdb-api/templates/search_tidy.xml @@ -0,0 +1,19 @@ + + + {{ code }} + + {% for k, v in ret.items() %} + + {% for ci in v %} + + + {% for item in ci|convert_to_list %} + {{ item }} + {% endfor %} + + + {% endfor %} + + {% endfor %} + + \ No newline at end of file From 7fc9e2eb05efa8d75637ac2fb7489699a5ebb9bf Mon Sep 17 00:00:00 2001 From: pycook Date: Tue, 29 Dec 2015 10:39:29 +0800 Subject: [PATCH 003/159] config update --- cmdb-api/config-sample.cfg | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/cmdb-api/config-sample.cfg b/cmdb-api/config-sample.cfg index fb1eba7..b3c3e65 100644 --- a/cmdb-api/config-sample.cfg +++ b/cmdb-api/config-sample.cfg @@ -12,10 +12,6 @@ SQLALCHEMY_ECHO = False SQLALCHEMY_POOL_SIZE = 10 SQLALCHEMY_POOL_RECYCLE = 300 -# # upload -UPLOADS_DEFAULT_DEST = './static/' -UPLOADS_DEFAULT_URL = '/static' - # # cache CACHE_TYPE = "redis" CACHE_REDIS_HOST = "127.0.0.1" @@ -44,22 +40,12 @@ MAIL_USERNAME = '' MAIL_PASSWORD = '' DEFAULT_MAIL_SENDER = '' -# # LDAP -LDAP_SERVER = 'ldap://' -LDAP_DOMAIN = '' # # queue CELERY_RESULT_BACKEND = "redis://127.0.0.1//" BROKER_URL = 'redis://127.0.0.1//' BROKER_VHOST = '/' -# # zookeeper -ZK_SERVERS = "127.0.0.1:2181" - -# # assets -ASSETS_DEBUG = False - -# application # # pagination PER_PAGE_COUNT_RANGE = (10, 25, 50, 100) From 1edd1ee71a0a911f8059f34dba88a4df08b228e5 Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 09:39:30 +0800 Subject: [PATCH 004/159] update gitignore --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index 30b7fe8..3953a64 100755 --- a/.gitignore +++ b/.gitignore @@ -5,10 +5,16 @@ data logs */logs/* *.sql +deploy.sh +logs/* test/* tools/* +cmdb_agent/* *.log *.orig *.zip *.swp +config.cfg *.tar.gz +core/special.py +lib/special From 2d8264ab6fa7669ac24316b51e2da273dcde8ff7 Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 09:40:47 +0800 Subject: [PATCH 005/159] v1 vsersion --- __init__.py | 126 ++++++ cmdb_api.md | 637 +++++++++++++++++++++++++++++++ cmdb_query_api.md | 99 +++++ codeLineCnt.py | 15 + command/__init__.py | 1 + config-sample.cfg | 62 +++ core/__init__.py | 11 + core/account.py | 98 +++++ core/attribute.py | 145 +++++++ core/audit.py | 100 +++++ core/ci.py | 189 +++++++++ core/ci_relation.py | 70 ++++ core/ci_type.py | 89 +++++ core/ci_type_relation.py | 55 +++ core/history.py | 116 ++++++ core/statis.py | 12 + extensions.py | 16 + gunicornserver.py | 72 ++++ lib/__init__.py | 4 + lib/account.py | 145 +++++++ lib/attribute.py | 167 ++++++++ lib/audit.py | 168 ++++++++ lib/auth.py | 68 ++++ lib/ci.py | 677 +++++++++++++++++++++++++++++++++ lib/ci_type.py | 315 +++++++++++++++ lib/const.py | 99 +++++ lib/decorator.py | 74 ++++ lib/exception.py | 17 + lib/history.py | 75 ++++ lib/mail.py | 86 +++++ lib/query_sql.py | 107 ++++++ lib/search.py | 348 +++++++++++++++++ lib/template/__init__.py | 1 + lib/template/filters.py | 9 + lib/utils.py | 74 ++++ lib/value.py | 170 +++++++++ manage.py | 77 ++++ models/__init__.py | 24 ++ models/account.py | 230 +++++++++++ models/attribute.py | 87 +++++ models/ci.py | 20 + models/ci_relation.py | 26 ++ models/ci_type.py | 128 +++++++ models/ci_type_relation.py | 27 ++ models/ci_value.py | 117 ++++++ models/history.py | 51 +++ models/statis.py | 20 + permissions.py | 9 + requirements/default.txt | 14 + settings.py | 7 + tasks/__init__.py | 1 + tasks/cmdb.py | 30 ++ tasks/statis.py | 21 + templates/ci_audit_notify.html | 51 +++ templates/search.xml | 27 ++ templates/search_tidy.xml | 19 + 56 files changed, 5503 insertions(+) create mode 100644 __init__.py create mode 100644 cmdb_api.md create mode 100644 cmdb_query_api.md create mode 100644 codeLineCnt.py create mode 100644 command/__init__.py create mode 100644 config-sample.cfg create mode 100644 core/__init__.py create mode 100644 core/account.py create mode 100644 core/attribute.py create mode 100644 core/audit.py create mode 100644 core/ci.py create mode 100644 core/ci_relation.py create mode 100644 core/ci_type.py create mode 100644 core/ci_type_relation.py create mode 100644 core/history.py create mode 100644 core/statis.py create mode 100644 extensions.py create mode 100644 gunicornserver.py create mode 100644 lib/__init__.py create mode 100644 lib/account.py create mode 100644 lib/attribute.py create mode 100644 lib/audit.py create mode 100644 lib/auth.py create mode 100644 lib/ci.py create mode 100644 lib/ci_type.py create mode 100644 lib/const.py create mode 100644 lib/decorator.py create mode 100644 lib/exception.py create mode 100644 lib/history.py create mode 100644 lib/mail.py create mode 100644 lib/query_sql.py create mode 100644 lib/search.py create mode 100644 lib/template/__init__.py create mode 100644 lib/template/filters.py create mode 100644 lib/utils.py create mode 100644 lib/value.py create mode 100644 manage.py create mode 100644 models/__init__.py create mode 100644 models/account.py create mode 100644 models/attribute.py create mode 100644 models/ci.py create mode 100644 models/ci_relation.py create mode 100644 models/ci_type.py create mode 100644 models/ci_type_relation.py create mode 100644 models/ci_value.py create mode 100644 models/history.py create mode 100644 models/statis.py create mode 100644 permissions.py create mode 100644 requirements/default.txt create mode 100644 settings.py create mode 100644 tasks/__init__.py create mode 100644 tasks/cmdb.py create mode 100644 tasks/statis.py create mode 100644 templates/ci_audit_notify.html create mode 100644 templates/search.xml create mode 100644 templates/search_tidy.xml diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..a4d8219 --- /dev/null +++ b/__init__.py @@ -0,0 +1,126 @@ +# encoding=utf-8 + +import os +import logging +from logging.handlers import SMTPHandler +from logging.handlers import TimedRotatingFileHandler + +from flask import Flask +from flask import request +from flask import g +from flask.ext.babel import Babel +from flask.ext.principal import identity_loaded + +from extensions import db +from extensions import mail +from extensions import cache +from extensions import celery +from core import attribute +from core import citype +from core import cityperelation +from core import cirelation +from core import ci +from core import history +from core import account +from core import special +from models.account import User +from lib.template import filters + + +APP_NAME = "CMDB-API" + +MODULES = ( + (attribute, "/api/v0.1/attributes"), + (citype, "/api/v0.1/citypes"), + (cityperelation, "/api/v0.1/cityperelations"), + (cirelation, "/api/v0.1/cirelations"), + (ci, "/api/v0.1/ci"), + (history, "/api/v0.1/history"), + (account, "/api/v0.1/accounts"), + (special, ""), +) + + +def make_app(config=None, modules=None): + modules = modules + if not modules: + modules = MODULES + app = Flask(APP_NAME) + app.config.from_pyfile(config) + configure_extensions(app) + configure_i18n(app) + configure_identity(app) + configure_blueprints(app, modules) + configure_logging(app) + configure_template_filters(app) + return app + + +def configure_extensions(app): + db.app = app + celery.init_app(app) + db.init_app(app) + mail.init_app(app) + cache.init_app(app) + celery.init_app(app) + + +def configure_i18n(app): + babel = Babel(app) + + @babel.localeselector + def get_locale(): + accept_languages = app.config.get('ACCEPT_LANGUAGES', ['en', 'zh']) + return request.accept_languages.best_match(accept_languages) + + +def configure_modules(app, modules): + for module, url_prefix in modules: + app.register_module(module, url_prefix=url_prefix) + + +def configure_blueprints(app, modules): + for module, url_prefix in modules: + app.register_blueprint(module, url_prefix=url_prefix) + + +def configure_identity(app): + + @identity_loaded.connect_via(app) + def on_identity_loaded(sender, identity): + g.user = User.query.from_identity(identity) + + +def configure_logging(app): + hostname = os.uname()[1] + mail_handler = SMTPHandler( + app.config['MAIL_SERVER'], + app.config['DEFAULT_MAIL_SENDER'], + app.config['ADMINS'], + '[%s] CMDB error' % hostname, + ( + app.config['MAIL_USERNAME'], + app.config['MAIL_PASSWORD'], + ) + ) + mail_formater = logging.Formatter( + "%(asctime)s %(levelname)s %(pathname)s %(lineno)d\n%(message)s") + mail_handler.setFormatter(mail_formater) + mail_handler.setLevel(logging.ERROR) + if not app.debug: + app.logger.addHandler(mail_handler) + formatter = logging.Formatter( + "%(asctime)s %(levelname)s %(pathname)s %(lineno)d - %(message)s") + log_file = app.config['LOG_PATH'] + file_handler = TimedRotatingFileHandler( + log_file, when='d', interval=1, backupCount=7) + file_handler.setLevel(getattr(logging, app.config['LOG_LEVEL'])) + file_handler.setFormatter(formatter) + app.logger.addHandler(file_handler) + app.logger.setLevel(getattr(logging, app.config['LOG_LEVEL'])) + + +def configure_template_filters(app): + for name in dir(filters): + if callable(getattr(filters, name)): + app.add_template_filter(getattr(filters, name)) diff --git a/cmdb_api.md b/cmdb_api.md new file mode 100644 index 0000000..c4e237f --- /dev/null +++ b/cmdb_api.md @@ -0,0 +1,637 @@ +# CMDB API文档 + +## 状态返回码的定义 +* 200: 成功 +* 400:失败 +* 401:未授权 +* 404:url not found +* 408:超时 +* 410:资源删除 +* 500: 服务器错误 + + +## 用户接口 + +### CI搜索接口 + +* GET `/api/v0.1/ci/s` +* 参数 + * `string:_type` 搜索的ci_type,多个用分号隔开, 例如: _type:(server;vservser) + * `string:q` 搜索表达式, 例如`q=hostname:cmdb*` + * `string:fl` 返回字段(id, attr_name, attr_alias均可),英文半角逗号分隔 + * `string:ret_key` 返回字段类型 `Enum("id", "name", "alias")` 默认 `name` + * `count` 指定一次返回CI数 + * `facet` 属性字段,逗号分隔,返回属性字段对应的所有值 + +* 搜索表达式: + * 简单的字符串 + * `attribute:value` 指定属性搜索, `attribute`可以是`id`,`attr_name`和`attr_alias` + * 以上的组合,逗号分隔 + +* 组合查询支持 + * `AND`关系-`默认关系` + * `OR`关系 - eg.`-hostname:cmdb*`、 + * `NOT`关系-属性字段前加`~`eg. `~hostname:cmdb*` + * `IN`查询. eg. `hostname:(cmdb*;cmdb-web*)` 小括号, 分号分隔 + * `RANGE`查询. eg. `hostname:[cmdb* _TO_ cmdb-web*]` `_TO_`分隔 + * `COMPARISON`查询. eg. `cpu_core_num:>5` 支持`>, >=, <, <=` + +## api key 认证 + +每个用户会自动生成一个 `api key` 和 一个`secret`, 通过API接口使用的时候,需要提供一个参数 `_key`值为您的`api key`, 以及参数`_secret`值为除`_key`以外的参数,按照**参数名的字典序**排列,并连接到`url path` + `secret`之后的`sha1`**十六进制**值。 + + +## 管理接口 + +### Attribute管理接口 +* GET `/api/v0.1/attributes` 列出所有属性 + * param + * `string:q` 属性名称或者别名,允许为空 + * return + + ``` + { + "numfound": 1, + "attributes": [ + { + "attr_name": "idc", + "is_choice": true, + "choice_value": ["南汇", "欧阳路"], + "attr_id": 1, + "is_multivalue": false, + "attr_alias": "IDC", + "value_type": "text", + "is_uniq": false + } + } + ``` + + * error 无 + + +* GET `/api/v0.1/attributes/`、 `/api/v0.1/attributes/` 根据属性名称、别名或ID获取属性 + * param + * `string:attr_name` 属性名称或别名 + * `int:attr_id` 属性ID + * `attr_id`和`attr_name`选其一 + * return + + ``` + { + "attribute": { + "attr_name": "idc", + "is_choice": true, + "choice_value": ["南汇", "欧阳路"], + "attr_id": 1, + "is_multivalue": false, + "attr_alias": "IDC", + "value_type": "text", + "is_uniq": false + }, + } + ``` + + * error + * `404` 找不到属性 + +* POST `/api/v0.1/attributes` 增加新的属性 + * param + * `string:attr_name` 属性名称 + * `string:attr_alias` 属性别名,可为空,为空时等于`attr_name` + * `boolean:choice_value` 若属性有预定义值, 则不能为空 + * `boolean:is_multivalue` 属性是否允许多值,默认`False` + * `boolean:is_uniq` 属性是否唯一,默认`False` + * `string:value_type` 属性值类型, `Enum("text", "int", "float", "date")`, 默认`text` + + * return + + ``` + { + "attr_id":1 + } + ``` + + * error + * `500` 属性已存在 + * `500` 属性增加失败 + + * PUT `/api/v0.1/attributes/` 修改属性 + * param + * `string:attr_name` 属性名称 + * `string:attr_alias` 属性别名,可为空,为空时等于`attr_name` + * `boolean:choice_value` 若属性有预定义值, 则不能为空 + * `boolean:is_multivalue` 属性是否允许多值,值为0或者1,默认`False` + * `boolean:is_uniq` 属性是否唯一,值为0或者1,默认`False` + * `string:value_type` 属性值类型, `Enum("text", "int", "float", "date")`, 默认`text` + + * return + + ``` + { + "attr_id":1 + } + ``` + + * error + * `500` 属性已存在 + * `500` 属性增加失败 + + * DELETE `/api/v0.1/attributes/` 根据ID删除属性 + * param + * `int:attr_id` 属性ID + * return + + ``` + { + "message":"attribute %s deleted" % attr_name + } + ``` + + * error + * `404` 属性不存在 + * `500` 删除属性失败 + +#### CIType属性管理 + + * GET `/api/v0.1/attributes/citype/` 根据type_id查询固有属性列表 + * return + + ``` + { + "attributes": [ + { + "attr_name": "idc", + "is_choice": true, + "choice_value": ["南汇", "欧阳路"], + "attr_id": 1, + "is_multivalue": false, + "attr_alias": "IDC", + "value_type": "text", + "is_uniq": false + }, + ], + "type_id": 1, + } + ``` + +* POST `/api/v0.1/attributes/citype/` 根据`attr_id`增加CIType的属性 + * param + * `string:attr_id` `,`分隔的`attr_id` + * `int:is_required` 0或者1 + + * return + + ``` + { + "attributes":[1, 2, 3] + } + ``` + + * error + * `404` CIType不存在 + * `404` 属性不存在 + * `500` 增加失败 + +* DELETE `/api/v0.1/attributes/citype/` 删除CIType的属性 + * param + * `string:attr_id` `,`分隔的`attr_id` + + * return + + ``` + { + "attributes":[1, 2, 3] + } + ``` + + * error + * `404` CIType不存在 + * `404` 属性不存在 + * `500` 增加失败 + + +### CIType管理接口 + +* `/api/v0.1/citypes` 列出所有CI类型 + * param `string:type_name` 类型名称,允许为空 + * return + + ``` + { + "numfound": 2, + "citypes": [ + { + "uniq_key": "sn", + "type_name": "物理机", + "type_id": 1, + "enabled": True, + "icon_url": "" + }, + { + "uniq_key": "uuid", + "type_name": "KVM", + "type_id": 2, + "enabled": True, + "icon_url": "" + } + ], + } + ``` + * error 无 + +* GET `/api/v0.1/citypes/query` 查询CI类型 + * param `string:type` 可以是type_id, type_name, type_alias + * return + + ``` + { + "citype": { + "type_name": "software", + "type_id": 4, + "icon_url": "", + "type_alias": "\u8f6f\u4ef6", + "enabled": true, + "uniq_key": 21 + } + } + ``` + * error + * `400` message=输入参数缺失 + * `404` message='citype is not found' + +* POST `/api/v0.1/citypes` 增加新CIType + * param (下列参数任意一个或多个) + * `string:type_name` CIType名称 + * `string:type_alias` 类型别名,可为空 + * `int:_id` 唯一属性ID + * `string:unique` 唯一属性名称 + * `_id`和`unique`只能二选一 + * `icon_url` + * `enabled` 0/1 + * return + + ``` + { + "type_id": 2 + } + ``` + + * error + * `400` message=输入参数缺失 + * `500` message=CIType已存在 + * `500` message=唯一属性不存在 + * `500` message=唯一属性不是唯一的 + +* PUT `/api/v0.1/citypes/` 修改CIType + * param (下列参数任意一个或多个) + * `string:type_name` CIType名称 + * `string:type_alias` 类型别名,可为空 + * `int:_id` 唯一属性ID + * `string:unique` 唯一属性名称 + * `_id`和`unique`只能二选一 + * `icon_url` + * `enabled` 0/1 + * return + + ``` + { + "type_id": 2 + } + ``` + + * error + * `400` message=输入参数缺失 + * `500` message=CIType已存在 + * `500` message=唯一属性不存在 + * `500` message=唯一属性不是唯一的 + +* GET/POST `/api/v0.1/citypes/enable/` 修改CIType + * param + * `enabled` 0 or 1 + * return + + ``` + { + "type_id": 2 + } + ``` + + * error + * `500` 设置失败 + * `404` CIType不存在 + +* DELETE `/api/v0.1/citypes/` 根据ID删除CIType + * return + + ``` + { + "message":"ci type %s deleted" % type_name + } + ``` + * error + * `500` 删除失败 + * `404` CIType不存在 + +### CITypeRelation管理接口 + +* GET `/api/v0.1/cityperelations/types` 列出所有CIType关系类型名 + * return + + ``` + { + "relation_types": ["连接", "位置", "附属", "部署"], + } + ``` + * error 无 + +* GET `/api/v0.1/cityperelations//children` 返回所有child id + * return + + ``` + { + "children": [ + { + "ctr_id": 1, + "type_name": "project", + "type_id": 2, + "icon_url": "", + "type_alias": "应用", + "enabled": true, + "uniq_key": 3 + } + ] + } + ``` + * error 无 + +* GET `/api/v0.1/cityperelations//parents` 返回parent id + * return + + ``` + { + "parents": [{'parent':1, 'relaltion_type': 'containes', "ctr_id":1}], + } + ``` + * error 无 + + +* POST `/api/v0.1/cityperelations//` 增加CIType关系 + * param + * `string:relation_type` 类型名称 + * return + + ``` + { + "ctr_id":1 + } + ``` + * error + * `500` 增加失败 + * `404` CIType不存在 + +* DELETE `/api/v0.1/cityperelations/` 根据`ctr_id`删除CIType关系 + * return + + ``` + { + "message":"CIType relation %s deleted" % type + } + ``` + * error + * `500` 删除失败 + * `404` 关系不存在 + + + +### CI管理接口 + +* GET `/api/v0.1/ci/type/` 查询CIType的所有CI,一次返回25条记录 + * param + * `string:fields` 返回属性名、id,逗号隔开 + * `string:ret_key` 返回属性key,默认'name',还可是'id', 'alias' + * `int:page` 页码 + + * return + + ``` + { + "numfound": 1, + "type_id":1, + "page": 1, + "cis": [ + { + "ci_type": "KVM", + "_type": 1, + "nic": [ + 2 + ], + "hostname": "xxxxxx", + "_unique": "xxxxxx", + "_id": 1 + } + ] + } + ``` + * erorr + * `404` CIType不存在 + +* GET `/api/v0.1/ci/` 查询CI + + * return + + ``` + { + "ci": { + "ci_type": "KVM", + "_type": 1, + "nic": [2], + "hostname": "xxxxx", + "_unique": "xxxxx", + "_id": 1 + }, + "ci_id": 1 + } + ``` + * erorr 无 + + + +* POST `/api/v0.1/ci` 增加CI + * param + * `string:ci_type` CIType name 或者id + * `string:_no_attribute_policy` 当添加不存在的attribute时的策略, 默认`ignore` + * 其他url参数`k=v`: `k` 为属性名(id或别名亦可), `v`为对应的值 + * 此CIType的`unique`字段必须包含在url参数中 + * return + + ``` + { + "ci_id":1, + } + ``` + * erorr + * `500` 添加失败 + +* PUT `/api/v0.1/ci` 修改CI + * param + * `string:ci_type` CIType name 或者id + * `string:_no_attribute_policy` 当添加不存在的attribute时的策略, 默认`ignore` + * 其他url参数`k=v`: `k` 为属性名(id或别名亦可), `v`为对应的值 + * 此CIType的`unique`字段必须包含在url参数中 + * return + + ``` + { + "ci_id":1, + } + ``` + * erorr + * `500` 添加失败 + +* DELETE `/api/v0.1/ci/` 删除ci + * return + + ``` + { + "message":"ok", + } + ``` + * erorr + * `500` 删除失败 + + +## CIRelaiton管理接口 + +* GET `/api/v0.1/cirelations/types` 列出所有CI关系类型名 + * return + + ``` + { + "relation_types": ["connect", "install", "deploy", "contain"], + } + ``` + * error 无 + +* GET `/api/v0.1/cirelations//second_cis` 返回所有second id + * return + + ``` + { + "numfound": 1, + "second_cis": [ + { + "ci_type": "project", + "ci_type_alias": "应用", + "_type": 2, + "_id": 18, + "project_name": "cmdb-api" + } + ] + } + ``` + * error 无 + +* GET `/api/v0.1/cirelations//first_cis` 返回first ci id + * return + + ``` + { + "first_cis": [ + { + "ci_type": "project", + "ci_type_alias": "应用", + "_type": 2, + "_id": 18, + "project_name": "cmdb-api" + } + ], + "numfound": 1 + } + ``` + * error 无 + + +* POST `/api/v0.1/cirelations//` 增加CI关系 + * param + * `int: more` more实例 + * `string:relation_type` 类型名称 + * return + + ``` + { + "cr_id":1 + } + ``` + * error + * `500` 增加失败 + * `404` CI不存在 + +* DELETE `/api/v0.1/cirelations/delete/` 根据`cr_id`删除CI关系 + * return + + ``` + { + "message":"CIType relation %s deleted" % type + } + ``` + * error + * `500` 删除失败 + * `404` 关系不存在 + + + +## 历史记录管理接口 +* GET `/api/v0.1/history/record` 查询历史记录 + * param + * `int: page` + * `string: username` 变更用户 + * `string: start` 变更开始时间 + * `string: end` 变更结束时间 + * return + + ``` + { + "username": "", + "start": "2014-12-31 14:57:43", + "end": "2015-01-07 14:57:43", + "records": [ + { + "origin": null, + "attr_history": [], + "timestamp": "2015-01-01 22:12:39", + "reason": null, + "rel_history": { + "add": 1 + }, + "user": 1, + "record_id": 1234, + "ticket_id": null + } + ] + } + ``` + * error 无 + + * GET `/api/v0.1/history/` 历史记录详情 + * return + + ``` + { + "username": "pycook", + "timestamp": "2015-01-02 20:21:16", + "rel_history": { + "add": [ + [ + 123, + "deploy", + 234 + ] + ], + "delete": [] + }, + "attr_history": {} + } + ``` + + * error + * `404` 该记录不存在 diff --git a/cmdb_query_api.md b/cmdb_query_api.md new file mode 100644 index 0000000..ed51597 --- /dev/null +++ b/cmdb_query_api.md @@ -0,0 +1,99 @@ +# CMDB查询 API文档 + + + +## 用户接口 + +### CI通用搜索接口 + +* GET `/api/v0.1/ci/s` +* 参数 + * `string:_type` 搜索的ci_type,多个用分号隔开, 例如: _type:(docker;kvm) + * `string:q` 搜索表达式, 例如`q=hostname:cmdb*` + * `string:fl` 返回字段(id, attr_name, attr_alias均可),英文半角逗号分隔 + * `string:ret_key` 返回字段类型 `Enum("id", "name", "alias")` 默认 `name` + * `count` 指定一次返回CI数 + * `facet` 属性字段,逗号分隔,返回属性字段对应的所有值 + * `wt` 返回的数据格式,默认为`json`, 可选参数为`xml` + +* 搜索表达式: + * 简单的字符串 + * `attribute:value` 指定属性搜索, `attribute`可以是`id`,`attr_name`和`attr_alias` + * 以上的组合,逗号分隔 + +* 组合查询支持 + * `AND`关系-`默认关系` + * `OR`关系 - eg.`-hostname:cmdb*`、 + * `NOT`关系-属性字段前加`~`eg. `~hostname:cmdb*` + * `IN`查询. eg. `hostname:(cmdb*;cmdb-web*)` 小括号, 分号分隔 + * `RANGE`查询. eg. `hostname:[cmdb* _TO_ cmdb-web*]` `_TO_`分隔 + * `COMPARISON`查询. eg. `cpu_count:>5` 支持`>, >=, <, <=` + +* 返回结果 + * 搜索表达式 `/api/v0.1/ci/s?q=_type:kvm,status:在线,idc:南汇,private_ip:10.1.1.1*&page=1&fl=hostname,private_ip&facet=private_ip&count=1` + * 返回数据(默认json) + + ``` + { + facet: { + private_ip: [ + [ + "10.1.1.11", + 1, + "private_ip" + ], + [ + "10.1.1.12", + 1, + "private_ip" + ], + [ + "10.1.1.13", + 1, + "private_ip" + ] + ] + }, + total: 1, + numfound: 3, + result: [ + { + ci_type: "kvm", + _type: 8, + _id: 3213, + hostname: "xxx11", + private_ip: [ + "10.1.1.11" + ] + }, + { + ci_type: "kvm", + _type: 8, + _id: 123232, + hostname: "xxx12", + private_ip: [ + "10.1.1.12" + ] + }, + { + ci_type: "kvm", + _type: 8, + _id: 123513, + hostname: "xxx13", + private_ip: [ + "10.1.1.13" + ] + } + ], + counter: { + kvm: 3 + }, + page: 1 + } +``` + + +### CI专用搜索接口 +##### 根据需求实现 + + \ No newline at end of file diff --git a/codeLineCnt.py b/codeLineCnt.py new file mode 100644 index 0000000..247aa7d --- /dev/null +++ b/codeLineCnt.py @@ -0,0 +1,15 @@ +import os +from collections import defaultdict + +d = defaultdict(int) # value is 'int' + +for dirpath, dirnames, filenames in os.walk('.'): + for filename in filenames: + if dirpath.endswith("tools"): + continue + path = os.path.join(dirpath, filename) + ext = os.path.splitext(filename)[1] + d[ext] += len(list(open(path))) + +for ext, n_lines in d.items(): + print ext, n_lines diff --git a/command/__init__.py b/command/__init__.py new file mode 100644 index 0000000..44d37d3 --- /dev/null +++ b/command/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/config-sample.cfg b/config-sample.cfg new file mode 100644 index 0000000..88177f4 --- /dev/null +++ b/config-sample.cfg @@ -0,0 +1,62 @@ +# coding: utf-8 +# common + +DEBUG = True +SECRET_KEY = 'dsfdjsf@3213!@JKJWL' +HOST = 'http://127.0.0.1:5000' + +# # database +SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://mysqluser:password@127.0.0.1:3306/cmdb?charset=utf8' + +SQLALCHEMY_ECHO = False +SQLALCHEMY_POOL_SIZE = 10 +SQLALCHEMY_POOL_RECYCLE = 300 + +# # cache +CACHE_TYPE = "redis" +CACHE_REDIS_HOST = "127.0.0.1" +CACHE_REDIS_PORT = 6379 +CACHE_KEY_PREFIX = "CMDB-API" +CACHE_DEFAULT_TIMEOUT = 3000 + +# # CI cache +REDIS_HOST = "127.0.0.1" +REDIS_PORT = 6379 +REDIS_DB = 0 +REDIS_MAX_CONN = 30 + + +# # i18n +ACCEPT_LANGUAGES = ['en', 'zh'] +BABEL_DEFAULT_LOCALE = 'zh' +BABEL_DEFAULT_TIMEZONE = 'Asia/Shanghai' + +# # log +LOG_PATH = './logs/app.log' + +LOG_LEVEL = 'DEBUG' +ADMINS = ('@') + +# # mail +MAIL_SERVER = '' +MAIL_PORT = 25 +MAIL_USE_TLS = False +MAIL_USE_SSL = False +MAIL_DEBUG = True +MAIL_USERNAME = '' +MAIL_PASSWORD = '' +DEFAULT_MAIL_SENDER = '' + + +# # queue +CELERY_RESULT_BACKEND = "redis://127.0.0.1//" +BROKER_URL = 'redis://127.0.0.1//' +BROKER_VHOST = '/' + + +# # pagination +PER_PAGE_COUNT_RANGE = (10, 25, 50, 100) +DEFAULT_PAGE_COUNT = 25 + + +WHITE_LIST = ["127.0.0.1"] diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..99d8104 --- /dev/null +++ b/core/__init__.py @@ -0,0 +1,11 @@ +# -*- coding:utf-8 -*- + + +from attribute import attribute +from ci_type import citype +from ci_type_relation import cityperelation +from ci_relation import cirelation +from ci import ci +from history import history +from account import account +from special import special \ No newline at end of file diff --git a/core/account.py b/core/account.py new file mode 100644 index 0000000..1a1ae82 --- /dev/null +++ b/core/account.py @@ -0,0 +1,98 @@ +# -*- coding:utf-8 -*- + + +from flask import Blueprint +from flask import request + +from flask import g +from flask import abort +from flask import jsonify + +from models import row2dict +from lib.account import AccountManager +from lib.auth import auth_with_key + + +account = Blueprint('account', __name__) + + +@account.route("/", methods=["GET"]) +@auth_with_key +def get_user(uid=None): + manager = AccountManager() + user = manager.get_user_by_uid(uid) + if user: + return jsonify(rolenames=user.rolenames, user=row2dict(user)) + else: + return jsonify(user=None) + + +@account.route("", methods=["POST"]) +@auth_with_key +def create_user(): + manager = AccountManager() + params = {} + for k, v in request.values.iteritems(): + params[k] = v + user = manager.create_user(**params) + return jsonify(user=row2dict(user)) + + +@account.route("/", methods=["PUT"]) +@auth_with_key +def update_user(uid=None): + manager = AccountManager() + params = {} + for k, v in request.values.iteritems(): + params[k] = v + ret, res = manager.update_user(uid, **params) + if not ret: + abort(res[0], res[1]) + return jsonify(user=row2dict(res), rolenames=res.rolenames) + + +@account.route("/", methods=["DELETE"]) +@auth_with_key +def delete_user(uid=None): + manager = AccountManager() + ret, res = manager.delete_user(uid) + if not ret: + abort(res[0], res[1]) + return jsonify(uid=uid) + + +@account.route("/validate", methods=["POST"]) +@auth_with_key +def validate(): + username = request.values.get("username") + password = request.values.get("password") + manager = AccountManager() + user, authenticated = manager.validate(username, password) + if user and not authenticated: + return jsonify(code=401, user=row2dict(user), rolenames=user.rolenames) + elif not user: + return jsonify(code=404, message="user is not existed") + return jsonify(code=200, user=row2dict(user), rolenames=user.rolenames) + + +@account.route("/key", methods=["PUT"]) +@auth_with_key +def update_key(): + manager = AccountManager() + ret, res = manager.reset_key(g.user.uid) + if not ret: + abort(res[0], res[1]) + return jsonify(user=row2dict(res), rolenames=res.rolenames) + + +@account.route("/password", methods=["PUT"]) +@auth_with_key +def update_password(): + manager = AccountManager() + old = request.values.get("password") + new = request.values.get("new_password") + confirm = request.values.get("confirm") + ret, res = manager.update_password(g.user.uid, old, new, confirm) + if not ret: + abort(res[0], res[1]) + return jsonify(user=row2dict(res), rolenames=res.rolenames) diff --git a/core/attribute.py b/core/attribute.py new file mode 100644 index 0000000..edff09e --- /dev/null +++ b/core/attribute.py @@ -0,0 +1,145 @@ +# -*- coding:utf-8 -*- + + +from flask import jsonify +from flask import request +from flask import Blueprint +from flask import abort +from flask import current_app + +from lib.attribute import AttributeManager +from lib.ci_type import CITypeAttributeManager +from lib.decorator import argument_required +from lib.exception import InvalidUsageError +from lib.auth import auth_with_key + +attribute = Blueprint("attribute", __name__) + + +@attribute.route("", methods=["GET"]) +def get_attributes(): + q = request.values.get("q") + attrs = AttributeManager().get_attributes(name=q) + count = len(attrs) + return jsonify(numfound=count, attributes=attrs) + + +@attribute.route("/", methods=["GET"]) +@attribute.route("/", methods=["GET"]) +def get_attribute(attr_name=None, attr_id=None): + attr_manager = AttributeManager() + attr_dict = None + if attr_name is not None: + attr_dict = attr_manager.get_attribute_by_name(attr_name) + if attr_dict is None: + attr_dict = attr_manager.get_attribute_by_alias(attr_name) + elif attr_id is not None: + attr_dict = attr_manager.get_attribute_by_id(attr_id) + if attr_dict is not None: + return jsonify(attribute=attr_dict) + abort(404, "attribute not found") + + +@attribute.route("", methods=["POST"]) +@auth_with_key +def create_attribute(): + with argument_required("attr_name"): + attr_name = request.values.get("attr_name") + current_app.logger.info(attr_name) + attr_alias = request.values.get("attr_alias", attr_name) + choice_value = request.values.get("choice_value") + is_multivalue = request.values.get("is_multivalue", False) + is_uniq = request.values.get("is_uniq", False) + is_index = request.values.get("is_index", False) + value_type = request.values.get("value_type", "text") + try: + is_multivalue = int(is_multivalue) + is_uniq = int(is_uniq) + is_index = int(is_index) + except ValueError: + raise InvalidUsageError("argument format is error") + attr_manager = AttributeManager() + kwargs = {"choice_value": choice_value, "is_multivalue": is_multivalue, + "is_uniq": is_uniq, "value_type": value_type, + "is_index": is_index} + ret, res = attr_manager.add(attr_name, attr_alias, **kwargs) + if not ret: + return abort(500, res) + return jsonify(attr_id=res) + + +@attribute.route("/", methods=["PUT"]) +@auth_with_key +def update_attribute(attr_id=None): + with argument_required("attr_name"): + attr_name = request.values.get("attr_name") + attr_alias = request.values.get("attr_alias", attr_name) + choice_value = request.values.get("choice_value") + is_multivalue = request.values.get("is_multivalue", False) + is_uniq = request.values.get("is_uniq", False) + value_type = request.values.get("value_type", "text") + try: + is_multivalue = int(is_multivalue) + is_uniq = int(is_uniq) + except ValueError: + raise InvalidUsageError("argument format is error") + attr_manager = AttributeManager() + kwargs = {"choice_value": choice_value, "is_multivalue": is_multivalue, + "is_uniq": is_uniq, "value_type": value_type} + ret, res = attr_manager.update(attr_id, attr_name, + attr_alias, **kwargs) + if not ret: + return abort(500, res) + return jsonify(attr_id=res) + + +@attribute.route("/", methods=["DELETE"]) +@auth_with_key +def delete_attribute(attr_id=None): + attr_manager = AttributeManager() + res = attr_manager.delete(attr_id) + return jsonify(message="attribute {0} deleted".format(res)) + + +@attribute.route("/citype/", methods=["GET"]) +def get_attributes_by_type(type_id=None): + manager = CITypeAttributeManager() + from models.cmdb import CITypeCache, CIAttributeCache + + t = CITypeCache.get(type_id) + if not t: + return abort(400, "CIType {0} is not existed".format(type_id)) + uniq_id = t.uniq_id + unique = CIAttributeCache.get(uniq_id).attr_name + return jsonify(attributes=manager.get_attributes_by_type_id(type_id), + type_id=type_id, uniq_id=uniq_id, unique=unique) + + +@attribute.route("/citype/", methods=["POST"]) +@auth_with_key +def create_attributes_to_citype(type_id=None): + with argument_required("attr_id"): + attr_ids = request.values.get("attr_id", "") + is_required = request.values.get("is_required", False) + attr_id_list = attr_ids.strip().split(",") + if "" in attr_id_list: + attr_id_list.remove("") + attr_id_list = map(int, attr_id_list) + try: + is_required = int(is_required) + except ValueError: + abort(500, "argument format is error") + manager = CITypeAttributeManager() + manager.add(type_id, attr_id_list, is_required=is_required) + return jsonify(attributes=attr_id_list) + + +@attribute.route("/citype/", methods=["DELETE"]) +@auth_with_key +def delete_attribute_in_type(type_id=None): + with argument_required("attr_id"): + attr_ids = request.values.get("attr_id", "") + attr_id_list = attr_ids.strip().split(",") + manager = CITypeAttributeManager() + manager.delete(type_id, attr_id_list) + return jsonify(attributes=attr_id_list) \ No newline at end of file diff --git a/core/audit.py b/core/audit.py new file mode 100644 index 0000000..2ebad9e --- /dev/null +++ b/core/audit.py @@ -0,0 +1,100 @@ +# -*- coding:utf-8 -*- + +__author__ = 'pycook' + +import urllib + +from flask import Blueprint +from flask import request +from flask import jsonify +from flask import abort + +from lib.audit import CIAuditManager +from lib.utils import get_page +from lib.auth import auth_with_key + + +audit = Blueprint("audit", __name__) + + +@audit.route("", methods=["GET"]) +def get_ci_audits(): + page = get_page(request.values.get("page", 1)) + type_ids = request.values.get("type_ids", "").split(",") + type_ids = map(int, filter(lambda x: x != "", type_ids)) + type_ids = tuple(type_ids) + numfound, total, ci_audits = CIAuditManager().get_cis_for_audits( + page, type_ids) + return jsonify(numfound=numfound, total=total, + page=page, ci_audits=ci_audits) + + +@audit.route("", methods=["POST"]) +@auth_with_key +def create_ci_audit(): + if request.data: + args = dict() + _args = request.data.split("&") + for arg in _args: + if arg: + args[arg.split("=")[0]] = \ + urllib.unquote(urllib.unquote(arg.split("=")[1])) + else: + args = request.values + attr_pairs = dict() + type_name = "" + for k, v in args.items(): + if k == "ci_type": + type_name = v + elif not k.startswith("_"): + attr_pairs[k] = v + ret, res = CIAuditManager().create_ci_audits(type_name=type_name, + attr_pairs=attr_pairs) + if not ret: + return abort(500, res) + return jsonify(code=200) + + +@audit.route("/attribute/", methods=["POST"]) +@auth_with_key +def audit_by_attr(audit_id): + attr_ids = request.values.get("attr_ids", "") + if not attr_ids: + return abort(500, "argument attr_ids is required") + split_tag = filter(lambda x: x in attr_ids, [";", ","]) + attr_value = None + if not split_tag: + attr_value = request.values.get("attr_value") + if attr_value is None: + return abort(500, "argument attr_value is required") + attr_ids = [int(attr_ids)] + else: + attr_ids = attr_ids.split(split_tag[0]) + attr_ids = map(int, attr_ids) + + manager = CIAuditManager() + ret, res = manager.audit_by_attr(audit_id, attr_ids, value=attr_value) + if ret: + return jsonify(code=200) + else: + return abort(500, res) + + +@audit.route("/cis", methods=["POST"]) +@auth_with_key +def audit_by_cis(): + ci_ids = request.values.get("ci_ids", "") + if not ci_ids: + return abort(500, "argument ci_ids is required") + split_tag = filter(lambda x: x in ci_ids, [",", ";"]) + if split_tag: + ci_ids = ci_ids.split(split_tag[0]) + else: + ci_ids = [ci_ids] + ci_ids = map(int, ci_ids) + manager = CIAuditManager() + ret, res = manager.audit_by_cis(ci_ids) + if ret: + return jsonify(code=200) + else: + return abort(500, res) \ No newline at end of file diff --git a/core/ci.py b/core/ci.py new file mode 100644 index 0000000..151e0aa --- /dev/null +++ b/core/ci.py @@ -0,0 +1,189 @@ +# -*- coding:utf-8 -*- + +import sys +reload(sys) +sys.setdefaultencoding("utf-8") +import time +import urllib + +from flask import Blueprint +from flask import request +from flask import jsonify +from flask import current_app +from flask import make_response +from flask import render_template +from flask import abort + +from lib.auth import auth_with_key +from lib.ci import CIManager +from lib.search import Search +from lib.search import SearchError +from lib.utils import get_page +from lib.utils import get_per_page +from models.ci_type import CITypeCache + +ci = Blueprint("ci", __name__) + + +@ci.route("/type/", methods=["GET"]) +def get_cis_by_type(type_id=None): + fields = request.args.get("fields", "").strip().split(",") + fields = filter(lambda x: x != "", fields) + + ret_key = request.args.get("ret_key", "name") + if ret_key not in ('name', 'alias', 'id'): + ret_key = 'name' + + page = get_page(request.values.get("page", 1)) + count = get_per_page(request.values.get("count")) + manager = CIManager() + res = manager.get_cis_by_type(type_id, ret_key=ret_key, + fields=fields, page=page, per_page=count) + return jsonify(type_id=type_id, numfound=res[0], + total=len(res[2]), page=res[1], cis=res[2]) + + +@ci.route("/", methods=['GET']) +def get_ci(ci_id=None): + fields = request.args.get("fields", "").strip().split(",") + fields = filter(lambda x: x != "", fields) + + ret_key = request.args.get("ret_key", "name") + if ret_key not in ('name', 'alias', 'id'): + ret_key = 'name' + + manager = CIManager() + ci = manager.get_ci_by_id(ci_id, ret_key=ret_key, fields=fields) + return jsonify(ci_id=ci_id, ci=ci) + + +@ci.route("/s", methods=["GET"]) +@ci.route("/search", methods=["GET"]) +def search(): + """@params: q: query statement + fl: filter by column + count: the number of ci + ret_key: id, name, alias + facet: statistic + wt: result format + """ + page = get_page(request.values.get("page", 1)) + count = get_per_page(request.values.get("count")) + + query = request.values.get('q', "") + fl = request.values.get('fl', "").split(",") + ret_key = request.values.get('ret_key', "name") + if ret_key not in ('name', 'alias', 'id'): + ret_key = 'name' + facet = request.values.get("facet", "").split(",") + wt = request.values.get('wt', 'json') + fl = filter(lambda x: x != "", fl) + facet = filter(lambda x: x != "", facet) + sort = request.values.get("sort") + + start = time.time() + s = Search(query, fl, facet, page, ret_key, count, sort) + try: + response, counter, total, page, numfound, facet = s.search() + except SearchError, e: + return abort(400, str(e)) + except Exception, e: + current_app.logger.error(str(e)) + return abort(500, "search unknown error") + + if wt == 'xml': + res = make_response( + render_template("search.xml", + counter=counter, + total=total, + result=response, + page=page, + numfound=numfound, + facet=facet)) + res.headers['Content-type'] = 'text/xml' + return res + current_app.logger.debug("search time is :{0}".format( + time.time() - start)) + return jsonify(numfound=numfound, + total=total, + page=page, + facet=facet, + counter=counter, + result=response) + + +@ci.route("", methods=["POST"]) +@auth_with_key +def create_ci(): + ci_type = request.values.get("ci_type") + _no_attribute_policy = request.values.get("_no_attribute_policy", "ignore") + + ci_dict = dict() + for k, v in request.values.iteritems(): + if k != "ci_type" and not k.startswith("_"): + ci_dict[k] = v.strip() + + manager = CIManager() + current_app.logger.debug(ci_dict) + ci_id = manager.add(ci_type, exist_policy="reject", + _no_attribute_policy=_no_attribute_policy, **ci_dict) + return jsonify(ci_id=ci_id) + + +@ci.route("", methods=["PUT"]) +@auth_with_key +def update_ci(): + if request.data: + args = dict() + _args = request.data.split("&") + for arg in _args: + if arg: + args[arg.split("=")[0]] = \ + urllib.unquote(urllib.unquote(arg.split("=")[1])) + else: + args = request.values + + ci_type = args.get("ci_type") + _no_attribute_policy = args.get("_no_attribute_policy", "ignore") + ci_dict = dict() + for k, v in args.items(): + if k != "ci_type" and not k.startswith("_"): + ci_dict[k] = v.strip() + + manager = CIManager() + ci_id = manager.add(ci_type, exist_policy="replace", + _no_attribute_policy=_no_attribute_policy, **ci_dict) + return jsonify(ci_id=ci_id) + + +@ci.route("/", methods=["DELETE"]) +@auth_with_key +def delete_ci(ci_id=None): + manager = CIManager() + manager.delete(ci_id) + return jsonify(message="ok") + + +@ci.route("/heartbeat//", methods=["POST"]) +def add_heartbeat(ci_type, unique): + if not unique or not ci_type: + return jsonify(message="error") + # return jsonify(message="ok") + return jsonify(message=CIManager().add_heartbeat(ci_type, unique)) + + +@ci.route("/heartbeat", methods=["GET"]) +def get_heartbeat(): + page = get_page(request.values.get("page", 1)) + ci_type = request.values.get("ci_type", "").strip() + try: + ci_type = CITypeCache.get(ci_type).type_id + except: + return jsonify(numfound=0, result=[]) + agent_status = request.values.get("agent_status", None) + if agent_status: + agent_status = int(agent_status) + numfound, result = CIManager().get_heartbeat(page, + ci_type, + agent_status=agent_status) + return jsonify(numfound=numfound, result=result) \ No newline at end of file diff --git a/core/ci_relation.py b/core/ci_relation.py new file mode 100644 index 0000000..63233df --- /dev/null +++ b/core/ci_relation.py @@ -0,0 +1,70 @@ +# -*- coding:utf-8 -*- + + +from flask import Blueprint +from flask import jsonify +from flask import request + +from lib.ci import CIRelationManager +from lib.utils import get_page +from lib.utils import get_per_page +from lib.auth import auth_with_key + + +cirelation = Blueprint("cirelation", __name__) + + +@cirelation.route("/types", methods=["GET"]) +def get_types(): + manager = CIRelationManager() + return jsonify(relation_types=manager.relation_types) + + +@cirelation.route("//second_cis", methods=["GET"]) +def get_second_cis_by_first_ci(first_ci=None): + page = get_page(request.values.get("page", 1)) + count = get_per_page(request.values.get("count")) + relation_type = request.values.get("relation_type", "contain") + manager = CIRelationManager() + numfound, total, second_cis = manager.get_second_cis( + first_ci, page=page, per_page=count, relation_type=relation_type) + return jsonify(numfound=numfound, total=total, + page=page, second_cis=second_cis) + + +@cirelation.route("//first_cis", methods=["GET"]) +def get_first_cis_by_second_ci(second_ci=None): + page = get_page(request.values.get("page", 1)) + count = get_per_page(request.values.get("count")) + relation_type = request.values.get("relation_type", "contain") + + manager = CIRelationManager() + numfound, total, first_cis = manager.get_first_cis( + second_ci, per_page=count, page=page, relation_type=relation_type) + return jsonify(numfound=numfound, total=total, + page=page, first_cis=first_cis) + + +@cirelation.route("//", methods=["POST"]) +@auth_with_key +def create_ci_relation(first_ci=None, second_ci=None): + relation_type = request.values.get("relation_type", "contain") + manager = CIRelationManager() + res = manager.add(first_ci, second_ci, relation_type=relation_type) + return jsonify(cr_id=res) + + +@cirelation.route("/", methods=["DELETE"]) +@auth_with_key +def delete_ci_relation(cr_id=None): + manager = CIRelationManager() + manager.delete(cr_id) + return jsonify(message="CIType Relation is deleted") + + +@cirelation.route("//", methods=["DELETE"]) +@auth_with_key +def delete_ci_relation_2(first_ci, second_ci): + manager = CIRelationManager() + manager.delete_2(first_ci, second_ci) + return jsonify(message="CIType Relation is deleted") \ No newline at end of file diff --git a/core/ci_type.py b/core/ci_type.py new file mode 100644 index 0000000..85efa12 --- /dev/null +++ b/core/ci_type.py @@ -0,0 +1,89 @@ +# -*- coding:utf-8 -*- + + +from flask import Blueprint +from flask import jsonify +from flask import request +from flask import abort + +from lib.ci_type import CITypeManager +from lib.decorator import argument_required +from lib.auth import auth_with_key + + +citype = Blueprint("citype", __name__) + + +@citype.route("", methods=["GET"]) +def get_citypes(): + type_name = request.args.get("type_name") + manager = CITypeManager() + citypes = manager.get_citypes(type_name) + count = len(citypes) + return jsonify(numfound=count, citypes=citypes) + + +@citype.route("/query", methods=["GET"]) +def query(): + with argument_required("type"): + _type = request.args.get("type") + manager = CITypeManager() + res = manager.query(_type) + return jsonify(citype=res) + + +@citype.route("", methods=["POST"]) +@auth_with_key +def create_citype(): + with argument_required("type_name"): + type_name = request.values.get("type_name") + type_alias = request.values.get("type_alias") + if type_alias is None: + type_alias = type_name + _id = request.values.get("_id") + unique = request.values.get("unique") + enabled = request.values.get("enabled", True) + icon_url = request.values.get("icon_url", "") + manager = CITypeManager() + ret, res = manager.add(type_name, type_alias, _id=_id, + unique=unique, enabled=enabled, + icon_url=icon_url) + if ret: + return jsonify(type_id=res) + abort(500, res) + + +@citype.route("/", methods=["PUT"]) +@auth_with_key +def update_citype(type_id=None): + type_name = request.values.get("type_name") + type_alias = request.values.get("type_alias") + _id = request.values.get("_id") + unique = request.values.get("unique") + icon_url = request.values.get("icon_url") + enabled = request.values.get("enabled") + enabled = False if enabled in (0, "0") else True \ + if enabled is not None else None + manager = CITypeManager() + ret, res = manager.update(type_id, type_name, type_alias, _id=_id, + unique=unique, icon_url=icon_url, + enabled=enabled) + if ret: + return jsonify(type_id=type_id) + abort(500, res) + + +@citype.route("/", methods=["DELETE"]) +@auth_with_key +def delete_citype(type_id=None): + manager = CITypeManager() + res = manager.delete(type_id) + return jsonify(message=res) + + +@citype.route("/enable/", methods=["GET", "POST"]) +def enable(type_id=None): + enable = request.values.get("enable", True) + manager = CITypeManager() + manager.set_enabled(type_id, enabled=enable) + return jsonify(type_id=type_id) \ No newline at end of file diff --git a/core/ci_type_relation.py b/core/ci_type_relation.py new file mode 100644 index 0000000..36d72ca --- /dev/null +++ b/core/ci_type_relation.py @@ -0,0 +1,55 @@ +# -*- coding:utf-8 -*- + + +from flask import Blueprint +from flask import jsonify +from flask import request + +from lib.ci_type import CITypeRelationManager +from lib.auth import auth_with_key + + +cityperelation = Blueprint("cityperelation", __name__) + + +@cityperelation.route("/types", methods=["GET"]) +def get_types(): + manager = CITypeRelationManager() + return jsonify(relation_types=manager.relation_types) + + +@cityperelation.route("//children", methods=["GET"]) +def get_children_by_parent(parent=None): + manager = CITypeRelationManager() + return jsonify(children=manager.get_children(parent)) + + +@cityperelation.route("//parents", methods=["GET"]) +def get_parents_by_child(child=None): + manager = CITypeRelationManager() + return jsonify(parents=manager.get_parents(child)) + + +@cityperelation.route("//", methods=["POST"]) +@auth_with_key +def create_citype_realtions(parent=None, child=None): + relation_type = request.values.get("relation_type", "contain") + manager = CITypeRelationManager() + res = manager.add(parent, child, relation_type=relation_type) + return jsonify(ctr_id=res) + + +@cityperelation.route("/", methods=["DELETE"]) +@auth_with_key +def delete_citype_relation(ctr_id=None): + manager = CITypeRelationManager() + manager.delete(ctr_id) + return jsonify(message="CIType Relation is deleted") + + +@cityperelation.route("//", methods=["DELETE"]) +@auth_with_key +def delete_citype_relation_2(parent=None, child=None): + manager = CITypeRelationManager() + manager.delete_2(parent, child) + return jsonify(message="CIType Relation is deleted") diff --git a/core/history.py b/core/history.py new file mode 100644 index 0000000..5eee828 --- /dev/null +++ b/core/history.py @@ -0,0 +1,116 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from flask import jsonify +from flask import current_app +from flask import Blueprint +from flask import request +from flask import abort + +from models.history import OperationRecord +from models.history import CIRelationHistory +from models.history import CIAttributeHistory +from models.attribute import CIAttributeCache +from extensions import db +from models import row2dict +from models.account import UserCache +from lib.ci import CIManager +from lib.utils import get_page + +history = Blueprint("history", __name__) + + +@history.route("/record", methods=["GET"]) +def get_record(): + page = get_page(request.values.get("page", 1)) + _start = request.values.get("start") + _end = request.values.get("end") + username = request.values.get("username", "") + per_page_cnt = current_app.config.get("DEFAULT_PAGE_COUNT") + start, end = None, None + if _start: + try: + start = datetime.datetime.strptime(_start, '%Y-%m-%d %H:%M:%S') + except ValueError: + abort(400, 'incorrect start date time') + if _end: + try: + end = datetime.datetime.strptime(_end, '%Y-%m-%d %H:%M:%S') + except ValueError: + abort(400, 'incorrect end date time') + records = db.session.query(OperationRecord) + numfound = db.session.query(db.func.count(OperationRecord.record_id)) + if start: + records = records.filter(OperationRecord.timestamp >= start) + numfound = numfound.filter(OperationRecord.timestamp >= start) + if end: + records = records.filter(OperationRecord.timestamp <= end) + numfound = records.filter(OperationRecord.timestamp <= end) + if username: + user = UserCache.get(username) + if user: + records = records.filter(OperationRecord.uid == user.uid) + else: + return jsonify(numfound=0, records=[], + page=1, total=0, start=_start, + end=_end, username=username) + records = records.order_by(-OperationRecord.record_id).offset( + per_page_cnt * (page - 1)).limit(per_page_cnt).all() + total = len(records) + numfound = numfound.first()[0] + res = [] + for record in records: + _res = row2dict(record) + _res["user"] = UserCache.get(_res.get("uid")).nickname \ + if UserCache.get(_res.get("uid")).nickname \ + else UserCache.get(_res.get("uid")).username + attr_history = db.session.query(CIAttributeHistory.attr_id).filter( + CIAttributeHistory.record_id == _res.get("record_id")).all() + _res["attr_history"] = [CIAttributeCache.get(h.attr_id).attr_alias + for h in attr_history] + rel_history = db.session.query(CIRelationHistory.operate_type).filter( + CIRelationHistory.record_id == _res.get("record_id")).all() + rel_statis = {} + for rel in rel_history: + if rel.operate_type not in rel_statis: + rel_statis[rel.operate_type] = 1 + else: + rel_statis[rel.res.operate_type] += 1 + _res["rel_history"] = rel_statis + res.append(_res) + + return jsonify(numfound=numfound, records=res, page=page, total=total, + start=_start, end=_end, username=username) + + +@history.route("/", methods=["GET"]) +def get_detail_by_record(record_id=None): + record = db.session.query(OperationRecord).filter( + OperationRecord.record_id == record_id).first() + if record is None: + abort(404, "record is not found") + username = UserCache.get(record.uid).nickname \ + if UserCache.get(record.uid).nickname \ + else UserCache.get(record.uid).username + timestamp = record.timestamp.strftime("%Y-%m-%d %H:%M:%S") + attr_history = db.session.query(CIAttributeHistory).filter( + CIAttributeHistory.record_id == record_id).all() + rel_history = db.session.query(CIRelationHistory).filter( + CIRelationHistory.record_id == record_id).all() + attr_dict, rel_dict = dict(), {"add": [], "delete": []} + for attr_h in attr_history: + attr_dict[CIAttributeCache.get(attr_h.attr_id).attr_alias] = { + "old": attr_h.old, "new": attr_h.new, + "operate_type": attr_h.operate_type} + manager = CIManager() + for rel_h in rel_history: + _, first = manager.get_ci_by_id(rel_h.first_ci_id) + _, second = manager.get_ci_by_id(rel_h.second_ci_id) + rel_dict[rel_h.operate_type].append( + (first, rel_h.relation_type, second)) + + return jsonify(username=username, timestamp=timestamp, + attr_history=attr_dict, + rel_history=rel_dict) diff --git a/core/statis.py b/core/statis.py new file mode 100644 index 0000000..20b5061 --- /dev/null +++ b/core/statis.py @@ -0,0 +1,12 @@ +# -*- coding:utf-8 -*- + + +from flask import Blueprint + + +statis = Blueprint("statis", __name__) + + +@statis.route("") +def statis(): + pass \ No newline at end of file diff --git a/extensions.py b/extensions.py new file mode 100644 index 0000000..5dfb606 --- /dev/null +++ b/extensions.py @@ -0,0 +1,16 @@ +# encoding=utf-8 + + +from flask.ext.mail import Mail +from flask.ext.sqlalchemy import SQLAlchemy +from flask.ext.cache import Cache +from flask.ext.celery import Celery + + +__all__ = ['mail', 'db', 'cache', 'celery'] + + +mail = Mail() +db = SQLAlchemy() +cache = Cache() +celery = Celery() \ No newline at end of file diff --git a/gunicornserver.py b/gunicornserver.py new file mode 100644 index 0000000..6c5feab --- /dev/null +++ b/gunicornserver.py @@ -0,0 +1,72 @@ +# encoding=utf-8 + +from flask_script import Command, Option + + +class GunicornServer(Command): + description = 'Run the app within Gunicorn' + + def __init__(self, host='127.0.0.1', port=5000, workers=8, + worker_class="gevent", daemon=False): + self.port = port + self.host = host + self.workers = workers + self.worker_class = worker_class + self.daemon = daemon + + def get_options(self): + return ( + Option('-H', '--host', + dest='host', + default=self.host), + + Option('-p', '--port', + dest='port', + type=int, + default=self.port), + + Option('-w', '--workers', + dest='workers', + type=int, + default=self.workers), + + Option("-c", "--worker_class", + dest='worker_class', + type=str, + default=self.worker_class), + + Option("-d", "--daemon", + dest="daemon", + type=bool, + default=self.daemon) + ) + + def handle(self, app, host, port, workers, worker_class, daemon): + + from gunicorn import version_info + + if version_info < (0, 9, 0): + from gunicorn.arbiter import Arbiter + from gunicorn.config import Config + + arbiter = Arbiter(Config({'bind': "%s:%d" % (host, int(port)), + 'workers': workers, + 'worker_class': worker_class, + 'daemon': daemon}), app) + arbiter.run() + else: + from gunicorn.app.base import Application + + class FlaskApplication(Application): + def init(self, parser, opts, args): + return { + 'bind': '{0}:{1}'.format(host, port), + 'workers': workers, + 'worker_class': worker_class, + 'daemon': daemon + } + + def load(self): + return app + + FlaskApplication().run() diff --git a/lib/__init__.py b/lib/__init__.py new file mode 100644 index 0000000..ef612ed --- /dev/null +++ b/lib/__init__.py @@ -0,0 +1,4 @@ +# -*- coding:utf-8 -*- + + +__all__ = [] \ No newline at end of file diff --git a/lib/account.py b/lib/account.py new file mode 100644 index 0000000..31bb2b1 --- /dev/null +++ b/lib/account.py @@ -0,0 +1,145 @@ +# -*- coding:utf-8 -*- + + +import uuid +import random +import string +import datetime + +from flask import current_app +from flask import abort + +from extensions import db +from models.account import UserCache +from models.account import User +from models.account import UserRole + + +class AccountManager(object): + def __init__(self): + pass + + def get_user_by_uid(self, uid): + user = UserCache.get(uid) + return user + + def _generate_key(self): + key = uuid.uuid4().hex + secret = ''.join(random.sample(string.ascii_letters + + string.digits + '~!@#$%^&*?', 32)) + return key, secret + + def validate(self, username, password): + user, authenticated = User.query.authenticate(username, password) + return user, authenticated + + def create_user(self, **kwargs): + username = kwargs.get("username") + if username: + user = UserCache.get(username) + if user is not None: + user, authenticated = self.validate( + username, kwargs.get("password")) + if authenticated: + return user + else: + return abort(401, "authenticate validate failed") + else: + return abort(400, "argument username is required") + user = User() + email = kwargs.get("email", "") + if not email: + return abort(400, "argument email is required") + user.email = email + user.password = kwargs.get("password") + user.username = kwargs.get("username", "") + user.nickname = kwargs.get("nickname") if kwargs.get("nickname") \ + else kwargs.get("username", "") + key, secret = self._generate_key() + user.key = key + user.secret = secret + user.date_joined = datetime.datetime.now() + user.block = 0 + + db.session.add(user) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("create user is error {0}".format(str(e))) + return abort(500, "create user is error, {0}".format(str(e))) + return user + + def update_user(self, uid, **kwargs): + user = UserCache.get(uid) + if user is None: + return abort(400, "the user[{0}] is not existed".format(uid)) + user.username = kwargs.get("username", "") \ + if kwargs.get("username") else user.username + user.nickname = kwargs.get("nickname") \ + if kwargs.get("nickname") else user.nickname + user.department = kwargs.get("department") \ + if kwargs.get("department") else user.department + user.catalog = kwargs.get("catalog") \ + if kwargs.get("catalog") else user.catalog + user.email = kwargs.get("email") \ + if kwargs.get("email") else user.email + user.mobile = kwargs.get("mobile") \ + if kwargs.get("mobile") else user.mobile + db.session.add(user) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("create user is error {0}".format(str(e))) + return abort(500, "create user is error, {0}".format(str(e))) + return True, user + + def delete_user(self, uid): + user = UserCache.get(uid) + if user is None: + return abort(400, "the user[{0}] is not existed".format(uid)) + db.session.query(UserRole).filter(UserRole.uid == uid).delete() + db.session.delete(user) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("delete user error, {0}".format(str(e))) + return abort(500, "delete user error, {0}".format(str(e))) + return True, uid + + def update_password(self, uid, old, new, confirm): + user = User.query.get(uid) + if not user: + return abort(400, "user is not existed") + if not user.check_password(old): + return abort(400, "invalidate old password") + if not (new and confirm and new == confirm): + return abort(400, """Password cannot be empty, + two inputs must be the same""") + user.password = new + db.session.add(user) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("set password error, %s" % str(e)) + return abort(500, "set password errors, {0:s}".format(str(e))) + return True, user + + def reset_key(self, uid): + user = UserCache.get(uid) + if user is None: + return abort(400, "the user[{0}] is not existed".format(uid)) + key, secret = self._generate_key() + user.key = key + user.secret = secret + db.session.add(user) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("reset key is error, {0}".format(str(e))) + return abort(500, "reset key is error, {0}".format(str(e))) + return True, user \ No newline at end of file diff --git a/lib/attribute.py b/lib/attribute.py new file mode 100644 index 0000000..19e889d --- /dev/null +++ b/lib/attribute.py @@ -0,0 +1,167 @@ +# -*- coding:utf-8 -*- + +from flask import current_app +from flask import abort + +from extensions import db +from models.attribute import CIAttribute +from models.attribute import CIAttributeCache +from models import row2dict +from lib.const import type_map + + +class AttributeManager(object): + """ + CI attributes manager + """ + + def __init__(self): + pass + + def _get_choice_value(self, attr_id, value_type): + _table = type_map.get("choice").get(value_type) + choice_values = db.session.query(_table.value).filter( + _table.attr_id == attr_id).all() + return [choice_value.value for choice_value in choice_values] + + def _add_choice_value(self, choice_value, attr_id, value_type): + _table = type_map.get("choice").get(value_type) + db.session.query(_table).filter(_table.attr_id == attr_id).delete() + db.session.flush() + for v in choice_value.strip().split(","): + table = _table() + table.attr_id = attr_id + table.value = v + db.session.add(table) + db.session.flush() + + def get_attributes(self, name=None): + """ + return attribute by name, + if name is None, then return all attributes + """ + attrs = db.session.query(CIAttribute).filter( + CIAttribute.attr_name.ilike("%{0}%".format(name))).all() \ + if name is not None else db.session.query(CIAttribute).all() + res = list() + for attr in attrs: + attr_dict = row2dict(attr) + if attr.is_choice: + attr_dict["choice_value"] = self._get_choice_value( + attr.attr_id, attr.value_type) + res.append(attr_dict) + return res + + def get_attribute_by_name(self, attr_name): + attr = db.session.query(CIAttribute).filter( + CIAttribute.attr_name == attr_name).first() + if attr: + attr_dict = row2dict(attr) + if attr.is_choice: + attr_dict["choice_value"] = self._get_choice_value( + attr.attr_id, attr.value_type) + return attr_dict + + def get_attribute_by_alias(self, attr_alias): + attr = db.session.query(CIAttribute).filter( + CIAttribute.attr_alias == attr_alias).first() + if attr: + attr_dict = row2dict(attr) + if attr.is_choice: + attr_dict["choice_value"] = self._get_choice_value( + attr.attr_id, attr.value_type) + return attr_dict + + def get_attribute_by_id(self, attr_id): + attr = db.session.query(CIAttribute).filter( + CIAttribute.attr_id == attr_id).first() + if attr: + attr_dict = row2dict(attr) + if attr.is_choice: + attr_dict["choice_value"] = self._get_choice_value( + attr.attr_id, attr.value_type) + return attr_dict + + def add(self, attr_name, attr_alias, **kwargs): + choice_value = kwargs.get("choice_value", False) + attr = CIAttributeCache.get(attr_name) + if attr is not None: + return False, "attribute {0} is already existed".format(attr_name) + is_choice = False + if choice_value: + is_choice = True + if not attr_alias: + attr_alias = attr_name + attr = CIAttribute() + attr.attr_name = attr_name + attr.attr_alias = attr_alias + attr.is_choice = is_choice + attr.is_multivalue = kwargs.get("is_multivalue", False) + attr.is_uniq = kwargs.get("is_uniq", False) + attr.is_index = kwargs.get("is_index", False) + attr.value_type = kwargs.get("value_type", "text") + db.session.add(attr) + db.session.flush() + + if choice_value: + self._add_choice_value(choice_value, attr.attr_id, attr.value_type) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("add attribute error, {0}".format(str(e))) + return False, str(e) + CIAttributeCache.clean(attr) + return True, attr.attr_id + + def update(self, attr_id, *args, **kwargs): + attr = db.session.query(CIAttribute).filter_by(attr_id=attr_id).first() + if not attr: + return False, "CI attribute you want to update is not existed" + choice_value = kwargs.get("choice_value", False) + is_choice = False + if choice_value: + is_choice = True + attr.attr_name = args[0] + attr.attr_alias = args[1] + if not args[1]: + attr.attr_alias = args[0] + attr.is_choice = is_choice + attr.is_multivalue = kwargs.get("is_multivalue", False) + attr.is_uniq = kwargs.get("is_uniq", False) + attr.value_type = kwargs.get("value_type", "text") + db.session.add(attr) + db.session.flush() + if is_choice: + self._add_choice_value(choice_value, attr.attr_id, attr.value_type) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("update attribute error, {0}".format( + str(e))) + return False, str(e) + CIAttributeCache.clean(attr) + return True, attr.attr_id + + def delete(self, attr_id): + attr, name = db.session.query(CIAttribute).filter_by( + attr_id=attr_id).first(), None + if attr: + if attr.is_choice: + choice_table = type_map["choice"].get(attr.value_type) + db.session.query(choice_table).filter( + choice_table.attr_id == attr_id).delete() + name = attr.attr_name + CIAttributeCache.clean(attr) + db.session.delete(attr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("delete attribute error, {0}".format( + str(e))) + return abort(500, str(e)) + else: + return abort(404, "attribute you want to delete is not existed") + return name \ No newline at end of file diff --git a/lib/audit.py b/lib/audit.py new file mode 100644 index 0000000..1e95b79 --- /dev/null +++ b/lib/audit.py @@ -0,0 +1,168 @@ +# -*- coding:utf-8 -*- + +__author__ = 'pycook' + +import datetime + +from flask import current_app + +from models.cmdb import CIAudit +from models.cmdb import CIAttributeAudit +from models.cmdb import CIAttributeCache +from models.cmdb import CITypeCache +from models.cmdb import CI +from models import row2dict +from extensions import db +from lib.const import TableMap +from tasks.cmdb import ci_cache + + +class CIAuditManager(object): + def __init__(self): + pass + + def get_cis_for_audits(self, page, type_ids, per_page=25): + audit_cis = db.session.query(CIAudit) + if type_ids: + audit_cis = audit_cis.join(CI, CI.ci_id == CIAudit.ci_id).filter( + CI.type_id.in_(type_ids)) + + audit_cis = audit_cis.filter(CIAudit.is_audit == 0).order_by( + CIAudit.created_at) + numfound = audit_cis.count() + audit_cis = audit_cis.offset((page - 1) * per_page).limit(per_page) + total = audit_cis.count() + audit_cis = audit_cis.all() + result = list() + for audit_ci in audit_cis: + audit_dict = row2dict(audit_ci) + audit_attrs = db.session.query(CIAttributeAudit).filter( + CIAttributeAudit.audit_id == audit_ci.audit_id).all() + audit_dict["values"] = list() + for audit_attr in audit_attrs: + audit_attr_dict = row2dict(audit_attr) + audit_attr_dict["attr_name"] = CIAttributeCache.get( + audit_attr.attr_id).attr_name + audit_dict['values'].append(audit_attr_dict) + result.append(audit_dict) + return numfound, total, result + + def create_ci_audits(self, type_name, attr_pairs): + ci_type = CITypeCache.get(type_name) + uniq_key = CIAttributeCache.get(ci_type.uniq_id) + table = TableMap(attr_name=uniq_key.attr_name).table + value = db.session.query(table.ci_id).filter( + table.attr_id == uniq_key.attr_id).filter( + table.value == attr_pairs.get(uniq_key.attr_name)).first() + del attr_pairs[uniq_key.attr_name] + if value and attr_pairs: + ci_audit = db.session.query(CIAudit).filter( + CIAudit.ci_id == value.ci_id).filter( + CIAudit.is_audit == 0).first() + if ci_audit is None: + ci_audit = CIAudit() + ci_audit.is_notified = False + ci_audit.created_at = datetime.datetime.now() + ci_audit.ci_id = value.ci_id + ci_audit.updated_at = datetime.datetime.now() + ci_audit.origin = 1 # TODO + db.session.add(ci_audit) + db.session.commit() + for attr, attr_value in attr_pairs.items(): + attr_id = CIAttributeCache.get(attr).attr_id + ci_attr_audit = CIAttributeAudit() + ci_attr_audit.attr_id = attr_id + all_values = attr_value.strip().split("###") + ci_attr_audit.cur_value = all_values[0] + ci_attr_audit.new_value = all_values[1] + ci_attr_audit.audit_id = ci_audit.audit_id + db.session.add(ci_attr_audit) + db.session.flush() + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("create ci audits error, %s" % str(e)) + return False, "create ci audits error, %s" % str(e) + return True, None + + def _update_cmdb(self, ci_id, attr_id, value): + try: + attr_name = CIAttributeCache.get(attr_id).attr_name + table = TableMap(attr_name=attr_name).table + attr_value = db.session.query(table).filter( + table.attr_id == attr_id).filter( + table.ci_id == ci_id).first() + attr_value.value = value + db.session.add(attr_value) + + except Exception as e: + return False, "audit failed, %s" % str(e) + return True, ci_id + + def audit_by_attr(self, audit_id, attr_ids, value=None): + ci_audit = CIAudit.query.get(audit_id) + ci_id = ci_audit.ci_id + for attr_id in attr_ids: + attr_audit = db.session.query(CIAttributeAudit).filter( + CIAttributeAudit.audit_id == audit_id).filter( + CIAttributeAudit.attr_id == attr_id).first() + if attr_audit: + attr_audit.is_audit = True + attr_audit.auditor = 1 # TODO + attr_audit.audited_at = datetime.datetime.now() + if value is not None: + attr_audit.audit_value = value + else: + attr_audit.audit_value = attr_audit.new_value + if attr_audit.cur_value != value: # update cmdb + ret, res = self._update_cmdb(ci_id, attr_id, value) + if not ret: + return False, res + attr_audit.is_updated = True + db.session.add(attr_audit) + db.session.flush() + if db.session.query(CIAttributeAudit).filter_by( + audit_id=audit_id).filter_by(is_audit=0).first() is None: + ci_audit.is_audit = True + ci_audit.updated_at = datetime.datetime.now() + db.session.add(ci_audit) + ci_cache.apply_async([ci_id], queue="cmdb_async") + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "audit by attribute is error, {0}".format(str(e))) + return False, "audit by attribute is error, %s" % str(e) + return True, None + + def audit_by_cis(self, ci_ids): + for ci_id in ci_ids: + ci_audit = db.session.query(CIAudit).filter_by(ci_id=ci_id).first() + attr_audits = db.session.query(CIAttributeAudit).filter_by( + audit_id=ci_audit.audit_id).all() + for attr_audit in attr_audits: + attr_audit.is_audit = True + attr_audit.auditor = 1 # TODO + attr_audit.audited_at = datetime.datetime.now() + attr_audit.audit_value = attr_audit.new_value + ret, res = self._update_cmdb( + ci_id, attr_audit.attr_id, + attr_audit.new_value) + if not ret: + return False, res + attr_audit.is_updated = True + db.session.add(attr_audit) + ci_audit.is_audit = True + ci_audit.updated_at = datetime.datetime.now() + db.session.add(ci_audit) + ci_cache.apply_async([ci_id], queue="cmdb_async") + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "audit by attribute error, {0}".format(str(e))) + return False, "audit by cis is error, %s" % str(e) + return True, None diff --git a/lib/auth.py b/lib/auth.py new file mode 100644 index 0000000..ce43d43 --- /dev/null +++ b/lib/auth.py @@ -0,0 +1,68 @@ +# -*- coding:utf-8 -*- + +import urllib +from functools import wraps + +from flask import current_app +from flask import g +from flask import request +from flask import abort +from flask.ext.principal import identity_changed +from flask.ext.principal import Identity +from flask.ext.principal import AnonymousIdentity + +from models.account import User +from models.account import UserCache + + +def auth_with_key(func): + @wraps(func) + def wrapper(*args, **kwargs): + if isinstance(getattr(g, 'user', None), User): + identity_changed.send(current_app._get_current_object(), + identity=Identity(g.user.uid)) + return func(*args, **kwargs) + ip = request.remote_addr + if request.data: + request_args = dict() + _args = request.data.split("&") + for arg in _args: + if arg: + request_args[arg.split("=")[0]] = \ + urllib.unquote(arg.split("=")[1]) + else: + request_args = request.values + + key = request_args.get('_key') + secret = request_args.get('_secret') + if not key and not secret and \ + ip.strip() in current_app.config.get("WHITE_LIST"): + ip = ip.strip() + user = UserCache.get(ip) + if user: + identity_changed.send(current_app._get_current_object(), + identity=Identity(user.uid)) + return func(*args, **kwargs) + else: + identity_changed.send(current_app._get_current_object(), + identity=AnonymousIdentity()) + return abort(400, "invalid _key and _secret") + + path = request.path + + keys = sorted(request_args.keys()) + req_args = [request_args[k] for k in keys + if str(k) not in ("_key", "_secret")] + current_app.logger.debug('args is %s' % req_args) + user, authenticated = User.query.authenticate_with_key( + key, secret, req_args, path) + if user and authenticated: + identity_changed.send(current_app._get_current_object(), + identity=Identity(user.get("uid"))) + return func(*args, **kwargs) + else: + identity_changed.send(current_app._get_current_object(), + identity=AnonymousIdentity()) + return abort(400, "invalid _key and _secret") + + return wrapper diff --git a/lib/ci.py b/lib/ci.py new file mode 100644 index 0000000..a6282b0 --- /dev/null +++ b/lib/ci.py @@ -0,0 +1,677 @@ +# -*- coding:utf-8 -*- + + +import uuid +import time +import datetime +import json + +from flask import current_app +from flask import abort +from sqlalchemy import or_ + +from extensions import db +from models.ci import CI +from models.ci_relation import CIRelation +from models.ci_type import CITypeAttribute +from models.ci_type import CITypeCache +from models.ci_type import CITypeSpecCache +from models.history import CIAttributeHistory +from models.attribute import CIAttributeCache +from lib.const import TableMap +from lib.const import type_map +from lib.value import AttributeValueManager +from lib.history import CIAttributeHistoryManger +from lib.history import CIRelationHistoryManager +from lib.query_sql import QUERY_HOSTS_NUM_BY_PRODUCT +from lib.query_sql import QUERY_HOSTS_NUM_BY_BU +from lib.query_sql import QUERY_HOSTS_NUM_BY_PROJECT +from lib.query_sql import QUERY_CIS_BY_IDS +from lib.query_sql import QUERY_CIS_BY_VALUE_TABLE +from lib.utils import rd +from tasks.cmdb import ci_cache +from tasks.cmdb import ci_delete + + +class CIManager(object): + """ manage CI interface + """ + + def __init__(self): + pass + + def get_ci_by_id(self, ci_id, ret_key="name", + fields=None, need_children=True, use_master=False): + """@params: `ret_key` is one of 'name', 'id', 'alias' + `fields` is list of attribute name/alias/id + """ + ci = CI.query.get(ci_id) or \ + abort(404, "CI {0} is not existed".format(ci_id)) + + res = dict() + + if need_children: + children = self.get_children(ci_id, ret_key=ret_key) # one floor + res.update(children) + ci_type = CITypeCache.get(ci.type_id) + res["ci_type"] = ci_type.type_name + uniq_key = CIAttributeCache.get(ci_type.uniq_id) + if not fields: # fields are all attributes + attr_ids = db.session.query(CITypeAttribute.attr_id).filter_by( + type_id=ci.type_id) + fields = [CIAttributeCache.get(_.attr_id).attr_name + for _ in attr_ids] + + if uniq_key.attr_name not in fields: + fields.append(uniq_key.attr_name) + if fields: + value_manager = AttributeValueManager() + _res = value_manager._get_attr_values( + fields, ci_id, + ret_key=ret_key, uniq_key=uniq_key, use_master=use_master) + res.update(_res) + res['_type'] = ci_type.type_id + res['_id'] = ci_id + return res + + def get_ci_by_ids(self, ci_id_list, ret_key="name", fields=None): + result = list() + for ci_id in ci_id_list: + res = self.get_ci_by_id(ci_id, ret_key=ret_key, fields=fields) + result.append(res) + return result + + def get_children(self, ci_id, ret_key='name', relation_type="contain"): + second_cis = db.session.query(CIRelation.second_ci_id).filter( + CIRelation.first_ci_id == ci_id).filter(or_( + CIRelation.relation_type == relation_type, + CIRelation.relation_type == "deploy")) + second_ci_ids = (second_ci.second_ci_id for second_ci in second_cis) + ci_types = {} + for ci_id in second_ci_ids: + type_id = db.session.query(CI.type_id).filter( + CI.ci_id == ci_id).first().type_id + if type_id not in ci_types: + ci_types[type_id] = [ci_id] + else: + ci_types[type_id].append(ci_id) + res = {} + for type_id in ci_types: + ci_type = CITypeCache.get(type_id) + children = get_cis_by_ids(map(str, ci_types.get(type_id)), + ret_key=ret_key) + res[ci_type.type_name] = children + return res + + def get_cis_by_type(self, type_id, ret_key="name", fields="", + page=1, per_page=None): + if per_page is None: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + cis = db.session.query(CI.ci_id).filter(CI.type_id == type_id) + numfound = cis.count() + cis = cis.offset((page - 1) * per_page).limit(per_page) + res = list() + ci_ids = [str(ci.ci_id) for ci in cis] + if ci_ids: + res = get_cis_by_ids(ci_ids, ret_key, fields) + return numfound, page, res + + def ci_is_exist(self, ci_type, unique_key, unique): + table = TableMap(attr_name=unique_key.attr_name).table + unique = db.session.query(table).filter( + table.attr_id == unique_key.attr_id).filter( + table.value == unique).first() + if unique: + return db.session.query(CI).filter( + CI.ci_id == unique.ci_id).first() + + def _delete_ci_by_id(self, ci_id): + db.session.query(CI.ci_id).filter(CI.ci_id == ci_id).delete() + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("delete ci is error, {0}".format(str(e))) + + def add(self, ci_type_name, exist_policy="replace", + _no_attribute_policy="ignore", **ci_dict): + ci_existed = False + ci_type = CITypeCache.get(ci_type_name) or \ + abort(404, "CIType {0} is not existed".format(ci_type_name)) + + unique_key = CIAttributeCache.get(ci_type.uniq_id) \ + or abort(500, 'illegality unique attribute') + + unique = ci_dict.get(unique_key.attr_name) \ + or abort(500, '{0} missing'.format(unique_key.attr_name)) + + old_ci = self.ci_is_exist(ci_type, unique_key, unique) + if old_ci is not None: + ci_existed = True + if exist_policy == 'reject': + return abort(500, 'CI is existed') + if old_ci.type_id != ci_type.type_id: # update ci_type + old_ci.type_id = ci_type.type_id + db.session.add(old_ci) + db.session.flush() + ci = old_ci + else: + if exist_policy == 'need': + return abort(404, 'CI {0} not exist'.format(unique)) + ci = CI() + ci.type_id = ci_type.type_id + _uuid = uuid.uuid4().hex + ci.uuid = _uuid + ci.created_time = datetime.datetime.now() + db.session.add(ci) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error('add CI error: {0}'.format(str(e))) + return abort(500, 'add CI error') + value_manager = AttributeValueManager() + histories = list() + for p, v in ci_dict.items(): + ret, res = value_manager.add_attr_value( + p, v, ci.ci_id, ci_type, + _no_attribute_policy=_no_attribute_policy, + ci_existed=ci_existed) + if not ret: + db.session.rollback() + if not ci_existed: + self.delete(ci.ci_id) + current_app.logger.info(res) + return abort(500, res) + if res is not None: + histories.append(res) + try: + db.session.commit() + except Exception as e: + current_app.logger.error(str(e)) + db.session.rollback() + if not ci_existed: # only add + self.delete(ci.ci_id) + return abort(500, "add CI error") + his_manager = CIAttributeHistoryManger() + his_manager.add(ci.ci_id, histories) + ci_cache.apply_async([ci.ci_id], queue="cmdb_async") + return ci.ci_id + + def delete(self, ci_id): + ci = db.session.query(CI).filter(CI.ci_id == ci_id).first() + if ci is not None: + attrs = db.session.query(CITypeAttribute.attr_id).filter( + CITypeAttribute.type_id == ci.type_id).all() + attr_names = [] + for attr in attrs: + attr_names.append(CIAttributeCache.get(attr.attr_id).attr_name) + attr_names = set(attr_names) + for attr_name in attr_names: + Table = TableMap(attr_name=attr_name).table + db.session.query(Table).filter(Table.ci_id == ci_id).delete() + db.session.query(CIRelation).filter( + CIRelation.first_ci_id == ci_id).delete() + db.session.query(CIRelation).filter( + CIRelation.second_ci_id == ci_id).delete() + db.session.query(CIAttributeHistory).filter( + CIAttributeHistory.ci_id == ci_id).delete() + + db.session.flush() + db.session.delete(ci) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("delete CI error, {0}".format(str(e))) + return abort(500, "delete CI error, {0}".format(str(e))) + # TODO: write history + ci_delete.apply_async([ci.ci_id], queue="cmdb_async") + return ci_id + return abort(404, "CI {0} not found".format(ci_id)) + + def add_heartbeat(self, ci_type, unique): + ci_type = CITypeCache.get(ci_type) + if not ci_type: + return 'error' + uniq_key = CIAttributeCache.get(ci_type.uniq_id) + Table = TableMap(attr_name=uniq_key.attr_name).table + ci_id = db.session.query(Table.ci_id).filter( + Table.attr_id == uniq_key.attr_id).filter( + Table.value == unique).first() + if ci_id is None: + return 'error' + ci = db.session.query(CI).filter(CI.ci_id == ci_id.ci_id).first() + if ci is None: + return 'error' + + ci.heartbeat = datetime.datetime.now() + + db.session.add(ci) + db.session.commit() + return "ok" + + def get_heartbeat(self, page, type_id, agent_status=None): + query = db.session.query(CI.ci_id, CI.heartbeat) + expire = datetime.datetime.now() - datetime.timedelta(minutes=72) + if type_id: + query = query.filter(CI.type_id == type_id) + else: + query = query.filter(db.or_(CI.type_id == 7, CI.type_id == 8)) + if agent_status == -1: + query = query.filter(CI.heartbeat == None) + elif agent_status == 0: + query = query.filter(CI.heartbeat <= expire) + elif agent_status == 1: + query = query.filter(CI.heartbeat > expire) + numfound = query.count() + per_page_count = current_app.config.get("DEFAULT_PAGE_COUNT") + cis = query.offset((page - 1) * per_page_count).limit( + per_page_count).all() + ci_ids = [ci.ci_id for ci in cis] + heartbeat_dict = {} + for ci in cis: + if agent_status is not None: + heartbeat_dict[ci.ci_id] = agent_status + else: + if ci.heartbeat is None: + heartbeat_dict[ci.ci_id] = -1 + elif ci.heartbeat <= expire: + heartbeat_dict[ci.ci_id] = 0 + else: + heartbeat_dict[ci.ci_id] = 1 + current_app.logger.debug(heartbeat_dict) + ci_ids = map(str, ci_ids) + res = get_cis_by_ids(ci_ids, fields=["hostname", "private_ip"]) + result = [(i.get("hostname"), i.get("private_ip")[0], i.get("ci_type"), + heartbeat_dict.get(i.get("_id"))) for i in res + if i.get("private_ip")] + return numfound, result + + +class CIRelationManager(object): + """ + manage relation between CIs + """ + + def __init__(self): + pass + + @property + def relation_types(self): + """ all CIType relation types + """ + from lib.const import CI_RELATION_TYPES + + return CI_RELATION_TYPES + + def get_second_cis(self, first_ci, relation_type="contain", + page=1, per_page=None, **kwargs): + if per_page is None: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + second_cis = db.session.query( + CI.ci_id).join( + CIRelation, CIRelation.second_ci_id == CI.ci_id).filter( + CIRelation.first_ci_id == first_ci).filter( + CIRelation.relation_type == relation_type) + if kwargs: # special for devices + second_cis = self._query_wrap_for_device(second_cis, **kwargs) + numfound = second_cis.count() + second_cis = second_cis.offset( + (page - 1) * per_page).limit(per_page).all() + ci_ids = [str(son.ci_id) for son in second_cis] + total = len(ci_ids) + result = get_cis_by_ids(ci_ids) + return numfound, total, result + + def get_grandsons(self, ci_id, page=1, per_page=None, **kwargs): + if per_page is None: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + children = db.session.query(CIRelation.second_ci_id).filter( + CIRelation.first_ci_id == ci_id).subquery() + grandsons = db.session.query(CIRelation.second_ci_id).join( + children, + children.c.second_ci_id == CIRelation.first_ci_id).subquery() + grandsons = db.session.query(CI.ci_id).join( + grandsons, grandsons.c.second_ci_id == CI.ci_id) + if kwargs: + grandsons = self._query_wrap_for_device(grandsons, **kwargs) + + numfound = grandsons.count() + grandsons = grandsons.offset( + (page - 1) * per_page).limit(per_page).all() + if not grandsons: + return 0, 0, [] + ci_ids = [str(son.ci_id) for son in grandsons] + total = len(ci_ids) + result = get_cis_by_ids(ci_ids) + + return numfound, total, result + + def _sort_handler(self, sort_by, query_sql): + + if sort_by.startswith("+"): + sort_type = "asc" + sort_by = sort_by[1:] + elif sort_by.startswith("-"): + sort_type = "desc" + sort_by = sort_by[1:] + else: + sort_type = "asc" + attr = CIAttributeCache.get(sort_by) + if attr is None: + return query_sql + + attr_id = attr.attr_id + Table = TableMap(attr_name=sort_by).table + + CI_table = query_sql.subquery() + query_sql = db.session.query(CI_table.c.ci_id, Table.value).join( + Table, Table.ci_id == CI_table.c.ci_id).filter( + Table.attr_id == attr_id).order_by( + getattr(Table.value, sort_type)()) + + return query_sql + + def _query_wrap_for_device(self, query_sql, **kwargs): + _type = kwargs.pop("_type", False) or kwargs.pop("type", False) \ + or kwargs.pop("ci_type", False) + if _type: + ci_type = CITypeCache.get(_type) + if ci_type is None: + return + query_sql = query_sql.filter(CI.type_id == ci_type.type_id) + + for k, v in kwargs.iteritems(): + attr = CIAttributeCache.get(k) + if attr is None: + continue + Table = TableMap(attr_name=k).table + CI_table = query_sql.subquery() + query_sql = db.session.query(CI_table.c.ci_id).join( + Table, Table.ci_id == CI_table.c.ci_id).filter( + Table.attr_id == attr.attr_id).filter( + Table.value.ilike(v.replace("*", "%"))) + + current_app.logger.debug(query_sql) + sort_by = kwargs.pop("sort", False) + if sort_by: + query_sql = self._sort_handler(sort_by, query_sql) + return query_sql + + def get_great_grandsons(self, ci_id, page=1, per_page=None, **kwargs): + if per_page is None: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + + children = db.session.query(CIRelation.second_ci_id).filter( + CIRelation.first_ci_id == ci_id).subquery() + grandsons = db.session.query(CIRelation.second_ci_id).join( + children, + children.c.second_ci_id == CIRelation.first_ci_id).subquery() + great_grandsons = db.session.query(CIRelation.second_ci_id).join( + grandsons, + grandsons.c.second_ci_id == CIRelation.first_ci_id).subquery() + great_grandsons = db.session.query(CI.ci_id).join( + great_grandsons, great_grandsons.c.second_ci_id == CI.ci_id) + if kwargs: + great_grandsons = self._query_wrap_for_device( + great_grandsons, **kwargs) + if great_grandsons is None: + return 0, 0, [] + numfound = great_grandsons.count() + great_grandsons = great_grandsons.offset( + (page - 1) * per_page).limit(per_page).all() + ci_ids = [str(son.ci_id) for son in great_grandsons] + total = len(ci_ids) + result = get_cis_by_ids(ci_ids) + + return numfound, total, result + + def get_first_cis(self, second_ci, relation_type="contain", + page=1, per_page=None): + """only for CI Type + """ + if per_page is None: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + first_cis = db.session.query(CIRelation.first_ci_id).filter( + CIRelation.second_ci_id == second_ci).filter( + CIRelation.relation_type == relation_type) + numfound = first_cis.count() + first_cis = first_cis.offset( + (page - 1) * per_page).limit(per_page).all() + result = [] + first_ci_ids = [str(first_ci.first_ci_id) for first_ci in first_cis] + total = len(first_ci_ids) + if first_ci_ids: + result = get_cis_by_ids(first_ci_ids) + return numfound, total, result + + def get_grandfather(self, ci_id, relation_type="contain"): + """only for CI Type + """ + grandfather = db.session.query(CIRelation.first_ci_id).filter( + CIRelation.second_ci_id.in_(db.session.query( + CIRelation.first_ci_id).filter( + CIRelation.second_ci_id == ci_id).filter( + CIRelation.relation_type == relation_type))).filter( + CIRelation.relation_type == relation_type).first() + if grandfather: + return CIManager().get_ci_by_id(grandfather.first_ci_id, + need_children=False) + + def add(self, first_ci, second_ci, more=None, relation_type="contain"): + ci = db.session.query(CI.ci_id).filter(CI.ci_id == first_ci).first() + if ci is None: + return abort(404, "first_ci {0} is not existed".format(first_ci)) + c = db.session.query(CI.ci_id).filter(CI.ci_id == second_ci).first() + if c is None: + return abort(404, "second_ci {0} is not existed".format( + second_ci)) + existed = db.session.query(CIRelation.cr_id).filter( + CIRelation.first_ci_id == first_ci).filter( + CIRelation.second_ci_id == second_ci).first() + if existed is not None: + return existed.cr_id + cr = CIRelation() + cr.first_ci_id = first_ci + cr.second_ci_id = second_ci + if more is not None: + cr.more = more + cr.relation_type = relation_type + db.session.add(cr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("add CIRelation is error, {0}".format( + str(e))) + return abort(500, "add CIRelation is error, {0}".format(str(e))) + # write history + his_manager = CIRelationHistoryManager() + his_manager.add(cr.cr_id, cr.first_ci_id, cr.second_ci_id, + relation_type, operate_type="add") + return cr.cr_id + + def delete(self, cr_id): + cr = db.session.query(CIRelation).filter( + CIRelation.cr_id == cr_id).first() + cr_id = cr.cr_id + first_ci = cr.first_ci_id + second_ci = cr.second_ci_id + if cr is not None: + db.session.delete(cr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "delete CIRelation is error, {0}".format(str(e))) + return abort( + 500, "delete CIRelation is error, {0}".format(str(e))) + his_manager = CIRelationHistoryManager() + his_manager.add(cr_id, first_ci, second_ci, + cr.relation_type, operate_type="delete") + return True + return abort(404, "CI relation is not existed") + + def delete_2(self, first_ci, second_ci): + cr = db.session.query(CIRelation).filter( + CIRelation.first_ci_id == first_ci).filter( + CIRelation.second_ci_id == second_ci).first() + return self.delete(cr.cr_id) + + +class HostNumStatis(object): + def __init__(self): + pass + + def get_hosts_by_project(self, project_id_list=None): + res = {} + if not project_id_list: + project = CITypeCache.get("project") + projects = db.session.query(CI.ci_id).filter( + CI.type_id == project.type_id).all() + project_id_list = (project.ci_id for project in projects) + project_id_list = map(str, project_id_list) + project_ids = ",".join(project_id_list) + nums = db.session.execute(QUERY_HOSTS_NUM_BY_PROJECT.format( + "".join(["(", project_ids, ")"]))).fetchall() + if nums: + for ci_id in project_id_list: + res[int(ci_id)] = 0 + for ci_id, num in nums: + res[ci_id] = num + return res + + def get_hosts_by_product(self, product_id_list=None): + res = {} + if not product_id_list: + product = CITypeCache.get("product") + products = db.session.query(CI.ci_id).filter( + CI.type_id == product.type_id).all() + product_id_list = (product.ci_id for product in products) + product_id_list = map(str, product_id_list) + product_ids = ",".join(product_id_list) + nums = db.session.execute(QUERY_HOSTS_NUM_BY_PRODUCT.format( + "".join(["(", product_ids, ")"]))).fetchall() + if nums: + for ci_id in product_id_list: + res[int(ci_id)] = 0 + for ci_id, num in nums: + res[ci_id] = num + return res + + def get_hosts_by_bu(self, bu_id_list=None): + res = {} + if not bu_id_list: + bu = CITypeCache.get("bu") + bus = db.session.query(CI.ci_id).filter( + CI.type_id == bu.type_id).all() + bu_id_list = (bu.ci_id for bu in bus) + bu_id_list = map(str, bu_id_list) + bu_ids = ",".join(bu_id_list) + current_app.logger.debug(QUERY_HOSTS_NUM_BY_BU.format( + "".join(["(", bu_ids, ")"]))) + if not bu_ids: + return res + nums = db.session.execute( + QUERY_HOSTS_NUM_BY_BU.format( + "".join(["(", bu_ids, ")"]))).fetchall() + if nums: + for ci_id in bu_id_list: + res[int(ci_id)] = 0 + for ci_id, num in nums: + res[ci_id] = num + return res + + +def get_cis_by_ids(ci_ids, ret_key="name", fields="", value_tables=None): + """ argument ci_ids are string list of CI instance ID, eg. ['1', '2'] + """ + if not ci_ids: + return [] + start = time.time() + ci_id_tuple = tuple(map(int, ci_ids)) + res = rd.get(ci_id_tuple) + if res is not None and None not in res and ret_key == "name": + res = map(json.loads, res) + if not fields: + return res + else: + _res = [] + for d in res: + _d = dict() + _d["_id"], _d["_type"] = d.get("_id"), d.get("_type") + _d["ci_type"] = d.get("ci_type") + for field in fields: + _d[field] = d.get(field) + _res.append(_d) + current_app.logger.debug("filter time: %s" % (time.time() - start)) + return _res + current_app.logger.warning("cache not hit...............") + if not fields: + _fields = "" + else: + _fields = list() + for field in fields: + attr = CIAttributeCache.get(field) + if attr is not None: + _fields.append(str(attr.attr_id)) + _fields = "WHERE A.attr_id in ({0})".format(",".join(_fields)) + ci_ids = ",".join(ci_ids) + if value_tables is None: + value_tables = type_map["table_name"].values() + current_app.logger.debug(value_tables) + value_sql = " UNION ".join([QUERY_CIS_BY_VALUE_TABLE.format(value_table, + ci_ids) + for value_table in value_tables]) + query_sql = QUERY_CIS_BY_IDS.format(ci_ids, _fields, value_sql) + current_app.logger.debug(query_sql) + start = time.time() + hosts = db.session.execute(query_sql).fetchall() + current_app.logger.info("get cis time is: {0}".format( + time.time() - start)) + + ci_list = set() + res = list() + ci_dict = dict() + start = time.time() + for ci_id, type_id, attr_id, attr_name, \ + attr_alias, value, value_type, is_multivalue in hosts: + if ci_id not in ci_list: + ci_dict = dict() + ci_type = CITypeSpecCache.get(type_id) + ci_dict["_id"] = ci_id + ci_dict["_type"] = type_id + ci_dict["ci_type"] = ci_type.type_name + ci_dict["ci_type_alias"] = ci_type.type_alias + ci_list.add(ci_id) + res.append(ci_dict) + if ret_key == "name": + if is_multivalue: + if isinstance(ci_dict.get(attr_name), list): + ci_dict[attr_name].append(value) + else: + ci_dict[attr_name] = [value] + else: + ci_dict[attr_name] = value + elif ret_key == "alias": + if is_multivalue: + if isinstance(ci_dict.get(attr_alias), list): + ci_dict[attr_alias].append(value) + else: + ci_dict[attr_alias] = [value] + else: + ci_dict[attr_alias] = value + elif ret_key == "id": + if is_multivalue: + if isinstance(ci_dict.get(attr_id), list): + ci_dict[attr_id].append(value) + else: + ci_dict[attr_id] = [value] + else: + ci_dict[attr_id] = value + + current_app.logger.debug("result parser time is: {0}".format( + time.time() - start)) + return res \ No newline at end of file diff --git a/lib/ci_type.py b/lib/ci_type.py new file mode 100644 index 0000000..728beed --- /dev/null +++ b/lib/ci_type.py @@ -0,0 +1,315 @@ +# -*- coding:utf-8 -*- + + +from flask import current_app +from flask import abort + +from extensions import db +from models import row2dict +from models.ci_type import CITypeAttribute +from models.ci_type import CIType +from models.ci_type import CITypeAttributeCache +from models.ci_type import CITypeCache +from models.ci_type_relation import CITypeRelation +from models.attribute import CIAttributeCache +from lib.attribute import AttributeManager + + +class CITypeAttributeManager(object): + """ + manage CIType's attributes, include query, add, update, delete + """ + + def __init__(self): + pass + + def get_attributes_by_type_id(self, type_id): + attrs = CITypeAttributeCache.get(type_id) + attr_manager = AttributeManager() + result = list() + for attr in attrs: + attr_dict = attr_manager.get_attribute_by_id(attr.attr_id) + attr_dict["is_required"] = attr.is_required + result.append(attr_dict) + return result + + def add(self, type_id, attr_ids=None, is_required=False): + """ + add attributes to CIType, attr_ids are list + """ + if not attr_ids or not isinstance(attr_ids, list): + return abort(500, "attr_ids must be required") + ci_type = CITypeCache.get(type_id) + if ci_type is None: + return abort(404, "CIType ID({0}) is not existed".format(type_id)) + for attr_id in attr_ids: + attr = CIAttributeCache.get(attr_id) + if attr is None: + return abort(404, + "attribute id {0} is not existed".format(attr_id)) + existed = db.session.query(CITypeAttribute.attr_id).filter_by( + type_id=type_id).filter_by(attr_id=attr_id).first() + if existed is not None: + continue + current_app.logger.debug(attr_id) + db.session.add(CITypeAttribute( + type_id=type_id, attr_id=attr_id, is_required=is_required)) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "add attribute to CIType is error, {0}".format(str(e))) + return abort( + 500, "add attribute to CIType is error, maybe duplicate entry") + + CITypeAttributeCache.clean(type_id) + return True + + def delete(self, type_id, attr_ids=None): + """ + delete attributes at CIType, attr_ids are list + """ + if not attr_ids or not isinstance(attr_ids, list): + return abort( + 500, "delete attribute of CIType, attr_ids must be required") + ci_type = CITypeCache.get(type_id) + if ci_type is None: + return abort( + 404, "CIType ID({0}) is not existed".format(type_id)) + for attr_id in attr_ids: + attr = CIAttributeCache.get(attr_id) + if attr is None: + return abort( + 404, "attribute id {0} is not existed".format(attr_id)) + db.session.query(CITypeAttribute).filter_by( + type_id=type_id).filter_by(attr_id=attr_id).delete() + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "delete attributes of CIType is error, {0}".format(str(e))) + return abort(500, "delete attributes of CIType is error") + CITypeAttributeCache.clean(type_id) + return True + + +class CITypeManager(object): + """ + manage CIType + """ + + def __init__(self): + pass + + def get_citypes(self, type_name=None): + ci_types = db.session.query(CIType).all() if type_name is None else \ + db.session.query(CIType).filter( + CIType.type_name.ilike("%{0}%".format(type_name))).all() + res = list() + for ci_type in ci_types: + type_dict = row2dict(ci_type) + type_dict["uniq_key"] = CIAttributeCache.get( + type_dict["uniq_id"]).attr_name + res.append(type_dict) + return res + + def query(self, _type): + citype = CITypeCache.get(_type) + if citype: + return row2dict(citype) + return abort(404, "citype is not found") + + def add(self, type_name, type_alias, _id=None, unique=None, + icon_url="", enabled=True): + uniq_key = CIAttributeCache.get(_id) or CIAttributeCache.get(unique) + if uniq_key is None: + return False, "uniq_key is not existed" + citype = CITypeCache.get(type_name) + if citype: + return False, "this CIType {0} is existed".format(type_name) + _citype = CIType() + _citype.type_name = type_name + _citype.type_alias = type_alias + _citype.uniq_id = uniq_key.attr_id + _citype.enabled = enabled + _citype.icon_url = icon_url + db.session.add(_citype) + db.session.flush() + _citype_attr = CITypeAttribute() + _citype_attr.attr_id = uniq_key.attr_id + _citype_attr.type_id = _citype.type_id + _citype_attr.is_required = True + db.session.add(_citype_attr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("add CIType is error, {0}".format(str(e))) + return False, str(e) + CITypeCache.clean(type_name) + return True, _citype.type_id + + def update(self, type_id, type_name, type_alias, _id=None, unique=None, + icon_url="", enabled=None): + citype = CITypeCache.get(type_id) + if citype is None: + return False, "CIType {0} is not existed".format(type_name) + uniq_key = CIAttributeCache.get(_id) or CIAttributeCache.get(unique) + if uniq_key is not None: + citype.uniq_id = uniq_key.attr_id + citype_attr = db.session.query(CITypeAttribute).filter( + CITypeAttribute.type_id == type_id).filter( + CITypeAttribute.attr_id == uniq_key.attr_id).first() + if citype_attr is None: + citype_attr = CITypeAttribute() + citype_attr.attr_id = uniq_key.attr_id + citype_attr.type_id = type_id + citype_attr.is_required = True + db.session.add(citype_attr) + if type_name: + citype.type_name = type_name + if type_alias: + citype.type_alias = type_alias + if icon_url: + citype.icon_url = icon_url + if enabled is not None: + citype.enabled = enabled + db.session.add(citype) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("add CIType is error, {0}".format(str(e))) + return False, str(e) + CITypeCache.clean(type_id) + return True, type_id + + def set_enabled(self, type_id, enabled=True): + citype = CITypeCache.get(type_id) + if citype is None: + return abort(404, "CIType[{0}] is not existed".format(type_id)) + citype.enabled = enabled + db.session.add(citype) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "set CIType enabled is error, {0}".format(str(e))) + return abort(500, str(e)) + return type_id + + def delete(self, type_id): + citype = db.session.query(CIType).filter_by(type_id=type_id).first() + type_name = citype.type_name + if citype: + db.session.delete(citype) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "delete CIType is error, {0}".format(str(e))) + return abort(500, str(e)) + CITypeCache.clean(type_id) + return "CIType {0} deleted".format(type_name) + return abort(404, "CIType is not existed") + + +class CITypeRelationManager(object): + """ + manage relation between CITypes + """ + + def __init__(self): + pass + + @property + def relation_types(self): + """ all CIType relation types + """ + from lib.const import CITYPE_RELATION_TYPES + + return CITYPE_RELATION_TYPES + + def get_children(self, parent_id): + children = db.session.query(CITypeRelation).filter( + CITypeRelation.parent_id == parent_id).all() + result = [] + for child in children: + ctr_id = child.ctr_id + citype = CITypeCache.get(child.child_id) + citype_dict = row2dict(citype) + citype_dict["ctr_id"] = ctr_id + manager = CITypeAttributeManager() + citype_dict["attributes"] = manager.get_attributes_by_type_id( + citype.type_id) + citype_dict["relation_type"] = child.relation_type + result.append(citype_dict) + return result + + def get_parents(self, child_id): + parents = db.session.query(CITypeRelation).filter( + CITypeRelation.child_id == child_id).all() + result = [] + for parent in parents: + ctr_id = parent.ctr_id + citype = CITypeCache.get(parent.parent_id) + citype_dict = row2dict(citype) + citype_dict["ctr_id"] = ctr_id + manager = CITypeAttributeManager() + citype_dict["attributes"] = manager.get_attributes_by_type_id( + citype.type_id) + citype_dict["relation_type"] = parent.relation_type + result.append(citype_dict) + return result + + def add(self, parent, child, relation_type="contain"): + p = CITypeCache.get(parent) + if p is None: + return abort(404, "parent {0} is not existed".format(parent)) + c = CITypeCache.get(child) + if c is None: + return abort(404, "child {0} is not existed".format(child)) + existed = db.session.query(CITypeRelation.ctr_id).filter_by( + parent_id=parent).filter_by(child_id=child).first() + if existed is not None: + return True, existed.ctr_id + ctr = CITypeRelation() + ctr.parent_id = parent + ctr.child_id = child + ctr.relation_type = relation_type + db.session.add(ctr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "add CITypeRelation is error, {0}".format(str(e))) + return abort( + 500, "add CITypeRelation is error, {0}".format(str(e))) + return ctr.ctr_id + + def delete(self, ctr_id): + ctr = db.session.query(CITypeRelation).filter( + CITypeRelation.ctr_id == ctr_id).first() + if ctr: + db.session.delete(ctr) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "delete CITypeRelation is error, {0}".format(str(e))) + return abort( + 500, "delete CITypeRelation is error, {0}".format(str(e))) + return True + return abort(404, "CIType relation is not existed") + + def delete_2(self, parent, child): + ctr = db.session.query(CITypeRelation).filter( + CITypeRelation.parent_id == parent).filter( + CITypeRelation.child_id == child).first() + return self.delete(ctr.ctr_id) \ No newline at end of file diff --git a/lib/const.py b/lib/const.py new file mode 100644 index 0000000..51409a4 --- /dev/null +++ b/lib/const.py @@ -0,0 +1,99 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from models.attribute import TextChoice +from models.attribute import FloatChoice +from models.attribute import IntegerChoice +from models.attribute import CIAttributeCache +from models.ci_value import CIValueText +from models.ci_value import CIValueInteger +from models.ci_value import CIValueFloat +from models.ci_value import CIValueDateTime +from models.ci_value import CIIndexValueDateTime +from models.ci_value import CIIndexValueFloat +from models.ci_value import CIIndexValueInteger +from models.ci_value import CIIndexValueText + + +def string2int(x): + return int(float(x)) + + +def str2datetime(x): + try: + v = datetime.datetime.strptime(x, "%Y-%m-%d") + return v + except ValueError: + pass + try: + v = datetime.datetime.strptime(x, "%Y-%m-%d %H:%M:%S") + return v + except ValueError: + pass + raise ValueError + + +type_map = { + 'converter': { + 'int': string2int, + 'float': float, + 'text': unicode, + 'datetime': str2datetime, + }, + 'choice': { + 'int': IntegerChoice, + 'float': FloatChoice, + 'text': TextChoice, + }, + 'table': { + 'int': CIValueInteger, + 'text': CIValueText, + 'datetime': CIValueDateTime, + 'float': CIValueFloat, + 'index_int': CIIndexValueInteger, + 'index_text': CIIndexValueText, + 'index_datetime': CIIndexValueDateTime, + 'index_float': CIIndexValueFloat, + }, + 'table_name': { + 'int': 'integers', + 'text': 'texts', + 'datetime': 'datetime', + 'float': 'floats', + 'index_int': 'index_integers', + 'index_text': 'index_texts', + 'index_datetime': 'index_datetime', + 'index_float': 'index_floats', + } +} + + +class TableMap(): + def __init__(self, attr_name=None): + self.attr_name = attr_name + + @property + def table(self): + if self.attr_name is not None: + attr = CIAttributeCache.get(self.attr_name) + if attr.is_index: + i = "index_{0}".format(attr.value_type) + else: + i = attr.value_type + return type_map["table"].get(i) + + @property + def table_name(self): + if self.attr_name is not None: + attr = CIAttributeCache.get(self.attr_name) + if attr.is_index: + i = "index_{0}".format(attr.value_type) + else: + i = attr.value_type + return type_map["table_name"].get(i) + + +CITYPE_RELATION_TYPES = ["connect", "deploy", "install", "contain"] +CI_RELATION_TYPES = ["connect", "deploy", "install", "contain"] \ No newline at end of file diff --git a/lib/decorator.py b/lib/decorator.py new file mode 100644 index 0000000..8cafba7 --- /dev/null +++ b/lib/decorator.py @@ -0,0 +1,74 @@ +# -*- coding:utf-8 -*- + + +import time +from functools import wraps + +from flask import request +from flask import render_template +from flask import current_app + +from lib.exception import InvalidUsageError + + +def templated(template=None): + def decorator(f): + @wraps(f) + def decorated_function(*args, **kwargs): + template_name = template + if template_name is None: + template_name = request.endpoint.replace('.', '/') + '.html' + ctx = f(*args, **kwargs) + if ctx is None: + ctx = {} + elif not isinstance(ctx, dict): + return ctx + return render_template(template_name, **ctx) + + return decorated_function + + return decorator + + +def argument_required1(*args_required): + from manage import InvalidUsageError + + def decorator(f): + @wraps(f) + def decorated_function(*args, **kwargs): + for arg in args_required: + if request.values.get(arg, None) is None: + raise InvalidUsageError( + "argument {0} is required".format(arg), 400) + return f(*args, **kwargs) + + return decorated_function + + return decorator + + +class argument_required(object): + def __init__(self, *args): + self.args = args + + def __enter__(self): + for arg in self.args: + if not request.values.get(arg): + raise InvalidUsageError( + "argument {0} is required".format(arg), status_code=400) + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + +def url_statistic(f): + @wraps(f) + def decorated_func(*args, **kwargs): + start = time.time() + r = f(*args, **kwargs) + spend = time.time() - start + url = request.path + current_app.logger.info(url) + current_app.logger.info(spend) + return r + return decorated_func \ No newline at end of file diff --git a/lib/exception.py b/lib/exception.py new file mode 100644 index 0000000..a11af85 --- /dev/null +++ b/lib/exception.py @@ -0,0 +1,17 @@ +# -*- coding:utf-8 -*- + + +class InvalidUsageError(Exception): + status_code = 400 + + def __init__(self, message, status_code=None, payload=None): + Exception.__init__(self) + self.message = message + if status_code is not None: + self.status_code = status_code + self.payload = payload + + def to_dict(self): + rv = dict(self.payload or ()) + rv['message'] = self.message + return rv \ No newline at end of file diff --git a/lib/history.py b/lib/history.py new file mode 100644 index 0000000..ebcef62 --- /dev/null +++ b/lib/history.py @@ -0,0 +1,75 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from flask import current_app +from flask import g + +from extensions import db +from models.history import OperationRecord +from models.history import CIAttributeHistory +from models.history import CIRelationHistory + + +class CIAttributeHistoryManger(object): + def __init__(self): + pass + + def add(self, ci_id, history_list): + if history_list: + record = OperationRecord() + record.uid = g.user.uid + record.timestamp = datetime.datetime.now() + db.session.add(record) + db.session.commit() + for attr_id, operate_type, old, new in history_list: + history = CIAttributeHistory() + history.attr_id = attr_id + history.operate_type = operate_type + history.old = old + history.new = new + history.ci_id = ci_id + history.record_id = record.record_id + db.session.add(history) + + try: + db.session.commit() + except Exception as e: + db.session.rollback() + db.session.rollback() + current_app.logger.error( + "add attribute history error, {0}".format(str(e))) + return False, "add attribute history error, {0}".format(str(e)) + return True, None + + +class CIRelationHistoryManager(object): + def __init__(self): + pass + + def add(self, relation, first_ci, second_ci, + relation_type, operate_type="add"): + record = OperationRecord() + record.uid = g.user.uid + record.timestamp = datetime.datetime.now() + db.session.add(record) + db.session.flush() + + history = CIRelationHistory() + history.relation = relation + history.record_id = record.record_id + history.operate_type = operate_type + history.first_ci_id = first_ci + history.second_ci_id = second_ci + history.relation_type = relation_type + db.session.add(history) + + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "add relation history is error, {0}".format(str(e))) + return False, "add relation history is error, {0}".format(str(e)) + return True, None diff --git a/lib/mail.py b/lib/mail.py new file mode 100644 index 0000000..57d8e03 --- /dev/null +++ b/lib/mail.py @@ -0,0 +1,86 @@ +# -*- coding:utf-8 -*- + + +import requests + +from flask import current_app +from flask.ext.mail import Message + +from extensions import mail +from models.account import User + + +def sendmail(users, subject, message, html=False, app=None): + if app: + mail.app = app + else: + app = current_app + recipients = [x.email for x in users if isinstance(x, User)] + recipients.extend( + [x for x in users if isinstance(x, basestring) and '@' in x]) + sender = app.config.get('DEFAULT_MAIL_SENDER') + if html: + msg = Message(recipients=recipients, + html=message, + subject=subject, + sender=sender) + else: + msg = Message(recipients=recipients, + body=message, + subject=subject, + sender=sender) + mail.send(msg) + + +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from email.header import Header +from email.mime.image import MIMEImage +import smtplib +import time +from email import Utils + + +def send_mail(sender, receiver, subject, content, ctype="html", pics=(), + smtpserver='mail.51ping.com', + username="networkbench@51ping.com", password="12qwaszx"): + """subject and body are unicode objects""" + if ctype == "html": + msg = MIMEText(content, 'html', 'utf-8') + else: + msg = MIMEText(content, 'plain', 'utf-8') + + if len(pics) != 0: + msgRoot = MIMEMultipart('related') + msgText = MIMEText(content, 'html', 'utf-8') + msgRoot.attach(msgText) + i = 1 + for pic in pics: + fp = open(pic, "rb") + image = MIMEImage(fp.read()) + fp.close() + image.add_header('Content-ID', '' % i) + msgRoot.attach(image) + i += 1 + msg = msgRoot + + msg['Subject'] = Header(subject, 'utf-8') + msg['From'] = sender + msg['To'] = ';'.join(receiver) + msg['Message-ID'] = Utils.make_msgid() + msg['date'] = time.strftime('%a, %d %b %Y %H:%M:%S %z') + + smtp = smtplib.SMTP() + smtp.connect(smtpserver, 25) + smtp.login(username, password) + smtp.sendmail(sender, receiver, msg.as_string()) + smtp.quit() + + +def send_sms(mobile, content): + sms_uri = current_app.config.get("SMS_URI") % (mobile, content) + try: + current_app.logger.info(sms_uri) + requests.get(sms_uri) + except Exception as e: + current_app.logger.error("send sms error, %s" % str(e)) \ No newline at end of file diff --git a/lib/query_sql.py b/lib/query_sql.py new file mode 100644 index 0000000..960f02b --- /dev/null +++ b/lib/query_sql.py @@ -0,0 +1,107 @@ +# -*- coding:utf-8 -*- + + +QUERY_HOSTS_BY_APP = """ + SELECT * + FROM cis + INNER JOIN ci_relations AS cr ON cis.`ci_id`=cr.`second_ci` + WHERE cr.`first_ci` = {0:d} LIMIT {1:d}, {2:d}; +""" + +QUERY_HOSTS_NUM_BY_PROJECT = """ + SELECT cr.first_ci_id, + count(DISTINCT cr.second_ci_id) + FROM ci_relations AS cr + WHERE cr.first_ci_id IN {0} + GROUP BY cr.first_ci_id +""" + +QUERY_HOSTS_NUM_BY_BU = """ + SELECT B.first_ci_id, + count(DISTINCT cr.second_ci_id) + FROM + (SELECT A.first_ci_id, + cr.second_ci_id + FROM + (SELECT cr.first_ci_id, + cis.ci_id + FROM cis + INNER JOIN ci_relations AS cr ON cis.ci_id=cr.second_ci_id + WHERE cr.first_ci_id IN {0}) AS A + INNER JOIN ci_relations AS cr ON cr.first_ci_id=A.ci_id) AS B + INNER JOIN ci_relations AS cr ON B.second_ci_id=cr.first_ci_id + GROUP BY B.first_ci_id +""" + +QUERY_HOSTS_NUM_BY_PRODUCT = """ + SELECT A.first_ci_id, + count(DISTINCT cr.second_ci_id) + FROM + (SELECT cr.first_ci_id, + cis.ci_id + FROM cis + INNER JOIN ci_relations AS cr ON cis.ci_id=cr.second_ci_id + WHERE cr.first_ci_id IN {0}) AS A + INNER JOIN ci_relations AS cr ON cr.first_ci_id=A.ci_id + GROUP BY A.first_ci_id; +""" + +QUERY_CIS_BY_VALUE_TABLE = """ + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + {0}.ci_id, + {0}.attr_id, + {0}.value + FROM {0} + INNER JOIN cis ON {0}.ci_id=cis.ci_id + AND {0}.`ci_id` IN ({1}) + INNER JOIN ci_attributes as attr ON attr.attr_id = {0}.attr_id +""" + +QUERY_CIS_BY_IDS = """ + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ({2}) AS A {1} + ORDER BY A.ci_id; +""" + +FACET_QUERY1 = """ + SELECT {0}.value, + count({0}.ci_id) + FROM {0} + INNER JOIN ci_attributes AS attr ON attr.attr_id={0}.attr_id + WHERE attr.attr_name="{1}" + GROUP BY {0}.ci_id; +""" + +FACET_QUERY = """ + SELECT {0}.value, + count({0}.ci_id) + FROM {0} + INNER JOIN ({1}) AS B ON B.ci_id={0}.ci_id + WHERE {0}.attr_id={2:d} + GROUP BY {0}.ci_id +""" + +QUERY_CI_BY_ATTR_NAME = """ + SELECT {0}.ci_id + FROM {0} + WHERE {0}.attr_id={1:d} + AND {0}.value {2} +""" + +QUERY_CI_BY_TYPE = """ + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in ({0}) +""" \ No newline at end of file diff --git a/lib/search.py b/lib/search.py new file mode 100644 index 0000000..341950d --- /dev/null +++ b/lib/search.py @@ -0,0 +1,348 @@ +# -*- coding:utf-8 -*- + + +import time + +from flask import current_app + +from lib.const import TableMap +from models.attribute import CIAttributeCache +from models.ci_type import CITypeCache +from extensions import db +from models import CI +from lib.ci import get_cis_by_ids +from lib.query_sql import FACET_QUERY +from lib.query_sql import QUERY_CI_BY_TYPE +from lib.query_sql import QUERY_CI_BY_ATTR_NAME + + +class SearchError(Exception): + def __init__(self, v): + self.v = v + + def __str__(self): + return self.v + + +class Search(object): + def __init__(self, query=None, fl=None, facet_field=None, + page=1, ret_key="name", count=1, sort=None): + self.orig_query = query + self.fl = fl + self.facet_field = facet_field + self.page = page + self.ret_key = ret_key + try: + self.count = int(count) + except ValueError: + self.count = current_app.config.get("DEFAULT_PAGE_COUNT") + self.sort = sort + self.query_sql = "" + self.type_id_list = [] + + def tor_proc(self, key): + tor = list() + if key.startswith("+"): + tor.append('&') + key = key[1:].strip() + elif key.startswith("-"): + tor.append('|') + key = key[1:].strip() + elif key.startswith("~"): + tor.append('~') + key = key[1:].strip() + if not tor: + tor = ['&', ''] + if len(tor) < 2: + tor.append('') + return tor, key + + def attr_name_proc(self, key): + tor, key = self.tor_proc(key) + if key in ('ci_type', 'type', '_type'): + return '_type', 'text', tor, None + if key in ('id', 'ci_id', '_id'): + return '_id', 'text', tor, None + attr = CIAttributeCache.get(key) + if attr is not None: + # if not attr.is_index: + # raise SearchError("{0} is not indexed".format(attr.attr_name)) + field_name = attr.attr_name + return field_name, attr.value_type, tor, attr + else: + raise SearchError("{0} is not existed".format(key)) + + def type_query_handler(self, v, only_type_query): + new_v = [v] + if v.startswith("(") and v.endswith(")"): + new_v = v[1:-1].split(";") + for _v in new_v: + ci_type = CITypeCache.get(_v) + if ci_type is not None: + self.type_id_list.append(str(ci_type.type_id)) + if self.type_id_list: + type_ids = ",".join(self.type_id_list) + _query_sql = QUERY_CI_BY_TYPE.format(type_ids) + if only_type_query: + return _query_sql + else: + return "" + return "" + + def in_query_handler(self, attr, v): + new_v = v[1:-1].split(";") + table_name = TableMap(attr_name=attr.attr_name).table_name + _query_sql = QUERY_CI_BY_ATTR_NAME.format( + table_name, attr.attr_id, + " OR {0}.value ".format(table_name).join(['LIKE "{0}"'.format( + _v.replace("*", "%")) for _v in new_v])) + return _query_sql + + def range_query_handler(self, attr, v): + start, end = [x.strip() for x in v[1:-1].split("_TO_")] + table_name = TableMap(attr_name=attr.attr_name).table_name + _query_sql = QUERY_CI_BY_ATTR_NAME.format( + table_name, attr.attr_id, "BETWEEN '{0}' AND '{1}'".format( + start.replace("*", "%"), end.replace("*", "%"))) + return _query_sql + + def comparison_query_handler(self, attr, v): + table_name = TableMap(attr_name=attr.attr_name).table_name + if (v.startswith("<") and not v.startswith("<=")) or \ + (v.startswith(">") and not v.startswith(">=")): + _query_sql = QUERY_CI_BY_ATTR_NAME.format( + table_name, attr.attr_id, "{0} '{1}'".format( + v[0], v[1:].replace("*", "%"))) + elif v.startswith(">=") or v.startswith("<="): + _query_sql = QUERY_CI_BY_ATTR_NAME.format( + table_name, attr.attr_id, "{0} '{1}'".format( + v[:2], v[2:].replace("*", "%"))) + return _query_sql + + def sort_query_handler(self, field, query_sql, only_type_query): + if field is None: + field = "" + if field.startswith("+"): + field = field[1:] + sort_type = "ASC" + elif field.startswith("-"): + field = field[1:] + sort_type = "DESC" + else: + sort_type = "ASC" + + if field in ("_id", "ci_id") or not field: + if only_type_query: + return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ({0}) AS B {1}""".format( + query_sql, + "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( + (self.page - 1) * self.count, sort_type, self.count)) + elif self.type_id_list: + return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ({0}) AS B {1}""".format( + query_sql, + "INNER JOIN cis on cis.ci_id=B.ci_id " + "WHERE cis.type_id in ({3}) " + "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( + (self.page - 1) * self.count, sort_type, self.count, + ",".join(self.type_id_list))) + else: + return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ({0}) AS B {1}""".format( + query_sql, + "INNER JOIN cis on cis.ci_id=B.ci_id " + "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( + (self.page - 1) * self.count, sort_type, self.count)) + else: + attr = CIAttributeCache.get(field) + attr_id = attr.attr_id + + table_name = TableMap(attr_name=attr.attr_name).table_name + _v_query_sql = """SELECT {0}.ci_id, {1}.value FROM + ({2}) AS {0} INNER JOIN {1} ON {1}.ci_id = {0}.ci_id + WHERE {1}.attr_id = {3}""".format("ALIAS", table_name, + query_sql, attr_id) + new_table = _v_query_sql + if only_type_query: + return "SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id " \ + "FROM ({0}) AS C " \ + "ORDER BY C.value {2} " \ + "LIMIT {1:d}, {3};".format(new_table, + (self.page - 1) * self.count, + sort_type, self.count) + elif self.type_id_list: + return """SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id + FROM ({0}) AS C + INNER JOIN cis on cis.ci_id=C.ci_id + WHERE cis.type_id in ({4}) + ORDER BY C.value {2} + LIMIT {1:d}, {3};""".format(new_table, + (self.page - 1) * self.count, + sort_type, self.count, + ",".join(self.type_id_list)) + else: + return """SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id + FROM ({0}) AS C + ORDER BY C.value {2} + LIMIT {1:d}, {3};""".format(new_table, + (self.page - 1) * self.count, + sort_type, self.count) + + def _wrap_sql(self, tor, alias, _query_sql, query_sql): + if tor[0] == "&": + query_sql = """SELECT * FROM ({0}) as {1} + INNER JOIN ({2}) as {3} USING(ci_id)""".format( + query_sql, alias, _query_sql, alias + "A") + elif tor[0] == "|": + query_sql = "SELECT * FROM ({0}) as {1} UNION ALL ({2})".format( + query_sql, alias, _query_sql) + elif tor[0] == "~": + query_sql = "SELECT * FROM ({0}) as {1} LEFT JOIN ({2}) as {3} " \ + "USING(ci_id) WHERE {3}.ci_id is NULL".format( + query_sql, alias, _query_sql, alias + "A") + return query_sql + + def _execute_sql(self, query_sql, only_type_query): + v_query_sql = self.sort_query_handler(self.sort, query_sql, + only_type_query) + start = time.time() + execute = db.session.execute + current_app.logger.debug(v_query_sql) + res = execute(v_query_sql).fetchall() + end_time = time.time() + current_app.logger.debug("query ci ids time is: {0}".format( + end_time - start)) + numfound = execute("SELECT FOUND_ROWS();").fetchall()[0][0] + current_app.logger.debug("statistics ci ids time is: {0}".format( + time.time() - end_time) + ) + return numfound, res + + def query_build_raw(self): + query_sql, alias, tor = "", "A", ["&"] + is_first = True + only_type_query = False + queries = self.orig_query.split(",") + queries = filter(lambda x: x != "", queries) + for q in queries: + if q.startswith("_type"): + queries.remove(q) + queries.insert(0, q) + if len(queries) == 1 or queries[1].startswith("-") or \ + queries[1].startswith("~"): + only_type_query = True + break + current_app.logger.debug(queries) + special = True + for q in queries: + _query_sql = "" + if ":" in q: + k = q.split(":")[0].strip() + v = ":".join(q.split(":")[1:]).strip() + current_app.logger.info(v) + field, field_type, tor, attr = self.attr_name_proc(k) + if field == "_type": + _query_sql = self.type_query_handler(v, only_type_query) + current_app.logger.debug(_query_sql) + elif field == "_id": # exclude all others + _ci_ids = [str(v)] + ci = db.session.query(CI.ci_id).filter( + CI.ci_id == int(v)).first() + if ci is not None: + return 1, _ci_ids + elif field: + if attr is None: + raise SearchError("{0} is not found".format(field)) + # in query + if v.startswith("(") and v.endswith(")"): + _query_sql = self.in_query_handler(attr, v) + # range query + elif v.startswith("[") and v.endswith("]") and "_TO_" in v: + _query_sql = self.range_query_handler(attr, v) + # comparison query + elif v.startswith(">=") or v.startswith("<=") or \ + v.startswith(">") or v.startswith("<"): + _query_sql = self.comparison_query_handler(attr, v) + else: + table_name = \ + TableMap(attr_name=attr.attr_name).table_name + _query_sql = QUERY_CI_BY_ATTR_NAME.format( + table_name, attr.attr_id, + 'LIKE "{0}"'.format(v.replace("*", "%"))) + else: + return 0, [] + elif q: + return 0, [] + + if is_first and _query_sql and not only_type_query: + query_sql = "SELECT * FROM ({0}) AS {1}".format(_query_sql, + alias) + is_first = False + alias += "A" + elif only_type_query and special: + is_first = False + special = False + query_sql = _query_sql + elif _query_sql: + query_sql = self._wrap_sql(tor, alias, _query_sql, query_sql) + alias += "AA" + + _start = time.time() + if query_sql: + self.query_sql = query_sql + current_app.logger.debug(query_sql) + numfound, res = self._execute_sql(query_sql, only_type_query) + current_app.logger.info("query ci ids is: {0}".format( + time.time() - _start)) + return numfound, [_res[0] for _res in res] + return 0, [] + + def facet_build(self): + facet = {} + for f in self.facet_field: + k, field_type, _, attr = self.attr_name_proc(f) + if k: + table_name = TableMap(attr_name=k).table_name + query_sql = FACET_QUERY.format( + table_name, self.query_sql, attr.attr_id) + result = db.session.execute(query_sql).fetchall() + facet[k] = result + facet_result = dict() + for k, v in facet.items(): + if not k.startswith('_'): + a = getattr(CIAttributeCache.get(k), "attr_%s" % self.ret_key) + facet_result[a] = list() + for f in v: + if f[1] != 0: + facet_result[a].append((f[0], f[1], a)) + return facet_result + + def fl_build(self): + _fl = list() + for f in self.fl: + k, _, _, _ = self.attr_name_proc(f) + if k: + _fl.append(k) + return _fl + + def search(self): + numfound, ci_ids = self.query_build_raw() + ci_ids = map(str, ci_ids) + _fl = self.fl_build() + + if self.facet_field and numfound: + facet = self.facet_build() + else: + facet = dict() + + response, counter = [], {} + if ci_ids: + response = get_cis_by_ids(ci_ids, ret_key=self.ret_key, fields=_fl) + for res in response: + ci_type = res.get("ci_type") + if ci_type not in counter.keys(): + counter[ci_type] = 0 + counter[ci_type] += 1 + total = len(response) + return response, counter, total, self.page, numfound, facet \ No newline at end of file diff --git a/lib/template/__init__.py b/lib/template/__init__.py new file mode 100644 index 0000000..44d37d3 --- /dev/null +++ b/lib/template/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/lib/template/filters.py b/lib/template/filters.py new file mode 100644 index 0000000..149d4f7 --- /dev/null +++ b/lib/template/filters.py @@ -0,0 +1,9 @@ +# -*- coding:utf-8 -*- + + +def convert_to_list(v): + if isinstance(v, list): + return v + if isinstance(v, tuple): + return list(v) + return [v, ] diff --git a/lib/utils.py b/lib/utils.py new file mode 100644 index 0000000..2a31655 --- /dev/null +++ b/lib/utils.py @@ -0,0 +1,74 @@ +# -*- coding:utf-8 -*- + + +import redis + +from flask import current_app +import settings + + +class RedisHandler(object): + def __init__(self): + try: + pool = redis.ConnectionPool( + max_connections=settings.REDIS_MAX_CONN, + host=settings.REDIS_HOST, + port=settings.REDIS_PORT, + db=settings.REDIS_DB) + self.r = redis.Redis(connection_pool=pool) + except Exception as e: + print e + current_app.logger.error("init redis connection failed") + + @classmethod + def instance(cls): + if not hasattr(cls, "_instance"): + cls._instance = cls() + return cls._instance + + def get(self, ci_ids, key="CMDB_CI"): + try: + value = self.r.hmget(key, ci_ids) + except Exception as e: + current_app.logger.error("get redis error, %s" % str(e)) + return + return value + + def _set(self, ci, key="CMDB_CI"): + try: + self.r.hmset(key, ci) + except Exception as e: + current_app.logger.error("set redis error, %s" % str(e)) + + def add(self, ci): + self._set(ci) + + def delete(self, ci_id, key="CMDB_CI"): + try: + ret = self.r.hdel(key, ci_id) + if not ret: + current_app.logger.warn("ci [%d] is not in redis" % ci_id) + except Exception as e: + current_app.logger.error("delete redis key error, %s" % str(e)) + +rd = RedisHandler.instance() + + +def get_page(page): + try: + page = int(page) + except ValueError: + page = 1 + if page < 1: + page = 1 + return page + + +def get_per_page(per_page): + try: + per_page = int(per_page) + except: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + if per_page < 1: + per_page = current_app.config.get("DEFAULT_PAGE_COUNT") + return per_page \ No newline at end of file diff --git a/lib/value.py b/lib/value.py new file mode 100644 index 0000000..f9916f7 --- /dev/null +++ b/lib/value.py @@ -0,0 +1,170 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from flask import current_app + +from extensions import db +from models.attribute import CIAttributeCache +from lib.attribute import AttributeManager +from lib.const import type_map +from lib.const import TableMap + + +class AttributeValueManager(object): + """ + manage CI attribute values + """ + + def __init__(self): + pass + + def _get_attr(self, key): + """key is one of attr_id, attr_name and attr_alias + """ + attr = CIAttributeCache.get(key) + return attr + + def _get_attr_values(self, fields, ci_id, + ret_key="name", + uniq_key=None, + use_master=False): + res = dict() + for field in fields: + attr = CIAttributeCache.get(field) + if not attr: + current_app.logger.warn('attribute %s not found' % field) + return res + table = TableMap(attr_name=attr.attr_name).table + if use_master: + rs = db.session().using_bind("master").query( + table.value).filter_by(ci_id=ci_id).filter_by( + attr_id=attr.attr_id) + else: + rs = db.session.query(table.value).filter_by( + ci_id=ci_id).filter_by(attr_id=attr.attr_id) + field_name = getattr(attr, "attr_{0}".format(ret_key)) + try: + if attr.is_multivalue: + if attr.value_type == 'datetime': + res[field_name] = [datetime.datetime.strftime( + x.value, '%Y-%m-%d %H:%M:%S') for x in rs.all()] + else: + res[field_name] = [x.value for x in rs.all()] + else: + x = rs.first() + if x: + if attr.value_type == 'datetime': + res[field_name] = datetime.datetime.strftime( + rs.first().value, '%Y-%m-%d %H:%M:%S') + else: + res[field_name] = rs.first().value + else: + res[field_name] = None + except AttributeError as e: + current_app.logger.warn("get ci by id error, {0}".format(e)) + if attr.is_multivalue: + res[field_name] = list() + else: + res[field_name] = "" + if uniq_key is not None and attr.attr_id == uniq_key.attr_id \ + and rs.first() is not None: + res['unique'] = uniq_key.attr_name + return res + + def _validate(self, attr, value, table, ci_id): + converter = type_map.get("converter").get(attr.value_type) + try: + v = converter(value) + except ValueError: + return False, "attribute value {0} converter fail".format(value) + if attr.is_choice: + choice_list = AttributeManager()._get_choice_value( + attr.attr_id, attr.value_type) + if v not in choice_list: + return False, "{0} is not existed in choice values".format( + value) + elif attr.is_uniq: + old_value = db.session.query(table.attr_id).filter( + table.attr_id == attr.attr_id).filter( + table.value == v).filter(table.ci_id != ci_id).first() + if old_value is not None: + return False, "attribute {0} value {1} must be unique".format( + attr.attr_name, value) + return True, v + + def add_attr_value(self, key, value, ci_id, ci_type, + _no_attribute_policy="ignore", ci_existed=False): + """key is one of attr_id, attr_name and attr_alias + """ + attr = self._get_attr(key) + if attr is None: + if _no_attribute_policy == 'ignore': + return True, None + if _no_attribute_policy == 'reject': + return False, 'attribute {0} not exist'.format(key) + table, old_value, old_value_table = TableMap( + attr_name=attr.attr_name).table, None, None + if ci_existed: + old_value_table = db.session.query(table).filter( + table.attr_id == attr.attr_id).filter( + table.ci_id == ci_id).first() + if old_value_table is not None: + old_value = old_value_table.value + if not value and ci_existed: + db.session.query(table).filter( + table.attr_id == attr.attr_id).filter( + table.ci_id == ci_id).delete() + if old_value: + return True, (attr.attr_id, "delete", old_value, None) + else: + return True, None + elif not value: + return True, None + if not attr.is_multivalue: + ret, res = self._validate(attr, value, table, ci_id) + if not ret: + return False, res + value_table = table() + if ci_existed: # for history + old = db.session.query(table).filter( + table.attr_id == attr.attr_id).filter( + table.value == value).filter( + table.ci_id == ci_id).first() + if old is not None: + return True, None + elif old_value_table: + value_table = old_value_table + value_table.ci_id = ci_id + value_table.attr_id = attr.attr_id + value_table.value = res + db.session.add(value_table) + elif attr.is_multivalue: + if ci_existed: + db.session.query(table).filter( + table.attr_id == attr.attr_id).filter( + table.ci_id == ci_id).delete() + + for v in value.strip().split(","): + ret, res = self._validate(attr, v, table, ci_id) + if not ret: + return False, res + value_table = table() + value_table.ci_id = ci_id + value_table.attr_id = attr.attr_id + value_table.value = res + db.session.add(value_table) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error( + "add attribute value is error, {0}".format(str(e))) + return False, "add attribute value is error, {0}".format(str(e)) + if ci_existed: + if old_value != value: + return True, (attr.attr_id, "update", old_value, value) + else: + return True, None + return True, (attr.attr_id, "add", None, value) \ No newline at end of file diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..3488926 --- /dev/null +++ b/manage.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- + + +from flask import jsonify +from flask import make_response +from flask.ext.script import Manager +from flask.ext.script import prompt_bool +from flask.ext.celery import install_commands as install_celery_command + +from __init__ import make_app +from extensions import db +from gunicornserver import GunicornServer +from lib.exception import InvalidUsageError + + +app = make_app('config.cfg') + + +@app.errorhandler(InvalidUsageError) +def handle_invalid_usage(error): + response = jsonify(error.to_dict()) + response.status_code = error.status_code + return response + + +@app.errorhandler(404) +def not_found(error): + return make_response(jsonify({'message': error.description}), 404) + + +@app.errorhandler(400) +def bad_request(error): + return make_response(jsonify({'message': error.description}), 400) + + +@app.errorhandler(401) +def auth_lack(error): + return make_response(jsonify({'message': error.description}), 401) + + +@app.errorhandler(403) +def exception_403(error): + return make_response(jsonify({'message': error.description}), 403) + + +@app.errorhandler(405) +def exception_405(error): + return make_response(jsonify({'message': error.description}), 405) + + +@app.errorhandler(500) +def server_error(error): + return make_response(jsonify({"message": error.description}), 500) + + +manager = Manager(app) + +install_celery_command(manager) + + +@manager.command +def db_setup(): + "create all database tables" + db.create_all() + + +@manager.command +def db_dropall(): + "drop all databse tables" + if prompt_bool("Are you sure ? You will lose all your data !"): + db.drop_all() + + +manager.add_command("run", GunicornServer()) + +if __name__ == '__main__': + manager.run(default_command="runserver") diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..b5f28a6 --- /dev/null +++ b/models/__init__.py @@ -0,0 +1,24 @@ +# -*- coding:utf-8 -*- + + +def row2dict(row): + d = dict() + for c in row.__table__.columns: + if not isinstance(getattr(row, c.name), + (basestring, long, int, float, list, tuple, dict)) \ + and getattr(row, c.name): + d[c.name] = getattr(row, c.name).strftime("%Y-%m-%d %H:%M:%S") + else: + d[c.name] = getattr(row, c.name) + return d + + +from account import * +from attribute import * +from ci import * +from ci_relation import * +from ci_type import * +from ci_type_relation import * +from ci_value import * +from history import * +from statis import * diff --git a/models/account.py b/models/account.py new file mode 100644 index 0000000..0a3b322 --- /dev/null +++ b/models/account.py @@ -0,0 +1,230 @@ +# -*- coding:utf-8 -*- + + +import hashlib +import copy +from datetime import datetime + +from werkzeug.utils import cached_property +from flask.ext.sqlalchemy import BaseQuery +from flask.ext.principal import RoleNeed +from flask.ext.principal import UserNeed +from flask.ext.principal import Permission + +from extensions import db +from extensions import cache +from permissions import admin +from models import row2dict + + +class UserQuery(BaseQuery): + def from_identity(self, identity): + """ + Loads user from flask.ext.principal.Identity instance and + assigns permissions from user. + + A "user" instance is monkey patched to the identity instance. + + If no user found then None is returned. + """ + + try: + _id = identity.id + if _id: + _id = int(_id) + user = self.get(_id) + except ValueError: + user = None + except Exception: + user = None + if user: + identity.provides.update(user.provides) + identity.user = user + return user + + def authenticate(self, login, password): + user = self.filter(db.or_(User.username == login, + User.email == login)).first() + if user: + authenticated = user.check_password(password) + else: + authenticated = False + return user, authenticated + + def authenticate_with_key(self, key, secret, args, path): + user = self.filter(User.key == key).filter(User.block == 0).first() + if not user: + return None, False + if user and hashlib.sha1('%s%s%s' % ( + path, user.secret, "".join(args))).hexdigest() == secret: + authenticated = True + else: + authenticated = False + return row2dict(user), authenticated + + def search(self, key): + query = self.filter(db.or_(User.email == key, + User.nickname.ilike('%' + key + '%'), + User.username.ilike('%' + key + '%'))) + return query + + def get_by_username(self, username): + user = self.filter(User.username == username).first() + return user + + def get_by_nickname(self, nickname): + user = self.filter(User.nickname == nickname).first() + return user + + def get(self, uid): + user = self.filter(User.uid == uid).first() + return copy.deepcopy(user) + + def is_exits(self, username): + user = self.filter(User.username == username).first() + return user is not None + + +class User(db.Model): + __tablename__ = 'users' + query_class = UserQuery + + ADMIN = 1 + + uid = db.Column(db.Integer, primary_key=True, autoincrement=True) + username = db.Column(db.String(32), unique=True) + nickname = db.Column(db.String(20), nullable=True) + department = db.Column(db.String(20)) + catalog = db.Column(db.String(64)) + email = db.Column(db.String(100), unique=True, nullable=False) + mobile = db.Column(db.String(14), unique=True) + _password = db.Column("password", db.String(80), nullable=False) + key = db.Column(db.String(32), nullable=False) + secret = db.Column(db.String(32), nullable=False) + date_joined = db.Column(db.DateTime, default=datetime.utcnow) + last_login = db.Column(db.DateTime, default=datetime.utcnow) + block = db.Column(db.Boolean, default=False) + has_logined = db.Column(db.Boolean, default=False) + + class Permissions(object): + def __init__(self, obj): + self.obj = obj + + @cached_property + def is_admin(self): + return Permission(UserNeed(self.obj.id)) & admin + + def __init__(self, *args, **kwargs): + super(User, self).__init__(*args, **kwargs) + + def __str__(self): + return self.username + + @cached_property + def permissions(self): + return self.Permissions(self) + + def _get_password(self): + return self._password + + def _set_password(self, password): + self._password = password + + password = db.synonym("_password", descriptor=property( + _get_password, _set_password)) + + def check_password(self, password): + return self.password == password + + @cached_property + def provides(self): + needs = [RoleNeed('authenticated'), UserNeed(self.uid)] + for r in self.rolenames: + needs.append(RoleNeed(r)) + if self.is_admin: + needs.append(RoleNeed('admin')) + return needs + + @property + def roles(self): + urs = db.session.query(UserRole.rid).filter( + UserRole.uid == self.uid).all() + return [x.rid for x in urs] + + @property + def rolenames(self): + return [db.session.query(Role.role_name).filter( + Role.rid == rid).first().role_name for rid in self.roles] + + @property + def is_admin(self): + return self.ADMIN in self.roles + + +class Role(db.Model): + __tablename__ = 'roles' + + rid = db.Column(db.Integer, primary_key=True, autoincrement=True) + role_name = db.Column(db.String(64), nullable=False, unique=True) + + +class UserRole(db.Model): + __tablename__ = 'users_roles' + + uid = db.Column(db.Integer, db.ForeignKey('users.uid'), primary_key=True) + rid = db.Column(db.Integer, db.ForeignKey('roles.rid'), primary_key=True) + + +class UserCache(object): + @classmethod + def get(cls, key): + user = cache.get("User::uid::%s" % key) or \ + cache.get("User::username::%s" % key) or \ + cache.get("User::nickname::%s" % key) + if not user: + user = User.query.get(key) or \ + User.query.get_by_username(key) or \ + User.query.get_by_nickname(key) + if user: + cls.set(user) + return user + + @classmethod + def set(cls, user): + cache.set("User::uid::%s" % user.uid, user) + cache.set("User::username::%s" % user.username, user) + cache.set("User::nickname::%s" % user.nickname, user) + + @classmethod + def clean(cls, user): + cache.delete("User::uid::%s" % user.uid) + cache.delete("User::username::%s" % user.username) + cache.delete("User::nickname::%s" % user.nickname) + + +class RoleCache(object): + @classmethod + def get(cls, rid): + role = None + if isinstance(rid, (int, long)): + role = cache.get("Role::rid::%s" % rid) + if not role: + role = db.session.query(Role).filter(Role.rid == rid).first() + cls.set(role) + elif isinstance(rid, basestring): + role = cache.get("Role::role_name::%s" % rid) + if not role: + role = db.session.query(Role).filter( + Role.role_name == rid).first() + cls.set(role) + return role + + @classmethod + def set(cls, role): + cache.set("Role::rid::%s" % role.rid, role) + cache.set("Role::role_name::%s" % role.role_name, role) + + @classmethod + def clean(cls, role): + cache.delete("Role::rid::%s" % role.rid, role) + cache.delete("Role::role_name::%s" % role.role_name, role) \ No newline at end of file diff --git a/models/attribute.py b/models/attribute.py new file mode 100644 index 0000000..fbc5c0b --- /dev/null +++ b/models/attribute.py @@ -0,0 +1,87 @@ +# -*- coding:utf-8 -*- + +from extensions import db, cache + + +class CIAttribute(db.Model): + __tablename__ = "ci_attributes" + + attr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + attr_name = db.Column(db.String(32), nullable=False, unique=True) + attr_alias = db.Column(db.String(32), nullable=False, unique=True) + value_type = db.Column( + db.String(8), + db.Enum("int", "float", "text", "datetime", name='value_type'), + default="text", + nullable=False) + is_choice = db.Column(db.Boolean, default=False) + is_multivalue = db.Column(db.Boolean, default=False) + is_uniq = db.Column(db.Boolean, default=False) + is_index = db.Column(db.Boolean, default=False) + + +class IntegerChoice(db.Model): + __tablename__ = 'choice_integers' + + choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + attr = db.relationship("CIAttribute", backref="choice_integers") + value = db.Column(db.Integer, nullable=False) + + +class FloatChoice(db.Model): + __tablename__ = 'choice_floats' + + choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + attr = db.relationship("CIAttribute", backref="choice_floats") + value = db.Column(db.Float, nullable=False) + + +class TextChoice(db.Model): + __tablename__ = 'choice_texts' + + choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + attr = db.relationship("CIAttribute", backref="choice_texts") + value = db.Column(db.Text, nullable=False) + + +class CIAttributeCache(object): + @classmethod + def get(cls, key): + if key is None: + return + attr = cache.get('Field::Name::%s' % key) or \ + cache.get('Field::ID::%s' % key) or \ + cache.get('Field::Alias::%s' % key) + if attr is None: + attr = db.session.query(CIAttribute).filter_by( + attr_name=key).first() or \ + db.session.query(CIAttribute).filter( + CIAttribute.attr_id == key).first() or \ + db.session.query(CIAttribute).filter( + CIAttribute.attr_alias == key).first() + db.session.close() + if attr is not None: + CIAttributeCache.set(attr) + return attr + + @classmethod + def set(cls, attr): + cache.set('Field::ID::%s' % attr.attr_id, attr) + cache.set('Field::Name::%s' % attr.attr_name, attr) + cache.set('Field::Alias::%s' % attr.attr_alias, attr) + + @classmethod + def clean(cls, attr): + if cache.get('Field::ID::%s' % attr.attr_id): + cache.delete('Field::ID::%s' % attr.attr_id) + cache.delete('Field::Name::%s' % attr.attr_name) + cache.delete('Field::Alias::%s' % attr.attr_alias) \ No newline at end of file diff --git a/models/ci.py b/models/ci.py new file mode 100644 index 0000000..b4ee4cf --- /dev/null +++ b/models/ci.py @@ -0,0 +1,20 @@ +# -*- coding:utf-8 -*- + +import datetime + +from extensions import db + + +class CI(db.Model): + __tablename__ = "cis" + + ci_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + uuid = db.Column(db.String(32), nullable=False) + type_id = db.Column(db.Integer, + db.ForeignKey("ci_types.type_id"), + nullable=False) + ci_type = db.relationship("CIType", backref="cis") + status = db.Column(db.String(8), + db.Enum("review", "validate", name="stauts")) + created_time = db.Column(db.DateTime, default=datetime.datetime.now()) + heartbeat = db.Column(db.DateTime, default=datetime.datetime.now()) \ No newline at end of file diff --git a/models/ci_relation.py b/models/ci_relation.py new file mode 100644 index 0000000..6a347ea --- /dev/null +++ b/models/ci_relation.py @@ -0,0 +1,26 @@ +# -*- coding:utf-8 -*- + + +from extensions import db + + +class CIRelation(db.Model): + __tablename__ = "ci_relations" + cr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + first_ci_id = db.Column(db.Integer, + db.ForeignKey("cis.ci_id"), + primary_key=True) + second_ci_id = db.Column(db.Integer, + db.ForeignKey("cis.ci_id"), + primary_key=True) + first_ci = db.relationship("CI", + primaryjoin="CI.ci_id==CIRelation.first_ci_id") + second_ci = db.relationship( + "CI", primaryjoin="CI.ci_id==CIRelation.second_ci_id") + relation_type = db.Column( + db.String(8), db.Enum("connect", "deploy", "install", "contain", + name="relation_type"), nullable=False) + more = db.Column(db.Integer, db.ForeignKey("cis.ci_id")) + + __table_args__ = (db.UniqueConstraint("first_ci_id", "second_ci_id", + name="first_second_uniq"), ) diff --git a/models/ci_type.py b/models/ci_type.py new file mode 100644 index 0000000..a995c82 --- /dev/null +++ b/models/ci_type.py @@ -0,0 +1,128 @@ +# -*- coding:utf-8 -*- + +from extensions import db +from extensions import cache + + +class CIType(db.Model): + __tablename__ = "ci_types" + + type_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + type_name = db.Column(db.String(32)) + type_alias = db.Column(db.String(32)) + uniq_id = db.Column(db.Integer, + db.ForeignKey("ci_attributes.attr_id"), + nullable=False) + uniq_key = db.relationship("CIAttribute", backref="ci_types") + enabled = db.Column(db.Boolean, default=True, nullable=False) + is_attached = db.Column(db.Boolean, default=False, nullable=False) + icon_url = db.Column(db.String(256)) + order = db.Column(db.SmallInteger, default=0, nullable=False) + + +class CITypeAttribute(db.Model): + __tablename__ = "type_attributes" + + type_id = db.Column(db.Integer, + db.ForeignKey("ci_types.type_id"), + primary_key=True) + attr_id = db.Column(db.Integer, + db.ForeignKey("ci_attributes.attr_id"), + primary_key=True) + is_required = db.Column(db.Boolean, default=False) + + __table_args__ = (db.UniqueConstraint("type_id", "attr_id", + name="type_attr_uniq"), ) + + +class CITypeCache(object): + @classmethod + def get(cls, key): + if key is None: + return + ct = cache.get("CIType::ID::%s" % key) or \ + cache.get("CIType::Name::%s" % key) + if ct is None: + ct = db.session.query(CIType).filter( + CIType.type_name == key).first() or \ + db.session.query(CIType).filter(CIType.type_id == key).first() + if ct is not None: + CITypeCache.set(ct) + return ct + + @classmethod + def set(cls, ct): + cache.set("CIType::Name::%s" % ct.type_name, ct) + cache.set("CIType::ID::%d" % ct.type_id, ct) + + @classmethod + def clean(cls, key): + ct = CITypeCache.get(key) + if ct is not None: + cache.delete("CIType::Name::%s" % ct.type_name) + cache.delete("CIType::ID::%s" % ct.type_id) + + +class CITypeSpecCache(object): + @classmethod + def get(cls, key): + if key is None: + return + ct = cache.get("CITypeSPEC::ID::%d" % key) + if ct is None: + ct = db.session.query(CIType).filter(CIType.type_id == key).first() + if ct is not None: + CITypeSpecCache.set(ct) + return ct + + @classmethod + def set(cls, ct): + cache.set("CITypeSPEC::ID::%d" % ct.type_id, ct) + + @classmethod + def clean(cls, key): + ct = CITypeCache.get(key) + if ct is not None: + cache.delete("CITypeSPEC::ID::%d" % ct.type_id) + + +class CITypeAttributeCache(object): + """ + key is type_id or type_name + """ + + @classmethod + def get(cls, key): + if key is None: + return + if isinstance(key, basestring) and isinstance(key, unicode): + key = unicode(key, 'utf8') + citypes = cache.get("CITypeAttribute::Name::%s" % key) or \ + cache.get("CITypeAttribute::ID::%s" % key) + if not citypes: + citypes = db.session.query(CITypeAttribute).filter( + CITypeAttribute.type_id == key).all() + if citypes is None: + ci_type = db.session.query(CIType).filter( + CIType.type_name == key).first() + if ci_type is not None: + citypes = db.session.query(CITypeAttribute).filter_by( + type_id=ci_type.type_id).all() + if citypes is not None: + CITypeAttributeCache.set(key, citypes) + return citypes + + @classmethod + def set(cls, key, values): + citype = CITypeCache.get(key) + if citype is not None: + cache.set("CITypeAttribute::ID::%s" % citype.type_id, values) + cache.set("CITypeAttribute::Name::%s" % citype.type_name, values) + + @classmethod + def clean(cls, key): + citype = CITypeCache.get(key) + attrs = CITypeAttributeCache.get(key) + if attrs is not None and citype: + cache.delete("CITypeAttribute::ID::%s" % citype.type_id) + cache.delete("CITypeAttribute::Name::%s" % citype.type_name) \ No newline at end of file diff --git a/models/ci_type_relation.py b/models/ci_type_relation.py new file mode 100644 index 0000000..cde0486 --- /dev/null +++ b/models/ci_type_relation.py @@ -0,0 +1,27 @@ +# -*- coding:utf-8 -*- + +from extensions import db + + +class CITypeRelation(db.Model): + __tablename__ = "ci_type_relations" + + ctr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + parent_id = db.Column(db.Integer, + db.ForeignKey("ci_types.type_id"), + primary_key=True) + parent = db.relationship( + "CIType", primaryjoin="CIType.type_id==CITypeRelation.parent_id") + child_id = db.Column(db.Integer, + db.ForeignKey("ci_types.type_id"), + primary_key=True) + child = db.relationship( + "CIType", primaryjoin="CIType.type_id==CITypeRelation.child_id") + relation_type = db.Column( + db.String(7), + db.Enum("contain", "connect", "deploy", "install", + name="relation_type"), + default="contain") + + __table_args__ = (db.UniqueConstraint("parent_id", "child_id", + name="parent_child_uniq"), ) \ No newline at end of file diff --git a/models/ci_value.py b/models/ci_value.py new file mode 100644 index 0000000..f99068c --- /dev/null +++ b/models/ci_value.py @@ -0,0 +1,117 @@ +# -*- coding:utf-8 -*- + + +from extensions import db +from sqlalchemy import Index + + +class CIIndexValueInteger(db.Model): + __tablename__ = "index_integers" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="index_integers") + attr = db.relationship("CIAttribute", backref="index_integers") + value = db.Column(db.Integer, nullable=False) + + __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) + + +class CIIndexValueFloat(db.Model): + __tablename__ = "index_floats" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="index_floats") + attr = db.relationship("CIAttribute", backref="index_floats") + value = db.Column(db.Float, nullable=False) + + __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) + + +class CIIndexValueText(db.Model): + __tablename__ = "index_texts" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="index_texts") + attr = db.relationship("CIAttribute", backref="index_texts") + value = db.Column(db.String(128), nullable=False) + + __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) + + +class CIIndexValueDateTime(db.Model): + __tablename__ = "index_datetime" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="index_datetime") + attr = db.relationship("CIAttribute", backref="index_datetime") + value = db.Column(db.DateTime, nullable=False) + + __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) + + +class CIValueInteger(db.Model): + __tablename__ = "integers" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="integers") + attr = db.relationship("CIAttribute", backref="integers") + value = db.Column(db.Integer, nullable=False) + + +class CIValueFloat(db.Model): + __tablename__ = "floats" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="floats") + attr = db.relationship("CIAttribute", backref="floats") + value = db.Column(db.Float, nullable=False) + + +class CIValueText(db.Model): + __tablename__ = "texts" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="texts") + attr = db.relationship("CIAttribute", backref="texts") + value = db.Column(db.Text, nullable=False) + + +class CIValueDateTime(db.Model): + __tablename__ = "datetime" + + value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) + attr_id = db.Column(db.Integer, + db.ForeignKey('ci_attributes.attr_id'), + nullable=False) + ci = db.relationship("CI", backref="datetime") + attr = db.relationship("CIAttribute", backref="datetime") + value = db.Column(db.DateTime, nullable=False) diff --git a/models/history.py b/models/history.py new file mode 100644 index 0000000..8fb9e7a --- /dev/null +++ b/models/history.py @@ -0,0 +1,51 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from extensions import db + + +class OperationRecord(db.Model): + __tablename__ = "records" + + record_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + uid = db.Column(db.Integer, db.ForeignKey('users.uid'), nullable=False) + timestamp = db.Column(db.DateTime, + nullable=False, + default=datetime.datetime.now()) + origin = db.Column(db.String(32)) + ticket_id = db.Column(db.String(32)) + reason = db.Column(db.Text) + + +class CIAttributeHistory(db.Model): + __tablename__ = "histories" + + h_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + operate_type = db.Column(db.String(6), db.Enum("add", "delete", "update", + name="operate_type")) + record_id = db.Column(db.Integer, + db.ForeignKey("records.record_id"), + nullable=False) + ci_id = db.Column(db.Integer, nullable=False) + attr_id = db.Column(db.Integer, nullable=False) + old = db.Column(db.Text) + new = db.Column(db.Text) + + +class CIRelationHistory(db.Model): + __tablename__ = "relation_histories" + + rh_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + operate_type = db.Column(db.String(6), + db.Enum("add", "delete", name="operate_type")) + record_id = db.Column(db.Integer, + db.ForeignKey("records.record_id"), + nullable=False) + first_ci_id = db.Column(db.Integer) + second_ci_id = db.Column(db.Integer) + relation_type = db.Column( + db.String(8), db.Enum("connect", "deploy", "install", "contain", + name="relation_type")) + relation = db.Column(db.Integer, nullable=False) diff --git a/models/statis.py b/models/statis.py new file mode 100644 index 0000000..64e03a4 --- /dev/null +++ b/models/statis.py @@ -0,0 +1,20 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from extensions import db + + +class UrlRecord(db.Model): + + url_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + + url = db.Column(db.String(64), nullable=False) + response_time = db.Column(db.Float, nullable=False) + is_ok = db.Column(db.Boolean, default=True) + source = db.Column(db.String(32)) + remote_addr = db.Column(db.String(20)) + hits = db.Column(db.Integer) + method = db.Column(db.String(5), default="GET") + created_at = db.Column(db.DateTime, default=datetime.datetime.now()) \ No newline at end of file diff --git a/permissions.py b/permissions.py new file mode 100644 index 0000000..891b952 --- /dev/null +++ b/permissions.py @@ -0,0 +1,9 @@ +# -*- coding:utf-8 -*- + + +from flask.ext.principal import RoleNeed, Permission + + +admin = Permission(RoleNeed('admin')) +auth = Permission(RoleNeed('authenticated')) +null = Permission(RoleNeed('null')) \ No newline at end of file diff --git a/requirements/default.txt b/requirements/default.txt new file mode 100644 index 0000000..6ee0a59 --- /dev/null +++ b/requirements/default.txt @@ -0,0 +1,14 @@ +Flask==0.9 +Flask-Script==0.5.2 +Flask-Babel==0.8 +Flask-principal==0.3.5 +Flask-mail==0.7.4 +pymysql==0.5 +sqlalchemy==0.8.2 +Flask-sqlalchemy==0.16 +Flask-cache==0.9.2 +redis==2.7.2 +gunicorn==0.17.4 +celery==3.0.18 +flask-celery=2.4.3 +Jinja2==2.7.1 \ No newline at end of file diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..9819a83 --- /dev/null +++ b/settings.py @@ -0,0 +1,7 @@ +# -*- coding:utf-8 -*- + +## CI cache +REDIS_HOST = "127.0.0.1" +REDIS_PORT = 6379 +REDIS_DB = 0 +REDIS_MAX_CONN = 30 diff --git a/tasks/__init__.py b/tasks/__init__.py new file mode 100644 index 0000000..44d37d3 --- /dev/null +++ b/tasks/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/tasks/cmdb.py b/tasks/cmdb.py new file mode 100644 index 0000000..11f5cbe --- /dev/null +++ b/tasks/cmdb.py @@ -0,0 +1,30 @@ +# -*- coding:utf-8 -*- + + +import json +import time + +from flask import current_app + +from extensions import celery +from extensions import db +from lib.utils import rd +import lib.ci + + +@celery.task(name="cmdb.ci_cache", queue="cmdb_async") +def ci_cache(ci_id): + time.sleep(0.1) + db.session.close() + m = lib.ci.CIManager() + ci = m.get_ci_by_id(ci_id, need_children=False, use_master=True) + rd.delete(ci_id) + rd.add({ci_id: json.dumps(ci)}) + current_app.logger.info("%d caching.........." % ci_id) + + +@celery.task(name="cmdb.ci_delete", queue="cmdb_async") +def ci_delete(ci_id): + current_app.logger.info(ci_id) + rd.delete(ci_id) + current_app.logger.info("%d delete.........." % ci_id) diff --git a/tasks/statis.py b/tasks/statis.py new file mode 100644 index 0000000..0971117 --- /dev/null +++ b/tasks/statis.py @@ -0,0 +1,21 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from flask import current_app + +from extensions import celery +from extensions import db +from models.statis import UrlRecord + + +@celery.task(name="statis.url_record", queue="statis_async") +def url_record(url, method, remote_addr, response_time, status_code, source): + current_app.logger.info("%s add 1" % url) + now = datetime.datetime.now() + u = UrlRecord(url=url, response_time=response_time, is_ok=1, + source="default", hits=1, method=method, created_at=now, + remote_addr=remote_addr) + db.session.add(u) + db.session.commit() \ No newline at end of file diff --git a/templates/ci_audit_notify.html b/templates/ci_audit_notify.html new file mode 100644 index 0000000..1a6fd8c --- /dev/null +++ b/templates/ci_audit_notify.html @@ -0,0 +1,51 @@ + +
+ + + + + + + + + + + + + + {%- for res in result %} + {%- for v in res.get("values") %} + + {%- if res.get("values").index(v) == 0 %} + + {%- endif %} + + + + + + + {%- endfor %} + {%- endfor %} + +
变更设备变更字段原值变更值创建时间
+ {{res.get("ci_id")}} + + {{ v.get('attr_name') }} + + {{ v.get('cur_value') }} + + {{ v.get('new_value') }} + + {{ v.get('created_at') }} +
+ +
+

+ + 查看详情 +

+
+
+ diff --git a/templates/search.xml b/templates/search.xml new file mode 100644 index 0000000..e30f791 --- /dev/null +++ b/templates/search.xml @@ -0,0 +1,27 @@ + + + {{ numfound }} + {{ page }} + + {% for ci in result %} + + {% for k, v in ci.items() %} + {% if not k.startswith('_') %} + {% for item in v | convert_to_list %} + {{ item }} + {% endfor %} + {% endif %} + {% endfor %} + + {% endfor %} + + + {% for k,v in facet.items() %} + + {% for item in v %} + {{ item[1] }} + {% endfor %} + + {% endfor %} + + \ No newline at end of file diff --git a/templates/search_tidy.xml b/templates/search_tidy.xml new file mode 100644 index 0000000..52832a0 --- /dev/null +++ b/templates/search_tidy.xml @@ -0,0 +1,19 @@ + + + {{ code }} + + {% for k, v in ret.items() %} + + {% for ci in v %} + + + {% for item in ci|convert_to_list %} + {{ item }} + {% endfor %} + + + {% endfor %} + + {% endfor %} + + \ No newline at end of file From 5f6ce548759832d1a02583a0dccb460769ce9f0f Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 09:41:15 +0800 Subject: [PATCH 006/159] rm --- cmdb-api/__init__.py | 126 ------ cmdb-api/cmdb_api.md | 637 -------------------------- cmdb-api/cmdb_query_api.md | 99 ---- cmdb-api/command/__init__.py | 1 - cmdb-api/config-sample.cfg | 55 --- cmdb-api/core/__init__.py | 11 - cmdb-api/core/account.py | 98 ---- cmdb-api/core/attribute.py | 145 ------ cmdb-api/core/ci.py | 189 -------- cmdb-api/core/ci_relation.py | 70 --- cmdb-api/core/ci_type.py | 89 ---- cmdb-api/core/ci_type_relation.py | 55 --- cmdb-api/core/history.py | 116 ----- cmdb-api/core/special.py | 16 - cmdb-api/core/statis.py | 12 - cmdb-api/extensions.py | 16 - cmdb-api/gunicornserver.py | 72 --- cmdb-api/lib/__init__.py | 4 - cmdb-api/lib/account.py | 145 ------ cmdb-api/lib/attribute.py | 167 ------- cmdb-api/lib/auth.py | 68 --- cmdb-api/lib/ci.py | 677 ---------------------------- cmdb-api/lib/ci_type.py | 315 ------------- cmdb-api/lib/const.py | 99 ---- cmdb-api/lib/decorator.py | 74 --- cmdb-api/lib/exception.py | 17 - cmdb-api/lib/history.py | 75 --- cmdb-api/lib/mail.py | 86 ---- cmdb-api/lib/query_sql.py | 107 ----- cmdb-api/lib/search.py | 348 -------------- cmdb-api/lib/template/__init__.py | 1 - cmdb-api/lib/template/filters.py | 9 - cmdb-api/lib/utils.py | 74 --- cmdb-api/lib/value.py | 170 ------- cmdb-api/manage.py | 77 ---- cmdb-api/models/__init__.py | 24 - cmdb-api/models/account.py | 230 ---------- cmdb-api/models/attribute.py | 87 ---- cmdb-api/models/ci.py | 20 - cmdb-api/models/ci_relation.py | 26 -- cmdb-api/models/ci_type.py | 128 ------ cmdb-api/models/ci_type_relation.py | 27 -- cmdb-api/models/ci_value.py | 117 ----- cmdb-api/models/history.py | 51 --- cmdb-api/models/statis.py | 20 - cmdb-api/permissions.py | 9 - cmdb-api/requirements/default.txt | 14 - cmdb-api/settings.py | 7 - cmdb-api/tasks/__init__.py | 1 - cmdb-api/tasks/cmdb.py | 30 -- cmdb-api/tasks/statis.py | 21 - cmdb-api/templates/search.xml | 27 -- cmdb-api/templates/search_tidy.xml | 19 - 53 files changed, 5178 deletions(-) delete mode 100644 cmdb-api/__init__.py delete mode 100644 cmdb-api/cmdb_api.md delete mode 100644 cmdb-api/cmdb_query_api.md delete mode 100644 cmdb-api/command/__init__.py delete mode 100644 cmdb-api/config-sample.cfg delete mode 100644 cmdb-api/core/__init__.py delete mode 100644 cmdb-api/core/account.py delete mode 100644 cmdb-api/core/attribute.py delete mode 100644 cmdb-api/core/ci.py delete mode 100644 cmdb-api/core/ci_relation.py delete mode 100644 cmdb-api/core/ci_type.py delete mode 100644 cmdb-api/core/ci_type_relation.py delete mode 100644 cmdb-api/core/history.py delete mode 100644 cmdb-api/core/special.py delete mode 100644 cmdb-api/core/statis.py delete mode 100644 cmdb-api/extensions.py delete mode 100644 cmdb-api/gunicornserver.py delete mode 100644 cmdb-api/lib/__init__.py delete mode 100644 cmdb-api/lib/account.py delete mode 100644 cmdb-api/lib/attribute.py delete mode 100644 cmdb-api/lib/auth.py delete mode 100644 cmdb-api/lib/ci.py delete mode 100644 cmdb-api/lib/ci_type.py delete mode 100644 cmdb-api/lib/const.py delete mode 100644 cmdb-api/lib/decorator.py delete mode 100644 cmdb-api/lib/exception.py delete mode 100644 cmdb-api/lib/history.py delete mode 100644 cmdb-api/lib/mail.py delete mode 100644 cmdb-api/lib/query_sql.py delete mode 100644 cmdb-api/lib/search.py delete mode 100644 cmdb-api/lib/template/__init__.py delete mode 100644 cmdb-api/lib/template/filters.py delete mode 100644 cmdb-api/lib/utils.py delete mode 100644 cmdb-api/lib/value.py delete mode 100644 cmdb-api/manage.py delete mode 100644 cmdb-api/models/__init__.py delete mode 100644 cmdb-api/models/account.py delete mode 100644 cmdb-api/models/attribute.py delete mode 100644 cmdb-api/models/ci.py delete mode 100644 cmdb-api/models/ci_relation.py delete mode 100644 cmdb-api/models/ci_type.py delete mode 100644 cmdb-api/models/ci_type_relation.py delete mode 100644 cmdb-api/models/ci_value.py delete mode 100644 cmdb-api/models/history.py delete mode 100644 cmdb-api/models/statis.py delete mode 100644 cmdb-api/permissions.py delete mode 100644 cmdb-api/requirements/default.txt delete mode 100644 cmdb-api/settings.py delete mode 100644 cmdb-api/tasks/__init__.py delete mode 100644 cmdb-api/tasks/cmdb.py delete mode 100644 cmdb-api/tasks/statis.py delete mode 100644 cmdb-api/templates/search.xml delete mode 100644 cmdb-api/templates/search_tidy.xml diff --git a/cmdb-api/__init__.py b/cmdb-api/__init__.py deleted file mode 100644 index a4d8219..0000000 --- a/cmdb-api/__init__.py +++ /dev/null @@ -1,126 +0,0 @@ -# encoding=utf-8 - -import os -import logging -from logging.handlers import SMTPHandler -from logging.handlers import TimedRotatingFileHandler - -from flask import Flask -from flask import request -from flask import g -from flask.ext.babel import Babel -from flask.ext.principal import identity_loaded - -from extensions import db -from extensions import mail -from extensions import cache -from extensions import celery -from core import attribute -from core import citype -from core import cityperelation -from core import cirelation -from core import ci -from core import history -from core import account -from core import special -from models.account import User -from lib.template import filters - - -APP_NAME = "CMDB-API" - -MODULES = ( - (attribute, "/api/v0.1/attributes"), - (citype, "/api/v0.1/citypes"), - (cityperelation, "/api/v0.1/cityperelations"), - (cirelation, "/api/v0.1/cirelations"), - (ci, "/api/v0.1/ci"), - (history, "/api/v0.1/history"), - (account, "/api/v0.1/accounts"), - (special, ""), -) - - -def make_app(config=None, modules=None): - modules = modules - if not modules: - modules = MODULES - app = Flask(APP_NAME) - app.config.from_pyfile(config) - configure_extensions(app) - configure_i18n(app) - configure_identity(app) - configure_blueprints(app, modules) - configure_logging(app) - configure_template_filters(app) - return app - - -def configure_extensions(app): - db.app = app - celery.init_app(app) - db.init_app(app) - mail.init_app(app) - cache.init_app(app) - celery.init_app(app) - - -def configure_i18n(app): - babel = Babel(app) - - @babel.localeselector - def get_locale(): - accept_languages = app.config.get('ACCEPT_LANGUAGES', ['en', 'zh']) - return request.accept_languages.best_match(accept_languages) - - -def configure_modules(app, modules): - for module, url_prefix in modules: - app.register_module(module, url_prefix=url_prefix) - - -def configure_blueprints(app, modules): - for module, url_prefix in modules: - app.register_blueprint(module, url_prefix=url_prefix) - - -def configure_identity(app): - - @identity_loaded.connect_via(app) - def on_identity_loaded(sender, identity): - g.user = User.query.from_identity(identity) - - -def configure_logging(app): - hostname = os.uname()[1] - mail_handler = SMTPHandler( - app.config['MAIL_SERVER'], - app.config['DEFAULT_MAIL_SENDER'], - app.config['ADMINS'], - '[%s] CMDB error' % hostname, - ( - app.config['MAIL_USERNAME'], - app.config['MAIL_PASSWORD'], - ) - ) - mail_formater = logging.Formatter( - "%(asctime)s %(levelname)s %(pathname)s %(lineno)d\n%(message)s") - mail_handler.setFormatter(mail_formater) - mail_handler.setLevel(logging.ERROR) - if not app.debug: - app.logger.addHandler(mail_handler) - formatter = logging.Formatter( - "%(asctime)s %(levelname)s %(pathname)s %(lineno)d - %(message)s") - log_file = app.config['LOG_PATH'] - file_handler = TimedRotatingFileHandler( - log_file, when='d', interval=1, backupCount=7) - file_handler.setLevel(getattr(logging, app.config['LOG_LEVEL'])) - file_handler.setFormatter(formatter) - app.logger.addHandler(file_handler) - app.logger.setLevel(getattr(logging, app.config['LOG_LEVEL'])) - - -def configure_template_filters(app): - for name in dir(filters): - if callable(getattr(filters, name)): - app.add_template_filter(getattr(filters, name)) diff --git a/cmdb-api/cmdb_api.md b/cmdb-api/cmdb_api.md deleted file mode 100644 index c4e237f..0000000 --- a/cmdb-api/cmdb_api.md +++ /dev/null @@ -1,637 +0,0 @@ -# CMDB API文档 - -## 状态返回码的定义 -* 200: 成功 -* 400:失败 -* 401:未授权 -* 404:url not found -* 408:超时 -* 410:资源删除 -* 500: 服务器错误 - - -## 用户接口 - -### CI搜索接口 - -* GET `/api/v0.1/ci/s` -* 参数 - * `string:_type` 搜索的ci_type,多个用分号隔开, 例如: _type:(server;vservser) - * `string:q` 搜索表达式, 例如`q=hostname:cmdb*` - * `string:fl` 返回字段(id, attr_name, attr_alias均可),英文半角逗号分隔 - * `string:ret_key` 返回字段类型 `Enum("id", "name", "alias")` 默认 `name` - * `count` 指定一次返回CI数 - * `facet` 属性字段,逗号分隔,返回属性字段对应的所有值 - -* 搜索表达式: - * 简单的字符串 - * `attribute:value` 指定属性搜索, `attribute`可以是`id`,`attr_name`和`attr_alias` - * 以上的组合,逗号分隔 - -* 组合查询支持 - * `AND`关系-`默认关系` - * `OR`关系 - eg.`-hostname:cmdb*`、 - * `NOT`关系-属性字段前加`~`eg. `~hostname:cmdb*` - * `IN`查询. eg. `hostname:(cmdb*;cmdb-web*)` 小括号, 分号分隔 - * `RANGE`查询. eg. `hostname:[cmdb* _TO_ cmdb-web*]` `_TO_`分隔 - * `COMPARISON`查询. eg. `cpu_core_num:>5` 支持`>, >=, <, <=` - -## api key 认证 - -每个用户会自动生成一个 `api key` 和 一个`secret`, 通过API接口使用的时候,需要提供一个参数 `_key`值为您的`api key`, 以及参数`_secret`值为除`_key`以外的参数,按照**参数名的字典序**排列,并连接到`url path` + `secret`之后的`sha1`**十六进制**值。 - - -## 管理接口 - -### Attribute管理接口 -* GET `/api/v0.1/attributes` 列出所有属性 - * param - * `string:q` 属性名称或者别名,允许为空 - * return - - ``` - { - "numfound": 1, - "attributes": [ - { - "attr_name": "idc", - "is_choice": true, - "choice_value": ["南汇", "欧阳路"], - "attr_id": 1, - "is_multivalue": false, - "attr_alias": "IDC", - "value_type": "text", - "is_uniq": false - } - } - ``` - - * error 无 - - -* GET `/api/v0.1/attributes/`、 `/api/v0.1/attributes/` 根据属性名称、别名或ID获取属性 - * param - * `string:attr_name` 属性名称或别名 - * `int:attr_id` 属性ID - * `attr_id`和`attr_name`选其一 - * return - - ``` - { - "attribute": { - "attr_name": "idc", - "is_choice": true, - "choice_value": ["南汇", "欧阳路"], - "attr_id": 1, - "is_multivalue": false, - "attr_alias": "IDC", - "value_type": "text", - "is_uniq": false - }, - } - ``` - - * error - * `404` 找不到属性 - -* POST `/api/v0.1/attributes` 增加新的属性 - * param - * `string:attr_name` 属性名称 - * `string:attr_alias` 属性别名,可为空,为空时等于`attr_name` - * `boolean:choice_value` 若属性有预定义值, 则不能为空 - * `boolean:is_multivalue` 属性是否允许多值,默认`False` - * `boolean:is_uniq` 属性是否唯一,默认`False` - * `string:value_type` 属性值类型, `Enum("text", "int", "float", "date")`, 默认`text` - - * return - - ``` - { - "attr_id":1 - } - ``` - - * error - * `500` 属性已存在 - * `500` 属性增加失败 - - * PUT `/api/v0.1/attributes/` 修改属性 - * param - * `string:attr_name` 属性名称 - * `string:attr_alias` 属性别名,可为空,为空时等于`attr_name` - * `boolean:choice_value` 若属性有预定义值, 则不能为空 - * `boolean:is_multivalue` 属性是否允许多值,值为0或者1,默认`False` - * `boolean:is_uniq` 属性是否唯一,值为0或者1,默认`False` - * `string:value_type` 属性值类型, `Enum("text", "int", "float", "date")`, 默认`text` - - * return - - ``` - { - "attr_id":1 - } - ``` - - * error - * `500` 属性已存在 - * `500` 属性增加失败 - - * DELETE `/api/v0.1/attributes/` 根据ID删除属性 - * param - * `int:attr_id` 属性ID - * return - - ``` - { - "message":"attribute %s deleted" % attr_name - } - ``` - - * error - * `404` 属性不存在 - * `500` 删除属性失败 - -#### CIType属性管理 - - * GET `/api/v0.1/attributes/citype/` 根据type_id查询固有属性列表 - * return - - ``` - { - "attributes": [ - { - "attr_name": "idc", - "is_choice": true, - "choice_value": ["南汇", "欧阳路"], - "attr_id": 1, - "is_multivalue": false, - "attr_alias": "IDC", - "value_type": "text", - "is_uniq": false - }, - ], - "type_id": 1, - } - ``` - -* POST `/api/v0.1/attributes/citype/` 根据`attr_id`增加CIType的属性 - * param - * `string:attr_id` `,`分隔的`attr_id` - * `int:is_required` 0或者1 - - * return - - ``` - { - "attributes":[1, 2, 3] - } - ``` - - * error - * `404` CIType不存在 - * `404` 属性不存在 - * `500` 增加失败 - -* DELETE `/api/v0.1/attributes/citype/` 删除CIType的属性 - * param - * `string:attr_id` `,`分隔的`attr_id` - - * return - - ``` - { - "attributes":[1, 2, 3] - } - ``` - - * error - * `404` CIType不存在 - * `404` 属性不存在 - * `500` 增加失败 - - -### CIType管理接口 - -* `/api/v0.1/citypes` 列出所有CI类型 - * param `string:type_name` 类型名称,允许为空 - * return - - ``` - { - "numfound": 2, - "citypes": [ - { - "uniq_key": "sn", - "type_name": "物理机", - "type_id": 1, - "enabled": True, - "icon_url": "" - }, - { - "uniq_key": "uuid", - "type_name": "KVM", - "type_id": 2, - "enabled": True, - "icon_url": "" - } - ], - } - ``` - * error 无 - -* GET `/api/v0.1/citypes/query` 查询CI类型 - * param `string:type` 可以是type_id, type_name, type_alias - * return - - ``` - { - "citype": { - "type_name": "software", - "type_id": 4, - "icon_url": "", - "type_alias": "\u8f6f\u4ef6", - "enabled": true, - "uniq_key": 21 - } - } - ``` - * error - * `400` message=输入参数缺失 - * `404` message='citype is not found' - -* POST `/api/v0.1/citypes` 增加新CIType - * param (下列参数任意一个或多个) - * `string:type_name` CIType名称 - * `string:type_alias` 类型别名,可为空 - * `int:_id` 唯一属性ID - * `string:unique` 唯一属性名称 - * `_id`和`unique`只能二选一 - * `icon_url` - * `enabled` 0/1 - * return - - ``` - { - "type_id": 2 - } - ``` - - * error - * `400` message=输入参数缺失 - * `500` message=CIType已存在 - * `500` message=唯一属性不存在 - * `500` message=唯一属性不是唯一的 - -* PUT `/api/v0.1/citypes/` 修改CIType - * param (下列参数任意一个或多个) - * `string:type_name` CIType名称 - * `string:type_alias` 类型别名,可为空 - * `int:_id` 唯一属性ID - * `string:unique` 唯一属性名称 - * `_id`和`unique`只能二选一 - * `icon_url` - * `enabled` 0/1 - * return - - ``` - { - "type_id": 2 - } - ``` - - * error - * `400` message=输入参数缺失 - * `500` message=CIType已存在 - * `500` message=唯一属性不存在 - * `500` message=唯一属性不是唯一的 - -* GET/POST `/api/v0.1/citypes/enable/` 修改CIType - * param - * `enabled` 0 or 1 - * return - - ``` - { - "type_id": 2 - } - ``` - - * error - * `500` 设置失败 - * `404` CIType不存在 - -* DELETE `/api/v0.1/citypes/` 根据ID删除CIType - * return - - ``` - { - "message":"ci type %s deleted" % type_name - } - ``` - * error - * `500` 删除失败 - * `404` CIType不存在 - -### CITypeRelation管理接口 - -* GET `/api/v0.1/cityperelations/types` 列出所有CIType关系类型名 - * return - - ``` - { - "relation_types": ["连接", "位置", "附属", "部署"], - } - ``` - * error 无 - -* GET `/api/v0.1/cityperelations//children` 返回所有child id - * return - - ``` - { - "children": [ - { - "ctr_id": 1, - "type_name": "project", - "type_id": 2, - "icon_url": "", - "type_alias": "应用", - "enabled": true, - "uniq_key": 3 - } - ] - } - ``` - * error 无 - -* GET `/api/v0.1/cityperelations//parents` 返回parent id - * return - - ``` - { - "parents": [{'parent':1, 'relaltion_type': 'containes', "ctr_id":1}], - } - ``` - * error 无 - - -* POST `/api/v0.1/cityperelations//` 增加CIType关系 - * param - * `string:relation_type` 类型名称 - * return - - ``` - { - "ctr_id":1 - } - ``` - * error - * `500` 增加失败 - * `404` CIType不存在 - -* DELETE `/api/v0.1/cityperelations/` 根据`ctr_id`删除CIType关系 - * return - - ``` - { - "message":"CIType relation %s deleted" % type - } - ``` - * error - * `500` 删除失败 - * `404` 关系不存在 - - - -### CI管理接口 - -* GET `/api/v0.1/ci/type/` 查询CIType的所有CI,一次返回25条记录 - * param - * `string:fields` 返回属性名、id,逗号隔开 - * `string:ret_key` 返回属性key,默认'name',还可是'id', 'alias' - * `int:page` 页码 - - * return - - ``` - { - "numfound": 1, - "type_id":1, - "page": 1, - "cis": [ - { - "ci_type": "KVM", - "_type": 1, - "nic": [ - 2 - ], - "hostname": "xxxxxx", - "_unique": "xxxxxx", - "_id": 1 - } - ] - } - ``` - * erorr - * `404` CIType不存在 - -* GET `/api/v0.1/ci/` 查询CI - - * return - - ``` - { - "ci": { - "ci_type": "KVM", - "_type": 1, - "nic": [2], - "hostname": "xxxxx", - "_unique": "xxxxx", - "_id": 1 - }, - "ci_id": 1 - } - ``` - * erorr 无 - - - -* POST `/api/v0.1/ci` 增加CI - * param - * `string:ci_type` CIType name 或者id - * `string:_no_attribute_policy` 当添加不存在的attribute时的策略, 默认`ignore` - * 其他url参数`k=v`: `k` 为属性名(id或别名亦可), `v`为对应的值 - * 此CIType的`unique`字段必须包含在url参数中 - * return - - ``` - { - "ci_id":1, - } - ``` - * erorr - * `500` 添加失败 - -* PUT `/api/v0.1/ci` 修改CI - * param - * `string:ci_type` CIType name 或者id - * `string:_no_attribute_policy` 当添加不存在的attribute时的策略, 默认`ignore` - * 其他url参数`k=v`: `k` 为属性名(id或别名亦可), `v`为对应的值 - * 此CIType的`unique`字段必须包含在url参数中 - * return - - ``` - { - "ci_id":1, - } - ``` - * erorr - * `500` 添加失败 - -* DELETE `/api/v0.1/ci/` 删除ci - * return - - ``` - { - "message":"ok", - } - ``` - * erorr - * `500` 删除失败 - - -## CIRelaiton管理接口 - -* GET `/api/v0.1/cirelations/types` 列出所有CI关系类型名 - * return - - ``` - { - "relation_types": ["connect", "install", "deploy", "contain"], - } - ``` - * error 无 - -* GET `/api/v0.1/cirelations//second_cis` 返回所有second id - * return - - ``` - { - "numfound": 1, - "second_cis": [ - { - "ci_type": "project", - "ci_type_alias": "应用", - "_type": 2, - "_id": 18, - "project_name": "cmdb-api" - } - ] - } - ``` - * error 无 - -* GET `/api/v0.1/cirelations//first_cis` 返回first ci id - * return - - ``` - { - "first_cis": [ - { - "ci_type": "project", - "ci_type_alias": "应用", - "_type": 2, - "_id": 18, - "project_name": "cmdb-api" - } - ], - "numfound": 1 - } - ``` - * error 无 - - -* POST `/api/v0.1/cirelations//` 增加CI关系 - * param - * `int: more` more实例 - * `string:relation_type` 类型名称 - * return - - ``` - { - "cr_id":1 - } - ``` - * error - * `500` 增加失败 - * `404` CI不存在 - -* DELETE `/api/v0.1/cirelations/delete/` 根据`cr_id`删除CI关系 - * return - - ``` - { - "message":"CIType relation %s deleted" % type - } - ``` - * error - * `500` 删除失败 - * `404` 关系不存在 - - - -## 历史记录管理接口 -* GET `/api/v0.1/history/record` 查询历史记录 - * param - * `int: page` - * `string: username` 变更用户 - * `string: start` 变更开始时间 - * `string: end` 变更结束时间 - * return - - ``` - { - "username": "", - "start": "2014-12-31 14:57:43", - "end": "2015-01-07 14:57:43", - "records": [ - { - "origin": null, - "attr_history": [], - "timestamp": "2015-01-01 22:12:39", - "reason": null, - "rel_history": { - "add": 1 - }, - "user": 1, - "record_id": 1234, - "ticket_id": null - } - ] - } - ``` - * error 无 - - * GET `/api/v0.1/history/` 历史记录详情 - * return - - ``` - { - "username": "pycook", - "timestamp": "2015-01-02 20:21:16", - "rel_history": { - "add": [ - [ - 123, - "deploy", - 234 - ] - ], - "delete": [] - }, - "attr_history": {} - } - ``` - - * error - * `404` 该记录不存在 diff --git a/cmdb-api/cmdb_query_api.md b/cmdb-api/cmdb_query_api.md deleted file mode 100644 index ed51597..0000000 --- a/cmdb-api/cmdb_query_api.md +++ /dev/null @@ -1,99 +0,0 @@ -# CMDB查询 API文档 - - - -## 用户接口 - -### CI通用搜索接口 - -* GET `/api/v0.1/ci/s` -* 参数 - * `string:_type` 搜索的ci_type,多个用分号隔开, 例如: _type:(docker;kvm) - * `string:q` 搜索表达式, 例如`q=hostname:cmdb*` - * `string:fl` 返回字段(id, attr_name, attr_alias均可),英文半角逗号分隔 - * `string:ret_key` 返回字段类型 `Enum("id", "name", "alias")` 默认 `name` - * `count` 指定一次返回CI数 - * `facet` 属性字段,逗号分隔,返回属性字段对应的所有值 - * `wt` 返回的数据格式,默认为`json`, 可选参数为`xml` - -* 搜索表达式: - * 简单的字符串 - * `attribute:value` 指定属性搜索, `attribute`可以是`id`,`attr_name`和`attr_alias` - * 以上的组合,逗号分隔 - -* 组合查询支持 - * `AND`关系-`默认关系` - * `OR`关系 - eg.`-hostname:cmdb*`、 - * `NOT`关系-属性字段前加`~`eg. `~hostname:cmdb*` - * `IN`查询. eg. `hostname:(cmdb*;cmdb-web*)` 小括号, 分号分隔 - * `RANGE`查询. eg. `hostname:[cmdb* _TO_ cmdb-web*]` `_TO_`分隔 - * `COMPARISON`查询. eg. `cpu_count:>5` 支持`>, >=, <, <=` - -* 返回结果 - * 搜索表达式 `/api/v0.1/ci/s?q=_type:kvm,status:在线,idc:南汇,private_ip:10.1.1.1*&page=1&fl=hostname,private_ip&facet=private_ip&count=1` - * 返回数据(默认json) - - ``` - { - facet: { - private_ip: [ - [ - "10.1.1.11", - 1, - "private_ip" - ], - [ - "10.1.1.12", - 1, - "private_ip" - ], - [ - "10.1.1.13", - 1, - "private_ip" - ] - ] - }, - total: 1, - numfound: 3, - result: [ - { - ci_type: "kvm", - _type: 8, - _id: 3213, - hostname: "xxx11", - private_ip: [ - "10.1.1.11" - ] - }, - { - ci_type: "kvm", - _type: 8, - _id: 123232, - hostname: "xxx12", - private_ip: [ - "10.1.1.12" - ] - }, - { - ci_type: "kvm", - _type: 8, - _id: 123513, - hostname: "xxx13", - private_ip: [ - "10.1.1.13" - ] - } - ], - counter: { - kvm: 3 - }, - page: 1 - } -``` - - -### CI专用搜索接口 -##### 根据需求实现 - - \ No newline at end of file diff --git a/cmdb-api/command/__init__.py b/cmdb-api/command/__init__.py deleted file mode 100644 index 44d37d3..0000000 --- a/cmdb-api/command/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/cmdb-api/config-sample.cfg b/cmdb-api/config-sample.cfg deleted file mode 100644 index b3c3e65..0000000 --- a/cmdb-api/config-sample.cfg +++ /dev/null @@ -1,55 +0,0 @@ -# coding: utf-8 -# common - -DEBUG = True -SECRET_KEY = 'dsfdjsf@3213!@JKJWL' -HOST = 'http://127.0.0.1:5000' - -# # database -SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://mysqluser:password@127.0.0.1:3306/cmdb?charset=utf8' - -SQLALCHEMY_ECHO = False -SQLALCHEMY_POOL_SIZE = 10 -SQLALCHEMY_POOL_RECYCLE = 300 - -# # cache -CACHE_TYPE = "redis" -CACHE_REDIS_HOST = "127.0.0.1" -CACHE_REDIS_PORT = 6379 -CACHE_KEY_PREFIX = "CMDB-API" -CACHE_DEFAULT_TIMEOUT = 3000 - -# # i18n -ACCEPT_LANGUAGES = ['en', 'zh'] -BABEL_DEFAULT_LOCALE = 'zh' -BABEL_DEFAULT_TIMEZONE = 'Asia/Shanghai' - -# # log -LOG_PATH = './logs/app.log' - -LOG_LEVEL = 'DEBUG' -ADMINS = ('@') - -# # mail -MAIL_SERVER = '' -MAIL_PORT = 25 -MAIL_USE_TLS = False -MAIL_USE_SSL = False -MAIL_DEBUG = True -MAIL_USERNAME = '' -MAIL_PASSWORD = '' -DEFAULT_MAIL_SENDER = '' - - -# # queue -CELERY_RESULT_BACKEND = "redis://127.0.0.1//" -BROKER_URL = 'redis://127.0.0.1//' -BROKER_VHOST = '/' - - -# # pagination -PER_PAGE_COUNT_RANGE = (10, 25, 50, 100) -DEFAULT_PAGE_COUNT = 25 - - -WHITE_LIST = ["127.0.0.1"] diff --git a/cmdb-api/core/__init__.py b/cmdb-api/core/__init__.py deleted file mode 100644 index 99d8104..0000000 --- a/cmdb-api/core/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding:utf-8 -*- - - -from attribute import attribute -from ci_type import citype -from ci_type_relation import cityperelation -from ci_relation import cirelation -from ci import ci -from history import history -from account import account -from special import special \ No newline at end of file diff --git a/cmdb-api/core/account.py b/cmdb-api/core/account.py deleted file mode 100644 index 1a1ae82..0000000 --- a/cmdb-api/core/account.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import Blueprint -from flask import request - -from flask import g -from flask import abort -from flask import jsonify - -from models import row2dict -from lib.account import AccountManager -from lib.auth import auth_with_key - - -account = Blueprint('account', __name__) - - -@account.route("/", methods=["GET"]) -@auth_with_key -def get_user(uid=None): - manager = AccountManager() - user = manager.get_user_by_uid(uid) - if user: - return jsonify(rolenames=user.rolenames, user=row2dict(user)) - else: - return jsonify(user=None) - - -@account.route("", methods=["POST"]) -@auth_with_key -def create_user(): - manager = AccountManager() - params = {} - for k, v in request.values.iteritems(): - params[k] = v - user = manager.create_user(**params) - return jsonify(user=row2dict(user)) - - -@account.route("/", methods=["PUT"]) -@auth_with_key -def update_user(uid=None): - manager = AccountManager() - params = {} - for k, v in request.values.iteritems(): - params[k] = v - ret, res = manager.update_user(uid, **params) - if not ret: - abort(res[0], res[1]) - return jsonify(user=row2dict(res), rolenames=res.rolenames) - - -@account.route("/", methods=["DELETE"]) -@auth_with_key -def delete_user(uid=None): - manager = AccountManager() - ret, res = manager.delete_user(uid) - if not ret: - abort(res[0], res[1]) - return jsonify(uid=uid) - - -@account.route("/validate", methods=["POST"]) -@auth_with_key -def validate(): - username = request.values.get("username") - password = request.values.get("password") - manager = AccountManager() - user, authenticated = manager.validate(username, password) - if user and not authenticated: - return jsonify(code=401, user=row2dict(user), rolenames=user.rolenames) - elif not user: - return jsonify(code=404, message="user is not existed") - return jsonify(code=200, user=row2dict(user), rolenames=user.rolenames) - - -@account.route("/key", methods=["PUT"]) -@auth_with_key -def update_key(): - manager = AccountManager() - ret, res = manager.reset_key(g.user.uid) - if not ret: - abort(res[0], res[1]) - return jsonify(user=row2dict(res), rolenames=res.rolenames) - - -@account.route("/password", methods=["PUT"]) -@auth_with_key -def update_password(): - manager = AccountManager() - old = request.values.get("password") - new = request.values.get("new_password") - confirm = request.values.get("confirm") - ret, res = manager.update_password(g.user.uid, old, new, confirm) - if not ret: - abort(res[0], res[1]) - return jsonify(user=row2dict(res), rolenames=res.rolenames) diff --git a/cmdb-api/core/attribute.py b/cmdb-api/core/attribute.py deleted file mode 100644 index edff09e..0000000 --- a/cmdb-api/core/attribute.py +++ /dev/null @@ -1,145 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import jsonify -from flask import request -from flask import Blueprint -from flask import abort -from flask import current_app - -from lib.attribute import AttributeManager -from lib.ci_type import CITypeAttributeManager -from lib.decorator import argument_required -from lib.exception import InvalidUsageError -from lib.auth import auth_with_key - -attribute = Blueprint("attribute", __name__) - - -@attribute.route("", methods=["GET"]) -def get_attributes(): - q = request.values.get("q") - attrs = AttributeManager().get_attributes(name=q) - count = len(attrs) - return jsonify(numfound=count, attributes=attrs) - - -@attribute.route("/", methods=["GET"]) -@attribute.route("/", methods=["GET"]) -def get_attribute(attr_name=None, attr_id=None): - attr_manager = AttributeManager() - attr_dict = None - if attr_name is not None: - attr_dict = attr_manager.get_attribute_by_name(attr_name) - if attr_dict is None: - attr_dict = attr_manager.get_attribute_by_alias(attr_name) - elif attr_id is not None: - attr_dict = attr_manager.get_attribute_by_id(attr_id) - if attr_dict is not None: - return jsonify(attribute=attr_dict) - abort(404, "attribute not found") - - -@attribute.route("", methods=["POST"]) -@auth_with_key -def create_attribute(): - with argument_required("attr_name"): - attr_name = request.values.get("attr_name") - current_app.logger.info(attr_name) - attr_alias = request.values.get("attr_alias", attr_name) - choice_value = request.values.get("choice_value") - is_multivalue = request.values.get("is_multivalue", False) - is_uniq = request.values.get("is_uniq", False) - is_index = request.values.get("is_index", False) - value_type = request.values.get("value_type", "text") - try: - is_multivalue = int(is_multivalue) - is_uniq = int(is_uniq) - is_index = int(is_index) - except ValueError: - raise InvalidUsageError("argument format is error") - attr_manager = AttributeManager() - kwargs = {"choice_value": choice_value, "is_multivalue": is_multivalue, - "is_uniq": is_uniq, "value_type": value_type, - "is_index": is_index} - ret, res = attr_manager.add(attr_name, attr_alias, **kwargs) - if not ret: - return abort(500, res) - return jsonify(attr_id=res) - - -@attribute.route("/", methods=["PUT"]) -@auth_with_key -def update_attribute(attr_id=None): - with argument_required("attr_name"): - attr_name = request.values.get("attr_name") - attr_alias = request.values.get("attr_alias", attr_name) - choice_value = request.values.get("choice_value") - is_multivalue = request.values.get("is_multivalue", False) - is_uniq = request.values.get("is_uniq", False) - value_type = request.values.get("value_type", "text") - try: - is_multivalue = int(is_multivalue) - is_uniq = int(is_uniq) - except ValueError: - raise InvalidUsageError("argument format is error") - attr_manager = AttributeManager() - kwargs = {"choice_value": choice_value, "is_multivalue": is_multivalue, - "is_uniq": is_uniq, "value_type": value_type} - ret, res = attr_manager.update(attr_id, attr_name, - attr_alias, **kwargs) - if not ret: - return abort(500, res) - return jsonify(attr_id=res) - - -@attribute.route("/", methods=["DELETE"]) -@auth_with_key -def delete_attribute(attr_id=None): - attr_manager = AttributeManager() - res = attr_manager.delete(attr_id) - return jsonify(message="attribute {0} deleted".format(res)) - - -@attribute.route("/citype/", methods=["GET"]) -def get_attributes_by_type(type_id=None): - manager = CITypeAttributeManager() - from models.cmdb import CITypeCache, CIAttributeCache - - t = CITypeCache.get(type_id) - if not t: - return abort(400, "CIType {0} is not existed".format(type_id)) - uniq_id = t.uniq_id - unique = CIAttributeCache.get(uniq_id).attr_name - return jsonify(attributes=manager.get_attributes_by_type_id(type_id), - type_id=type_id, uniq_id=uniq_id, unique=unique) - - -@attribute.route("/citype/", methods=["POST"]) -@auth_with_key -def create_attributes_to_citype(type_id=None): - with argument_required("attr_id"): - attr_ids = request.values.get("attr_id", "") - is_required = request.values.get("is_required", False) - attr_id_list = attr_ids.strip().split(",") - if "" in attr_id_list: - attr_id_list.remove("") - attr_id_list = map(int, attr_id_list) - try: - is_required = int(is_required) - except ValueError: - abort(500, "argument format is error") - manager = CITypeAttributeManager() - manager.add(type_id, attr_id_list, is_required=is_required) - return jsonify(attributes=attr_id_list) - - -@attribute.route("/citype/", methods=["DELETE"]) -@auth_with_key -def delete_attribute_in_type(type_id=None): - with argument_required("attr_id"): - attr_ids = request.values.get("attr_id", "") - attr_id_list = attr_ids.strip().split(",") - manager = CITypeAttributeManager() - manager.delete(type_id, attr_id_list) - return jsonify(attributes=attr_id_list) \ No newline at end of file diff --git a/cmdb-api/core/ci.py b/cmdb-api/core/ci.py deleted file mode 100644 index 151e0aa..0000000 --- a/cmdb-api/core/ci.py +++ /dev/null @@ -1,189 +0,0 @@ -# -*- coding:utf-8 -*- - -import sys -reload(sys) -sys.setdefaultencoding("utf-8") -import time -import urllib - -from flask import Blueprint -from flask import request -from flask import jsonify -from flask import current_app -from flask import make_response -from flask import render_template -from flask import abort - -from lib.auth import auth_with_key -from lib.ci import CIManager -from lib.search import Search -from lib.search import SearchError -from lib.utils import get_page -from lib.utils import get_per_page -from models.ci_type import CITypeCache - -ci = Blueprint("ci", __name__) - - -@ci.route("/type/", methods=["GET"]) -def get_cis_by_type(type_id=None): - fields = request.args.get("fields", "").strip().split(",") - fields = filter(lambda x: x != "", fields) - - ret_key = request.args.get("ret_key", "name") - if ret_key not in ('name', 'alias', 'id'): - ret_key = 'name' - - page = get_page(request.values.get("page", 1)) - count = get_per_page(request.values.get("count")) - manager = CIManager() - res = manager.get_cis_by_type(type_id, ret_key=ret_key, - fields=fields, page=page, per_page=count) - return jsonify(type_id=type_id, numfound=res[0], - total=len(res[2]), page=res[1], cis=res[2]) - - -@ci.route("/", methods=['GET']) -def get_ci(ci_id=None): - fields = request.args.get("fields", "").strip().split(",") - fields = filter(lambda x: x != "", fields) - - ret_key = request.args.get("ret_key", "name") - if ret_key not in ('name', 'alias', 'id'): - ret_key = 'name' - - manager = CIManager() - ci = manager.get_ci_by_id(ci_id, ret_key=ret_key, fields=fields) - return jsonify(ci_id=ci_id, ci=ci) - - -@ci.route("/s", methods=["GET"]) -@ci.route("/search", methods=["GET"]) -def search(): - """@params: q: query statement - fl: filter by column - count: the number of ci - ret_key: id, name, alias - facet: statistic - wt: result format - """ - page = get_page(request.values.get("page", 1)) - count = get_per_page(request.values.get("count")) - - query = request.values.get('q', "") - fl = request.values.get('fl', "").split(",") - ret_key = request.values.get('ret_key', "name") - if ret_key not in ('name', 'alias', 'id'): - ret_key = 'name' - facet = request.values.get("facet", "").split(",") - wt = request.values.get('wt', 'json') - fl = filter(lambda x: x != "", fl) - facet = filter(lambda x: x != "", facet) - sort = request.values.get("sort") - - start = time.time() - s = Search(query, fl, facet, page, ret_key, count, sort) - try: - response, counter, total, page, numfound, facet = s.search() - except SearchError, e: - return abort(400, str(e)) - except Exception, e: - current_app.logger.error(str(e)) - return abort(500, "search unknown error") - - if wt == 'xml': - res = make_response( - render_template("search.xml", - counter=counter, - total=total, - result=response, - page=page, - numfound=numfound, - facet=facet)) - res.headers['Content-type'] = 'text/xml' - return res - current_app.logger.debug("search time is :{0}".format( - time.time() - start)) - return jsonify(numfound=numfound, - total=total, - page=page, - facet=facet, - counter=counter, - result=response) - - -@ci.route("", methods=["POST"]) -@auth_with_key -def create_ci(): - ci_type = request.values.get("ci_type") - _no_attribute_policy = request.values.get("_no_attribute_policy", "ignore") - - ci_dict = dict() - for k, v in request.values.iteritems(): - if k != "ci_type" and not k.startswith("_"): - ci_dict[k] = v.strip() - - manager = CIManager() - current_app.logger.debug(ci_dict) - ci_id = manager.add(ci_type, exist_policy="reject", - _no_attribute_policy=_no_attribute_policy, **ci_dict) - return jsonify(ci_id=ci_id) - - -@ci.route("", methods=["PUT"]) -@auth_with_key -def update_ci(): - if request.data: - args = dict() - _args = request.data.split("&") - for arg in _args: - if arg: - args[arg.split("=")[0]] = \ - urllib.unquote(urllib.unquote(arg.split("=")[1])) - else: - args = request.values - - ci_type = args.get("ci_type") - _no_attribute_policy = args.get("_no_attribute_policy", "ignore") - ci_dict = dict() - for k, v in args.items(): - if k != "ci_type" and not k.startswith("_"): - ci_dict[k] = v.strip() - - manager = CIManager() - ci_id = manager.add(ci_type, exist_policy="replace", - _no_attribute_policy=_no_attribute_policy, **ci_dict) - return jsonify(ci_id=ci_id) - - -@ci.route("/", methods=["DELETE"]) -@auth_with_key -def delete_ci(ci_id=None): - manager = CIManager() - manager.delete(ci_id) - return jsonify(message="ok") - - -@ci.route("/heartbeat//", methods=["POST"]) -def add_heartbeat(ci_type, unique): - if not unique or not ci_type: - return jsonify(message="error") - # return jsonify(message="ok") - return jsonify(message=CIManager().add_heartbeat(ci_type, unique)) - - -@ci.route("/heartbeat", methods=["GET"]) -def get_heartbeat(): - page = get_page(request.values.get("page", 1)) - ci_type = request.values.get("ci_type", "").strip() - try: - ci_type = CITypeCache.get(ci_type).type_id - except: - return jsonify(numfound=0, result=[]) - agent_status = request.values.get("agent_status", None) - if agent_status: - agent_status = int(agent_status) - numfound, result = CIManager().get_heartbeat(page, - ci_type, - agent_status=agent_status) - return jsonify(numfound=numfound, result=result) \ No newline at end of file diff --git a/cmdb-api/core/ci_relation.py b/cmdb-api/core/ci_relation.py deleted file mode 100644 index 63233df..0000000 --- a/cmdb-api/core/ci_relation.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import Blueprint -from flask import jsonify -from flask import request - -from lib.ci import CIRelationManager -from lib.utils import get_page -from lib.utils import get_per_page -from lib.auth import auth_with_key - - -cirelation = Blueprint("cirelation", __name__) - - -@cirelation.route("/types", methods=["GET"]) -def get_types(): - manager = CIRelationManager() - return jsonify(relation_types=manager.relation_types) - - -@cirelation.route("//second_cis", methods=["GET"]) -def get_second_cis_by_first_ci(first_ci=None): - page = get_page(request.values.get("page", 1)) - count = get_per_page(request.values.get("count")) - relation_type = request.values.get("relation_type", "contain") - manager = CIRelationManager() - numfound, total, second_cis = manager.get_second_cis( - first_ci, page=page, per_page=count, relation_type=relation_type) - return jsonify(numfound=numfound, total=total, - page=page, second_cis=second_cis) - - -@cirelation.route("//first_cis", methods=["GET"]) -def get_first_cis_by_second_ci(second_ci=None): - page = get_page(request.values.get("page", 1)) - count = get_per_page(request.values.get("count")) - relation_type = request.values.get("relation_type", "contain") - - manager = CIRelationManager() - numfound, total, first_cis = manager.get_first_cis( - second_ci, per_page=count, page=page, relation_type=relation_type) - return jsonify(numfound=numfound, total=total, - page=page, first_cis=first_cis) - - -@cirelation.route("//", methods=["POST"]) -@auth_with_key -def create_ci_relation(first_ci=None, second_ci=None): - relation_type = request.values.get("relation_type", "contain") - manager = CIRelationManager() - res = manager.add(first_ci, second_ci, relation_type=relation_type) - return jsonify(cr_id=res) - - -@cirelation.route("/", methods=["DELETE"]) -@auth_with_key -def delete_ci_relation(cr_id=None): - manager = CIRelationManager() - manager.delete(cr_id) - return jsonify(message="CIType Relation is deleted") - - -@cirelation.route("//", methods=["DELETE"]) -@auth_with_key -def delete_ci_relation_2(first_ci, second_ci): - manager = CIRelationManager() - manager.delete_2(first_ci, second_ci) - return jsonify(message="CIType Relation is deleted") \ No newline at end of file diff --git a/cmdb-api/core/ci_type.py b/cmdb-api/core/ci_type.py deleted file mode 100644 index 85efa12..0000000 --- a/cmdb-api/core/ci_type.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import Blueprint -from flask import jsonify -from flask import request -from flask import abort - -from lib.ci_type import CITypeManager -from lib.decorator import argument_required -from lib.auth import auth_with_key - - -citype = Blueprint("citype", __name__) - - -@citype.route("", methods=["GET"]) -def get_citypes(): - type_name = request.args.get("type_name") - manager = CITypeManager() - citypes = manager.get_citypes(type_name) - count = len(citypes) - return jsonify(numfound=count, citypes=citypes) - - -@citype.route("/query", methods=["GET"]) -def query(): - with argument_required("type"): - _type = request.args.get("type") - manager = CITypeManager() - res = manager.query(_type) - return jsonify(citype=res) - - -@citype.route("", methods=["POST"]) -@auth_with_key -def create_citype(): - with argument_required("type_name"): - type_name = request.values.get("type_name") - type_alias = request.values.get("type_alias") - if type_alias is None: - type_alias = type_name - _id = request.values.get("_id") - unique = request.values.get("unique") - enabled = request.values.get("enabled", True) - icon_url = request.values.get("icon_url", "") - manager = CITypeManager() - ret, res = manager.add(type_name, type_alias, _id=_id, - unique=unique, enabled=enabled, - icon_url=icon_url) - if ret: - return jsonify(type_id=res) - abort(500, res) - - -@citype.route("/", methods=["PUT"]) -@auth_with_key -def update_citype(type_id=None): - type_name = request.values.get("type_name") - type_alias = request.values.get("type_alias") - _id = request.values.get("_id") - unique = request.values.get("unique") - icon_url = request.values.get("icon_url") - enabled = request.values.get("enabled") - enabled = False if enabled in (0, "0") else True \ - if enabled is not None else None - manager = CITypeManager() - ret, res = manager.update(type_id, type_name, type_alias, _id=_id, - unique=unique, icon_url=icon_url, - enabled=enabled) - if ret: - return jsonify(type_id=type_id) - abort(500, res) - - -@citype.route("/", methods=["DELETE"]) -@auth_with_key -def delete_citype(type_id=None): - manager = CITypeManager() - res = manager.delete(type_id) - return jsonify(message=res) - - -@citype.route("/enable/", methods=["GET", "POST"]) -def enable(type_id=None): - enable = request.values.get("enable", True) - manager = CITypeManager() - manager.set_enabled(type_id, enabled=enable) - return jsonify(type_id=type_id) \ No newline at end of file diff --git a/cmdb-api/core/ci_type_relation.py b/cmdb-api/core/ci_type_relation.py deleted file mode 100644 index 36d72ca..0000000 --- a/cmdb-api/core/ci_type_relation.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import Blueprint -from flask import jsonify -from flask import request - -from lib.ci_type import CITypeRelationManager -from lib.auth import auth_with_key - - -cityperelation = Blueprint("cityperelation", __name__) - - -@cityperelation.route("/types", methods=["GET"]) -def get_types(): - manager = CITypeRelationManager() - return jsonify(relation_types=manager.relation_types) - - -@cityperelation.route("//children", methods=["GET"]) -def get_children_by_parent(parent=None): - manager = CITypeRelationManager() - return jsonify(children=manager.get_children(parent)) - - -@cityperelation.route("//parents", methods=["GET"]) -def get_parents_by_child(child=None): - manager = CITypeRelationManager() - return jsonify(parents=manager.get_parents(child)) - - -@cityperelation.route("//", methods=["POST"]) -@auth_with_key -def create_citype_realtions(parent=None, child=None): - relation_type = request.values.get("relation_type", "contain") - manager = CITypeRelationManager() - res = manager.add(parent, child, relation_type=relation_type) - return jsonify(ctr_id=res) - - -@cityperelation.route("/", methods=["DELETE"]) -@auth_with_key -def delete_citype_relation(ctr_id=None): - manager = CITypeRelationManager() - manager.delete(ctr_id) - return jsonify(message="CIType Relation is deleted") - - -@cityperelation.route("//", methods=["DELETE"]) -@auth_with_key -def delete_citype_relation_2(parent=None, child=None): - manager = CITypeRelationManager() - manager.delete_2(parent, child) - return jsonify(message="CIType Relation is deleted") diff --git a/cmdb-api/core/history.py b/cmdb-api/core/history.py deleted file mode 100644 index 5eee828..0000000 --- a/cmdb-api/core/history.py +++ /dev/null @@ -1,116 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from flask import jsonify -from flask import current_app -from flask import Blueprint -from flask import request -from flask import abort - -from models.history import OperationRecord -from models.history import CIRelationHistory -from models.history import CIAttributeHistory -from models.attribute import CIAttributeCache -from extensions import db -from models import row2dict -from models.account import UserCache -from lib.ci import CIManager -from lib.utils import get_page - -history = Blueprint("history", __name__) - - -@history.route("/record", methods=["GET"]) -def get_record(): - page = get_page(request.values.get("page", 1)) - _start = request.values.get("start") - _end = request.values.get("end") - username = request.values.get("username", "") - per_page_cnt = current_app.config.get("DEFAULT_PAGE_COUNT") - start, end = None, None - if _start: - try: - start = datetime.datetime.strptime(_start, '%Y-%m-%d %H:%M:%S') - except ValueError: - abort(400, 'incorrect start date time') - if _end: - try: - end = datetime.datetime.strptime(_end, '%Y-%m-%d %H:%M:%S') - except ValueError: - abort(400, 'incorrect end date time') - records = db.session.query(OperationRecord) - numfound = db.session.query(db.func.count(OperationRecord.record_id)) - if start: - records = records.filter(OperationRecord.timestamp >= start) - numfound = numfound.filter(OperationRecord.timestamp >= start) - if end: - records = records.filter(OperationRecord.timestamp <= end) - numfound = records.filter(OperationRecord.timestamp <= end) - if username: - user = UserCache.get(username) - if user: - records = records.filter(OperationRecord.uid == user.uid) - else: - return jsonify(numfound=0, records=[], - page=1, total=0, start=_start, - end=_end, username=username) - records = records.order_by(-OperationRecord.record_id).offset( - per_page_cnt * (page - 1)).limit(per_page_cnt).all() - total = len(records) - numfound = numfound.first()[0] - res = [] - for record in records: - _res = row2dict(record) - _res["user"] = UserCache.get(_res.get("uid")).nickname \ - if UserCache.get(_res.get("uid")).nickname \ - else UserCache.get(_res.get("uid")).username - attr_history = db.session.query(CIAttributeHistory.attr_id).filter( - CIAttributeHistory.record_id == _res.get("record_id")).all() - _res["attr_history"] = [CIAttributeCache.get(h.attr_id).attr_alias - for h in attr_history] - rel_history = db.session.query(CIRelationHistory.operate_type).filter( - CIRelationHistory.record_id == _res.get("record_id")).all() - rel_statis = {} - for rel in rel_history: - if rel.operate_type not in rel_statis: - rel_statis[rel.operate_type] = 1 - else: - rel_statis[rel.res.operate_type] += 1 - _res["rel_history"] = rel_statis - res.append(_res) - - return jsonify(numfound=numfound, records=res, page=page, total=total, - start=_start, end=_end, username=username) - - -@history.route("/", methods=["GET"]) -def get_detail_by_record(record_id=None): - record = db.session.query(OperationRecord).filter( - OperationRecord.record_id == record_id).first() - if record is None: - abort(404, "record is not found") - username = UserCache.get(record.uid).nickname \ - if UserCache.get(record.uid).nickname \ - else UserCache.get(record.uid).username - timestamp = record.timestamp.strftime("%Y-%m-%d %H:%M:%S") - attr_history = db.session.query(CIAttributeHistory).filter( - CIAttributeHistory.record_id == record_id).all() - rel_history = db.session.query(CIRelationHistory).filter( - CIRelationHistory.record_id == record_id).all() - attr_dict, rel_dict = dict(), {"add": [], "delete": []} - for attr_h in attr_history: - attr_dict[CIAttributeCache.get(attr_h.attr_id).attr_alias] = { - "old": attr_h.old, "new": attr_h.new, - "operate_type": attr_h.operate_type} - manager = CIManager() - for rel_h in rel_history: - _, first = manager.get_ci_by_id(rel_h.first_ci_id) - _, second = manager.get_ci_by_id(rel_h.second_ci_id) - rel_dict[rel_h.operate_type].append( - (first, rel_h.relation_type, second)) - - return jsonify(username=username, timestamp=timestamp, - attr_history=attr_dict, - rel_history=rel_dict) diff --git a/cmdb-api/core/special.py b/cmdb-api/core/special.py deleted file mode 100644 index 019e5f5..0000000 --- a/cmdb-api/core/special.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import Blueprint -from flask import jsonify - - -special = Blueprint(__name__, "special") - - -@special.route("/api/v0.1/special", methods=["GET"]) -def index(): - """ - 定义专用接口 - """ - return jsonify(code=200) \ No newline at end of file diff --git a/cmdb-api/core/statis.py b/cmdb-api/core/statis.py deleted file mode 100644 index 20b5061..0000000 --- a/cmdb-api/core/statis.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import Blueprint - - -statis = Blueprint("statis", __name__) - - -@statis.route("") -def statis(): - pass \ No newline at end of file diff --git a/cmdb-api/extensions.py b/cmdb-api/extensions.py deleted file mode 100644 index 5dfb606..0000000 --- a/cmdb-api/extensions.py +++ /dev/null @@ -1,16 +0,0 @@ -# encoding=utf-8 - - -from flask.ext.mail import Mail -from flask.ext.sqlalchemy import SQLAlchemy -from flask.ext.cache import Cache -from flask.ext.celery import Celery - - -__all__ = ['mail', 'db', 'cache', 'celery'] - - -mail = Mail() -db = SQLAlchemy() -cache = Cache() -celery = Celery() \ No newline at end of file diff --git a/cmdb-api/gunicornserver.py b/cmdb-api/gunicornserver.py deleted file mode 100644 index 6c5feab..0000000 --- a/cmdb-api/gunicornserver.py +++ /dev/null @@ -1,72 +0,0 @@ -# encoding=utf-8 - -from flask_script import Command, Option - - -class GunicornServer(Command): - description = 'Run the app within Gunicorn' - - def __init__(self, host='127.0.0.1', port=5000, workers=8, - worker_class="gevent", daemon=False): - self.port = port - self.host = host - self.workers = workers - self.worker_class = worker_class - self.daemon = daemon - - def get_options(self): - return ( - Option('-H', '--host', - dest='host', - default=self.host), - - Option('-p', '--port', - dest='port', - type=int, - default=self.port), - - Option('-w', '--workers', - dest='workers', - type=int, - default=self.workers), - - Option("-c", "--worker_class", - dest='worker_class', - type=str, - default=self.worker_class), - - Option("-d", "--daemon", - dest="daemon", - type=bool, - default=self.daemon) - ) - - def handle(self, app, host, port, workers, worker_class, daemon): - - from gunicorn import version_info - - if version_info < (0, 9, 0): - from gunicorn.arbiter import Arbiter - from gunicorn.config import Config - - arbiter = Arbiter(Config({'bind': "%s:%d" % (host, int(port)), - 'workers': workers, - 'worker_class': worker_class, - 'daemon': daemon}), app) - arbiter.run() - else: - from gunicorn.app.base import Application - - class FlaskApplication(Application): - def init(self, parser, opts, args): - return { - 'bind': '{0}:{1}'.format(host, port), - 'workers': workers, - 'worker_class': worker_class, - 'daemon': daemon - } - - def load(self): - return app - - FlaskApplication().run() diff --git a/cmdb-api/lib/__init__.py b/cmdb-api/lib/__init__.py deleted file mode 100644 index ef612ed..0000000 --- a/cmdb-api/lib/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding:utf-8 -*- - - -__all__ = [] \ No newline at end of file diff --git a/cmdb-api/lib/account.py b/cmdb-api/lib/account.py deleted file mode 100644 index 31bb2b1..0000000 --- a/cmdb-api/lib/account.py +++ /dev/null @@ -1,145 +0,0 @@ -# -*- coding:utf-8 -*- - - -import uuid -import random -import string -import datetime - -from flask import current_app -from flask import abort - -from extensions import db -from models.account import UserCache -from models.account import User -from models.account import UserRole - - -class AccountManager(object): - def __init__(self): - pass - - def get_user_by_uid(self, uid): - user = UserCache.get(uid) - return user - - def _generate_key(self): - key = uuid.uuid4().hex - secret = ''.join(random.sample(string.ascii_letters + - string.digits + '~!@#$%^&*?', 32)) - return key, secret - - def validate(self, username, password): - user, authenticated = User.query.authenticate(username, password) - return user, authenticated - - def create_user(self, **kwargs): - username = kwargs.get("username") - if username: - user = UserCache.get(username) - if user is not None: - user, authenticated = self.validate( - username, kwargs.get("password")) - if authenticated: - return user - else: - return abort(401, "authenticate validate failed") - else: - return abort(400, "argument username is required") - user = User() - email = kwargs.get("email", "") - if not email: - return abort(400, "argument email is required") - user.email = email - user.password = kwargs.get("password") - user.username = kwargs.get("username", "") - user.nickname = kwargs.get("nickname") if kwargs.get("nickname") \ - else kwargs.get("username", "") - key, secret = self._generate_key() - user.key = key - user.secret = secret - user.date_joined = datetime.datetime.now() - user.block = 0 - - db.session.add(user) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("create user is error {0}".format(str(e))) - return abort(500, "create user is error, {0}".format(str(e))) - return user - - def update_user(self, uid, **kwargs): - user = UserCache.get(uid) - if user is None: - return abort(400, "the user[{0}] is not existed".format(uid)) - user.username = kwargs.get("username", "") \ - if kwargs.get("username") else user.username - user.nickname = kwargs.get("nickname") \ - if kwargs.get("nickname") else user.nickname - user.department = kwargs.get("department") \ - if kwargs.get("department") else user.department - user.catalog = kwargs.get("catalog") \ - if kwargs.get("catalog") else user.catalog - user.email = kwargs.get("email") \ - if kwargs.get("email") else user.email - user.mobile = kwargs.get("mobile") \ - if kwargs.get("mobile") else user.mobile - db.session.add(user) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("create user is error {0}".format(str(e))) - return abort(500, "create user is error, {0}".format(str(e))) - return True, user - - def delete_user(self, uid): - user = UserCache.get(uid) - if user is None: - return abort(400, "the user[{0}] is not existed".format(uid)) - db.session.query(UserRole).filter(UserRole.uid == uid).delete() - db.session.delete(user) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("delete user error, {0}".format(str(e))) - return abort(500, "delete user error, {0}".format(str(e))) - return True, uid - - def update_password(self, uid, old, new, confirm): - user = User.query.get(uid) - if not user: - return abort(400, "user is not existed") - if not user.check_password(old): - return abort(400, "invalidate old password") - if not (new and confirm and new == confirm): - return abort(400, """Password cannot be empty, - two inputs must be the same""") - user.password = new - db.session.add(user) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("set password error, %s" % str(e)) - return abort(500, "set password errors, {0:s}".format(str(e))) - return True, user - - def reset_key(self, uid): - user = UserCache.get(uid) - if user is None: - return abort(400, "the user[{0}] is not existed".format(uid)) - key, secret = self._generate_key() - user.key = key - user.secret = secret - db.session.add(user) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("reset key is error, {0}".format(str(e))) - return abort(500, "reset key is error, {0}".format(str(e))) - return True, user \ No newline at end of file diff --git a/cmdb-api/lib/attribute.py b/cmdb-api/lib/attribute.py deleted file mode 100644 index 19e889d..0000000 --- a/cmdb-api/lib/attribute.py +++ /dev/null @@ -1,167 +0,0 @@ -# -*- coding:utf-8 -*- - -from flask import current_app -from flask import abort - -from extensions import db -from models.attribute import CIAttribute -from models.attribute import CIAttributeCache -from models import row2dict -from lib.const import type_map - - -class AttributeManager(object): - """ - CI attributes manager - """ - - def __init__(self): - pass - - def _get_choice_value(self, attr_id, value_type): - _table = type_map.get("choice").get(value_type) - choice_values = db.session.query(_table.value).filter( - _table.attr_id == attr_id).all() - return [choice_value.value for choice_value in choice_values] - - def _add_choice_value(self, choice_value, attr_id, value_type): - _table = type_map.get("choice").get(value_type) - db.session.query(_table).filter(_table.attr_id == attr_id).delete() - db.session.flush() - for v in choice_value.strip().split(","): - table = _table() - table.attr_id = attr_id - table.value = v - db.session.add(table) - db.session.flush() - - def get_attributes(self, name=None): - """ - return attribute by name, - if name is None, then return all attributes - """ - attrs = db.session.query(CIAttribute).filter( - CIAttribute.attr_name.ilike("%{0}%".format(name))).all() \ - if name is not None else db.session.query(CIAttribute).all() - res = list() - for attr in attrs: - attr_dict = row2dict(attr) - if attr.is_choice: - attr_dict["choice_value"] = self._get_choice_value( - attr.attr_id, attr.value_type) - res.append(attr_dict) - return res - - def get_attribute_by_name(self, attr_name): - attr = db.session.query(CIAttribute).filter( - CIAttribute.attr_name == attr_name).first() - if attr: - attr_dict = row2dict(attr) - if attr.is_choice: - attr_dict["choice_value"] = self._get_choice_value( - attr.attr_id, attr.value_type) - return attr_dict - - def get_attribute_by_alias(self, attr_alias): - attr = db.session.query(CIAttribute).filter( - CIAttribute.attr_alias == attr_alias).first() - if attr: - attr_dict = row2dict(attr) - if attr.is_choice: - attr_dict["choice_value"] = self._get_choice_value( - attr.attr_id, attr.value_type) - return attr_dict - - def get_attribute_by_id(self, attr_id): - attr = db.session.query(CIAttribute).filter( - CIAttribute.attr_id == attr_id).first() - if attr: - attr_dict = row2dict(attr) - if attr.is_choice: - attr_dict["choice_value"] = self._get_choice_value( - attr.attr_id, attr.value_type) - return attr_dict - - def add(self, attr_name, attr_alias, **kwargs): - choice_value = kwargs.get("choice_value", False) - attr = CIAttributeCache.get(attr_name) - if attr is not None: - return False, "attribute {0} is already existed".format(attr_name) - is_choice = False - if choice_value: - is_choice = True - if not attr_alias: - attr_alias = attr_name - attr = CIAttribute() - attr.attr_name = attr_name - attr.attr_alias = attr_alias - attr.is_choice = is_choice - attr.is_multivalue = kwargs.get("is_multivalue", False) - attr.is_uniq = kwargs.get("is_uniq", False) - attr.is_index = kwargs.get("is_index", False) - attr.value_type = kwargs.get("value_type", "text") - db.session.add(attr) - db.session.flush() - - if choice_value: - self._add_choice_value(choice_value, attr.attr_id, attr.value_type) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("add attribute error, {0}".format(str(e))) - return False, str(e) - CIAttributeCache.clean(attr) - return True, attr.attr_id - - def update(self, attr_id, *args, **kwargs): - attr = db.session.query(CIAttribute).filter_by(attr_id=attr_id).first() - if not attr: - return False, "CI attribute you want to update is not existed" - choice_value = kwargs.get("choice_value", False) - is_choice = False - if choice_value: - is_choice = True - attr.attr_name = args[0] - attr.attr_alias = args[1] - if not args[1]: - attr.attr_alias = args[0] - attr.is_choice = is_choice - attr.is_multivalue = kwargs.get("is_multivalue", False) - attr.is_uniq = kwargs.get("is_uniq", False) - attr.value_type = kwargs.get("value_type", "text") - db.session.add(attr) - db.session.flush() - if is_choice: - self._add_choice_value(choice_value, attr.attr_id, attr.value_type) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("update attribute error, {0}".format( - str(e))) - return False, str(e) - CIAttributeCache.clean(attr) - return True, attr.attr_id - - def delete(self, attr_id): - attr, name = db.session.query(CIAttribute).filter_by( - attr_id=attr_id).first(), None - if attr: - if attr.is_choice: - choice_table = type_map["choice"].get(attr.value_type) - db.session.query(choice_table).filter( - choice_table.attr_id == attr_id).delete() - name = attr.attr_name - CIAttributeCache.clean(attr) - db.session.delete(attr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("delete attribute error, {0}".format( - str(e))) - return abort(500, str(e)) - else: - return abort(404, "attribute you want to delete is not existed") - return name \ No newline at end of file diff --git a/cmdb-api/lib/auth.py b/cmdb-api/lib/auth.py deleted file mode 100644 index ce43d43..0000000 --- a/cmdb-api/lib/auth.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding:utf-8 -*- - -import urllib -from functools import wraps - -from flask import current_app -from flask import g -from flask import request -from flask import abort -from flask.ext.principal import identity_changed -from flask.ext.principal import Identity -from flask.ext.principal import AnonymousIdentity - -from models.account import User -from models.account import UserCache - - -def auth_with_key(func): - @wraps(func) - def wrapper(*args, **kwargs): - if isinstance(getattr(g, 'user', None), User): - identity_changed.send(current_app._get_current_object(), - identity=Identity(g.user.uid)) - return func(*args, **kwargs) - ip = request.remote_addr - if request.data: - request_args = dict() - _args = request.data.split("&") - for arg in _args: - if arg: - request_args[arg.split("=")[0]] = \ - urllib.unquote(arg.split("=")[1]) - else: - request_args = request.values - - key = request_args.get('_key') - secret = request_args.get('_secret') - if not key and not secret and \ - ip.strip() in current_app.config.get("WHITE_LIST"): - ip = ip.strip() - user = UserCache.get(ip) - if user: - identity_changed.send(current_app._get_current_object(), - identity=Identity(user.uid)) - return func(*args, **kwargs) - else: - identity_changed.send(current_app._get_current_object(), - identity=AnonymousIdentity()) - return abort(400, "invalid _key and _secret") - - path = request.path - - keys = sorted(request_args.keys()) - req_args = [request_args[k] for k in keys - if str(k) not in ("_key", "_secret")] - current_app.logger.debug('args is %s' % req_args) - user, authenticated = User.query.authenticate_with_key( - key, secret, req_args, path) - if user and authenticated: - identity_changed.send(current_app._get_current_object(), - identity=Identity(user.get("uid"))) - return func(*args, **kwargs) - else: - identity_changed.send(current_app._get_current_object(), - identity=AnonymousIdentity()) - return abort(400, "invalid _key and _secret") - - return wrapper diff --git a/cmdb-api/lib/ci.py b/cmdb-api/lib/ci.py deleted file mode 100644 index a6282b0..0000000 --- a/cmdb-api/lib/ci.py +++ /dev/null @@ -1,677 +0,0 @@ -# -*- coding:utf-8 -*- - - -import uuid -import time -import datetime -import json - -from flask import current_app -from flask import abort -from sqlalchemy import or_ - -from extensions import db -from models.ci import CI -from models.ci_relation import CIRelation -from models.ci_type import CITypeAttribute -from models.ci_type import CITypeCache -from models.ci_type import CITypeSpecCache -from models.history import CIAttributeHistory -from models.attribute import CIAttributeCache -from lib.const import TableMap -from lib.const import type_map -from lib.value import AttributeValueManager -from lib.history import CIAttributeHistoryManger -from lib.history import CIRelationHistoryManager -from lib.query_sql import QUERY_HOSTS_NUM_BY_PRODUCT -from lib.query_sql import QUERY_HOSTS_NUM_BY_BU -from lib.query_sql import QUERY_HOSTS_NUM_BY_PROJECT -from lib.query_sql import QUERY_CIS_BY_IDS -from lib.query_sql import QUERY_CIS_BY_VALUE_TABLE -from lib.utils import rd -from tasks.cmdb import ci_cache -from tasks.cmdb import ci_delete - - -class CIManager(object): - """ manage CI interface - """ - - def __init__(self): - pass - - def get_ci_by_id(self, ci_id, ret_key="name", - fields=None, need_children=True, use_master=False): - """@params: `ret_key` is one of 'name', 'id', 'alias' - `fields` is list of attribute name/alias/id - """ - ci = CI.query.get(ci_id) or \ - abort(404, "CI {0} is not existed".format(ci_id)) - - res = dict() - - if need_children: - children = self.get_children(ci_id, ret_key=ret_key) # one floor - res.update(children) - ci_type = CITypeCache.get(ci.type_id) - res["ci_type"] = ci_type.type_name - uniq_key = CIAttributeCache.get(ci_type.uniq_id) - if not fields: # fields are all attributes - attr_ids = db.session.query(CITypeAttribute.attr_id).filter_by( - type_id=ci.type_id) - fields = [CIAttributeCache.get(_.attr_id).attr_name - for _ in attr_ids] - - if uniq_key.attr_name not in fields: - fields.append(uniq_key.attr_name) - if fields: - value_manager = AttributeValueManager() - _res = value_manager._get_attr_values( - fields, ci_id, - ret_key=ret_key, uniq_key=uniq_key, use_master=use_master) - res.update(_res) - res['_type'] = ci_type.type_id - res['_id'] = ci_id - return res - - def get_ci_by_ids(self, ci_id_list, ret_key="name", fields=None): - result = list() - for ci_id in ci_id_list: - res = self.get_ci_by_id(ci_id, ret_key=ret_key, fields=fields) - result.append(res) - return result - - def get_children(self, ci_id, ret_key='name', relation_type="contain"): - second_cis = db.session.query(CIRelation.second_ci_id).filter( - CIRelation.first_ci_id == ci_id).filter(or_( - CIRelation.relation_type == relation_type, - CIRelation.relation_type == "deploy")) - second_ci_ids = (second_ci.second_ci_id for second_ci in second_cis) - ci_types = {} - for ci_id in second_ci_ids: - type_id = db.session.query(CI.type_id).filter( - CI.ci_id == ci_id).first().type_id - if type_id not in ci_types: - ci_types[type_id] = [ci_id] - else: - ci_types[type_id].append(ci_id) - res = {} - for type_id in ci_types: - ci_type = CITypeCache.get(type_id) - children = get_cis_by_ids(map(str, ci_types.get(type_id)), - ret_key=ret_key) - res[ci_type.type_name] = children - return res - - def get_cis_by_type(self, type_id, ret_key="name", fields="", - page=1, per_page=None): - if per_page is None: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - cis = db.session.query(CI.ci_id).filter(CI.type_id == type_id) - numfound = cis.count() - cis = cis.offset((page - 1) * per_page).limit(per_page) - res = list() - ci_ids = [str(ci.ci_id) for ci in cis] - if ci_ids: - res = get_cis_by_ids(ci_ids, ret_key, fields) - return numfound, page, res - - def ci_is_exist(self, ci_type, unique_key, unique): - table = TableMap(attr_name=unique_key.attr_name).table - unique = db.session.query(table).filter( - table.attr_id == unique_key.attr_id).filter( - table.value == unique).first() - if unique: - return db.session.query(CI).filter( - CI.ci_id == unique.ci_id).first() - - def _delete_ci_by_id(self, ci_id): - db.session.query(CI.ci_id).filter(CI.ci_id == ci_id).delete() - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("delete ci is error, {0}".format(str(e))) - - def add(self, ci_type_name, exist_policy="replace", - _no_attribute_policy="ignore", **ci_dict): - ci_existed = False - ci_type = CITypeCache.get(ci_type_name) or \ - abort(404, "CIType {0} is not existed".format(ci_type_name)) - - unique_key = CIAttributeCache.get(ci_type.uniq_id) \ - or abort(500, 'illegality unique attribute') - - unique = ci_dict.get(unique_key.attr_name) \ - or abort(500, '{0} missing'.format(unique_key.attr_name)) - - old_ci = self.ci_is_exist(ci_type, unique_key, unique) - if old_ci is not None: - ci_existed = True - if exist_policy == 'reject': - return abort(500, 'CI is existed') - if old_ci.type_id != ci_type.type_id: # update ci_type - old_ci.type_id = ci_type.type_id - db.session.add(old_ci) - db.session.flush() - ci = old_ci - else: - if exist_policy == 'need': - return abort(404, 'CI {0} not exist'.format(unique)) - ci = CI() - ci.type_id = ci_type.type_id - _uuid = uuid.uuid4().hex - ci.uuid = _uuid - ci.created_time = datetime.datetime.now() - db.session.add(ci) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error('add CI error: {0}'.format(str(e))) - return abort(500, 'add CI error') - value_manager = AttributeValueManager() - histories = list() - for p, v in ci_dict.items(): - ret, res = value_manager.add_attr_value( - p, v, ci.ci_id, ci_type, - _no_attribute_policy=_no_attribute_policy, - ci_existed=ci_existed) - if not ret: - db.session.rollback() - if not ci_existed: - self.delete(ci.ci_id) - current_app.logger.info(res) - return abort(500, res) - if res is not None: - histories.append(res) - try: - db.session.commit() - except Exception as e: - current_app.logger.error(str(e)) - db.session.rollback() - if not ci_existed: # only add - self.delete(ci.ci_id) - return abort(500, "add CI error") - his_manager = CIAttributeHistoryManger() - his_manager.add(ci.ci_id, histories) - ci_cache.apply_async([ci.ci_id], queue="cmdb_async") - return ci.ci_id - - def delete(self, ci_id): - ci = db.session.query(CI).filter(CI.ci_id == ci_id).first() - if ci is not None: - attrs = db.session.query(CITypeAttribute.attr_id).filter( - CITypeAttribute.type_id == ci.type_id).all() - attr_names = [] - for attr in attrs: - attr_names.append(CIAttributeCache.get(attr.attr_id).attr_name) - attr_names = set(attr_names) - for attr_name in attr_names: - Table = TableMap(attr_name=attr_name).table - db.session.query(Table).filter(Table.ci_id == ci_id).delete() - db.session.query(CIRelation).filter( - CIRelation.first_ci_id == ci_id).delete() - db.session.query(CIRelation).filter( - CIRelation.second_ci_id == ci_id).delete() - db.session.query(CIAttributeHistory).filter( - CIAttributeHistory.ci_id == ci_id).delete() - - db.session.flush() - db.session.delete(ci) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("delete CI error, {0}".format(str(e))) - return abort(500, "delete CI error, {0}".format(str(e))) - # TODO: write history - ci_delete.apply_async([ci.ci_id], queue="cmdb_async") - return ci_id - return abort(404, "CI {0} not found".format(ci_id)) - - def add_heartbeat(self, ci_type, unique): - ci_type = CITypeCache.get(ci_type) - if not ci_type: - return 'error' - uniq_key = CIAttributeCache.get(ci_type.uniq_id) - Table = TableMap(attr_name=uniq_key.attr_name).table - ci_id = db.session.query(Table.ci_id).filter( - Table.attr_id == uniq_key.attr_id).filter( - Table.value == unique).first() - if ci_id is None: - return 'error' - ci = db.session.query(CI).filter(CI.ci_id == ci_id.ci_id).first() - if ci is None: - return 'error' - - ci.heartbeat = datetime.datetime.now() - - db.session.add(ci) - db.session.commit() - return "ok" - - def get_heartbeat(self, page, type_id, agent_status=None): - query = db.session.query(CI.ci_id, CI.heartbeat) - expire = datetime.datetime.now() - datetime.timedelta(minutes=72) - if type_id: - query = query.filter(CI.type_id == type_id) - else: - query = query.filter(db.or_(CI.type_id == 7, CI.type_id == 8)) - if agent_status == -1: - query = query.filter(CI.heartbeat == None) - elif agent_status == 0: - query = query.filter(CI.heartbeat <= expire) - elif agent_status == 1: - query = query.filter(CI.heartbeat > expire) - numfound = query.count() - per_page_count = current_app.config.get("DEFAULT_PAGE_COUNT") - cis = query.offset((page - 1) * per_page_count).limit( - per_page_count).all() - ci_ids = [ci.ci_id for ci in cis] - heartbeat_dict = {} - for ci in cis: - if agent_status is not None: - heartbeat_dict[ci.ci_id] = agent_status - else: - if ci.heartbeat is None: - heartbeat_dict[ci.ci_id] = -1 - elif ci.heartbeat <= expire: - heartbeat_dict[ci.ci_id] = 0 - else: - heartbeat_dict[ci.ci_id] = 1 - current_app.logger.debug(heartbeat_dict) - ci_ids = map(str, ci_ids) - res = get_cis_by_ids(ci_ids, fields=["hostname", "private_ip"]) - result = [(i.get("hostname"), i.get("private_ip")[0], i.get("ci_type"), - heartbeat_dict.get(i.get("_id"))) for i in res - if i.get("private_ip")] - return numfound, result - - -class CIRelationManager(object): - """ - manage relation between CIs - """ - - def __init__(self): - pass - - @property - def relation_types(self): - """ all CIType relation types - """ - from lib.const import CI_RELATION_TYPES - - return CI_RELATION_TYPES - - def get_second_cis(self, first_ci, relation_type="contain", - page=1, per_page=None, **kwargs): - if per_page is None: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - second_cis = db.session.query( - CI.ci_id).join( - CIRelation, CIRelation.second_ci_id == CI.ci_id).filter( - CIRelation.first_ci_id == first_ci).filter( - CIRelation.relation_type == relation_type) - if kwargs: # special for devices - second_cis = self._query_wrap_for_device(second_cis, **kwargs) - numfound = second_cis.count() - second_cis = second_cis.offset( - (page - 1) * per_page).limit(per_page).all() - ci_ids = [str(son.ci_id) for son in second_cis] - total = len(ci_ids) - result = get_cis_by_ids(ci_ids) - return numfound, total, result - - def get_grandsons(self, ci_id, page=1, per_page=None, **kwargs): - if per_page is None: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - children = db.session.query(CIRelation.second_ci_id).filter( - CIRelation.first_ci_id == ci_id).subquery() - grandsons = db.session.query(CIRelation.second_ci_id).join( - children, - children.c.second_ci_id == CIRelation.first_ci_id).subquery() - grandsons = db.session.query(CI.ci_id).join( - grandsons, grandsons.c.second_ci_id == CI.ci_id) - if kwargs: - grandsons = self._query_wrap_for_device(grandsons, **kwargs) - - numfound = grandsons.count() - grandsons = grandsons.offset( - (page - 1) * per_page).limit(per_page).all() - if not grandsons: - return 0, 0, [] - ci_ids = [str(son.ci_id) for son in grandsons] - total = len(ci_ids) - result = get_cis_by_ids(ci_ids) - - return numfound, total, result - - def _sort_handler(self, sort_by, query_sql): - - if sort_by.startswith("+"): - sort_type = "asc" - sort_by = sort_by[1:] - elif sort_by.startswith("-"): - sort_type = "desc" - sort_by = sort_by[1:] - else: - sort_type = "asc" - attr = CIAttributeCache.get(sort_by) - if attr is None: - return query_sql - - attr_id = attr.attr_id - Table = TableMap(attr_name=sort_by).table - - CI_table = query_sql.subquery() - query_sql = db.session.query(CI_table.c.ci_id, Table.value).join( - Table, Table.ci_id == CI_table.c.ci_id).filter( - Table.attr_id == attr_id).order_by( - getattr(Table.value, sort_type)()) - - return query_sql - - def _query_wrap_for_device(self, query_sql, **kwargs): - _type = kwargs.pop("_type", False) or kwargs.pop("type", False) \ - or kwargs.pop("ci_type", False) - if _type: - ci_type = CITypeCache.get(_type) - if ci_type is None: - return - query_sql = query_sql.filter(CI.type_id == ci_type.type_id) - - for k, v in kwargs.iteritems(): - attr = CIAttributeCache.get(k) - if attr is None: - continue - Table = TableMap(attr_name=k).table - CI_table = query_sql.subquery() - query_sql = db.session.query(CI_table.c.ci_id).join( - Table, Table.ci_id == CI_table.c.ci_id).filter( - Table.attr_id == attr.attr_id).filter( - Table.value.ilike(v.replace("*", "%"))) - - current_app.logger.debug(query_sql) - sort_by = kwargs.pop("sort", False) - if sort_by: - query_sql = self._sort_handler(sort_by, query_sql) - return query_sql - - def get_great_grandsons(self, ci_id, page=1, per_page=None, **kwargs): - if per_page is None: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - - children = db.session.query(CIRelation.second_ci_id).filter( - CIRelation.first_ci_id == ci_id).subquery() - grandsons = db.session.query(CIRelation.second_ci_id).join( - children, - children.c.second_ci_id == CIRelation.first_ci_id).subquery() - great_grandsons = db.session.query(CIRelation.second_ci_id).join( - grandsons, - grandsons.c.second_ci_id == CIRelation.first_ci_id).subquery() - great_grandsons = db.session.query(CI.ci_id).join( - great_grandsons, great_grandsons.c.second_ci_id == CI.ci_id) - if kwargs: - great_grandsons = self._query_wrap_for_device( - great_grandsons, **kwargs) - if great_grandsons is None: - return 0, 0, [] - numfound = great_grandsons.count() - great_grandsons = great_grandsons.offset( - (page - 1) * per_page).limit(per_page).all() - ci_ids = [str(son.ci_id) for son in great_grandsons] - total = len(ci_ids) - result = get_cis_by_ids(ci_ids) - - return numfound, total, result - - def get_first_cis(self, second_ci, relation_type="contain", - page=1, per_page=None): - """only for CI Type - """ - if per_page is None: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - first_cis = db.session.query(CIRelation.first_ci_id).filter( - CIRelation.second_ci_id == second_ci).filter( - CIRelation.relation_type == relation_type) - numfound = first_cis.count() - first_cis = first_cis.offset( - (page - 1) * per_page).limit(per_page).all() - result = [] - first_ci_ids = [str(first_ci.first_ci_id) for first_ci in first_cis] - total = len(first_ci_ids) - if first_ci_ids: - result = get_cis_by_ids(first_ci_ids) - return numfound, total, result - - def get_grandfather(self, ci_id, relation_type="contain"): - """only for CI Type - """ - grandfather = db.session.query(CIRelation.first_ci_id).filter( - CIRelation.second_ci_id.in_(db.session.query( - CIRelation.first_ci_id).filter( - CIRelation.second_ci_id == ci_id).filter( - CIRelation.relation_type == relation_type))).filter( - CIRelation.relation_type == relation_type).first() - if grandfather: - return CIManager().get_ci_by_id(grandfather.first_ci_id, - need_children=False) - - def add(self, first_ci, second_ci, more=None, relation_type="contain"): - ci = db.session.query(CI.ci_id).filter(CI.ci_id == first_ci).first() - if ci is None: - return abort(404, "first_ci {0} is not existed".format(first_ci)) - c = db.session.query(CI.ci_id).filter(CI.ci_id == second_ci).first() - if c is None: - return abort(404, "second_ci {0} is not existed".format( - second_ci)) - existed = db.session.query(CIRelation.cr_id).filter( - CIRelation.first_ci_id == first_ci).filter( - CIRelation.second_ci_id == second_ci).first() - if existed is not None: - return existed.cr_id - cr = CIRelation() - cr.first_ci_id = first_ci - cr.second_ci_id = second_ci - if more is not None: - cr.more = more - cr.relation_type = relation_type - db.session.add(cr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("add CIRelation is error, {0}".format( - str(e))) - return abort(500, "add CIRelation is error, {0}".format(str(e))) - # write history - his_manager = CIRelationHistoryManager() - his_manager.add(cr.cr_id, cr.first_ci_id, cr.second_ci_id, - relation_type, operate_type="add") - return cr.cr_id - - def delete(self, cr_id): - cr = db.session.query(CIRelation).filter( - CIRelation.cr_id == cr_id).first() - cr_id = cr.cr_id - first_ci = cr.first_ci_id - second_ci = cr.second_ci_id - if cr is not None: - db.session.delete(cr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "delete CIRelation is error, {0}".format(str(e))) - return abort( - 500, "delete CIRelation is error, {0}".format(str(e))) - his_manager = CIRelationHistoryManager() - his_manager.add(cr_id, first_ci, second_ci, - cr.relation_type, operate_type="delete") - return True - return abort(404, "CI relation is not existed") - - def delete_2(self, first_ci, second_ci): - cr = db.session.query(CIRelation).filter( - CIRelation.first_ci_id == first_ci).filter( - CIRelation.second_ci_id == second_ci).first() - return self.delete(cr.cr_id) - - -class HostNumStatis(object): - def __init__(self): - pass - - def get_hosts_by_project(self, project_id_list=None): - res = {} - if not project_id_list: - project = CITypeCache.get("project") - projects = db.session.query(CI.ci_id).filter( - CI.type_id == project.type_id).all() - project_id_list = (project.ci_id for project in projects) - project_id_list = map(str, project_id_list) - project_ids = ",".join(project_id_list) - nums = db.session.execute(QUERY_HOSTS_NUM_BY_PROJECT.format( - "".join(["(", project_ids, ")"]))).fetchall() - if nums: - for ci_id in project_id_list: - res[int(ci_id)] = 0 - for ci_id, num in nums: - res[ci_id] = num - return res - - def get_hosts_by_product(self, product_id_list=None): - res = {} - if not product_id_list: - product = CITypeCache.get("product") - products = db.session.query(CI.ci_id).filter( - CI.type_id == product.type_id).all() - product_id_list = (product.ci_id for product in products) - product_id_list = map(str, product_id_list) - product_ids = ",".join(product_id_list) - nums = db.session.execute(QUERY_HOSTS_NUM_BY_PRODUCT.format( - "".join(["(", product_ids, ")"]))).fetchall() - if nums: - for ci_id in product_id_list: - res[int(ci_id)] = 0 - for ci_id, num in nums: - res[ci_id] = num - return res - - def get_hosts_by_bu(self, bu_id_list=None): - res = {} - if not bu_id_list: - bu = CITypeCache.get("bu") - bus = db.session.query(CI.ci_id).filter( - CI.type_id == bu.type_id).all() - bu_id_list = (bu.ci_id for bu in bus) - bu_id_list = map(str, bu_id_list) - bu_ids = ",".join(bu_id_list) - current_app.logger.debug(QUERY_HOSTS_NUM_BY_BU.format( - "".join(["(", bu_ids, ")"]))) - if not bu_ids: - return res - nums = db.session.execute( - QUERY_HOSTS_NUM_BY_BU.format( - "".join(["(", bu_ids, ")"]))).fetchall() - if nums: - for ci_id in bu_id_list: - res[int(ci_id)] = 0 - for ci_id, num in nums: - res[ci_id] = num - return res - - -def get_cis_by_ids(ci_ids, ret_key="name", fields="", value_tables=None): - """ argument ci_ids are string list of CI instance ID, eg. ['1', '2'] - """ - if not ci_ids: - return [] - start = time.time() - ci_id_tuple = tuple(map(int, ci_ids)) - res = rd.get(ci_id_tuple) - if res is not None and None not in res and ret_key == "name": - res = map(json.loads, res) - if not fields: - return res - else: - _res = [] - for d in res: - _d = dict() - _d["_id"], _d["_type"] = d.get("_id"), d.get("_type") - _d["ci_type"] = d.get("ci_type") - for field in fields: - _d[field] = d.get(field) - _res.append(_d) - current_app.logger.debug("filter time: %s" % (time.time() - start)) - return _res - current_app.logger.warning("cache not hit...............") - if not fields: - _fields = "" - else: - _fields = list() - for field in fields: - attr = CIAttributeCache.get(field) - if attr is not None: - _fields.append(str(attr.attr_id)) - _fields = "WHERE A.attr_id in ({0})".format(",".join(_fields)) - ci_ids = ",".join(ci_ids) - if value_tables is None: - value_tables = type_map["table_name"].values() - current_app.logger.debug(value_tables) - value_sql = " UNION ".join([QUERY_CIS_BY_VALUE_TABLE.format(value_table, - ci_ids) - for value_table in value_tables]) - query_sql = QUERY_CIS_BY_IDS.format(ci_ids, _fields, value_sql) - current_app.logger.debug(query_sql) - start = time.time() - hosts = db.session.execute(query_sql).fetchall() - current_app.logger.info("get cis time is: {0}".format( - time.time() - start)) - - ci_list = set() - res = list() - ci_dict = dict() - start = time.time() - for ci_id, type_id, attr_id, attr_name, \ - attr_alias, value, value_type, is_multivalue in hosts: - if ci_id not in ci_list: - ci_dict = dict() - ci_type = CITypeSpecCache.get(type_id) - ci_dict["_id"] = ci_id - ci_dict["_type"] = type_id - ci_dict["ci_type"] = ci_type.type_name - ci_dict["ci_type_alias"] = ci_type.type_alias - ci_list.add(ci_id) - res.append(ci_dict) - if ret_key == "name": - if is_multivalue: - if isinstance(ci_dict.get(attr_name), list): - ci_dict[attr_name].append(value) - else: - ci_dict[attr_name] = [value] - else: - ci_dict[attr_name] = value - elif ret_key == "alias": - if is_multivalue: - if isinstance(ci_dict.get(attr_alias), list): - ci_dict[attr_alias].append(value) - else: - ci_dict[attr_alias] = [value] - else: - ci_dict[attr_alias] = value - elif ret_key == "id": - if is_multivalue: - if isinstance(ci_dict.get(attr_id), list): - ci_dict[attr_id].append(value) - else: - ci_dict[attr_id] = [value] - else: - ci_dict[attr_id] = value - - current_app.logger.debug("result parser time is: {0}".format( - time.time() - start)) - return res \ No newline at end of file diff --git a/cmdb-api/lib/ci_type.py b/cmdb-api/lib/ci_type.py deleted file mode 100644 index 728beed..0000000 --- a/cmdb-api/lib/ci_type.py +++ /dev/null @@ -1,315 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import current_app -from flask import abort - -from extensions import db -from models import row2dict -from models.ci_type import CITypeAttribute -from models.ci_type import CIType -from models.ci_type import CITypeAttributeCache -from models.ci_type import CITypeCache -from models.ci_type_relation import CITypeRelation -from models.attribute import CIAttributeCache -from lib.attribute import AttributeManager - - -class CITypeAttributeManager(object): - """ - manage CIType's attributes, include query, add, update, delete - """ - - def __init__(self): - pass - - def get_attributes_by_type_id(self, type_id): - attrs = CITypeAttributeCache.get(type_id) - attr_manager = AttributeManager() - result = list() - for attr in attrs: - attr_dict = attr_manager.get_attribute_by_id(attr.attr_id) - attr_dict["is_required"] = attr.is_required - result.append(attr_dict) - return result - - def add(self, type_id, attr_ids=None, is_required=False): - """ - add attributes to CIType, attr_ids are list - """ - if not attr_ids or not isinstance(attr_ids, list): - return abort(500, "attr_ids must be required") - ci_type = CITypeCache.get(type_id) - if ci_type is None: - return abort(404, "CIType ID({0}) is not existed".format(type_id)) - for attr_id in attr_ids: - attr = CIAttributeCache.get(attr_id) - if attr is None: - return abort(404, - "attribute id {0} is not existed".format(attr_id)) - existed = db.session.query(CITypeAttribute.attr_id).filter_by( - type_id=type_id).filter_by(attr_id=attr_id).first() - if existed is not None: - continue - current_app.logger.debug(attr_id) - db.session.add(CITypeAttribute( - type_id=type_id, attr_id=attr_id, is_required=is_required)) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "add attribute to CIType is error, {0}".format(str(e))) - return abort( - 500, "add attribute to CIType is error, maybe duplicate entry") - - CITypeAttributeCache.clean(type_id) - return True - - def delete(self, type_id, attr_ids=None): - """ - delete attributes at CIType, attr_ids are list - """ - if not attr_ids or not isinstance(attr_ids, list): - return abort( - 500, "delete attribute of CIType, attr_ids must be required") - ci_type = CITypeCache.get(type_id) - if ci_type is None: - return abort( - 404, "CIType ID({0}) is not existed".format(type_id)) - for attr_id in attr_ids: - attr = CIAttributeCache.get(attr_id) - if attr is None: - return abort( - 404, "attribute id {0} is not existed".format(attr_id)) - db.session.query(CITypeAttribute).filter_by( - type_id=type_id).filter_by(attr_id=attr_id).delete() - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "delete attributes of CIType is error, {0}".format(str(e))) - return abort(500, "delete attributes of CIType is error") - CITypeAttributeCache.clean(type_id) - return True - - -class CITypeManager(object): - """ - manage CIType - """ - - def __init__(self): - pass - - def get_citypes(self, type_name=None): - ci_types = db.session.query(CIType).all() if type_name is None else \ - db.session.query(CIType).filter( - CIType.type_name.ilike("%{0}%".format(type_name))).all() - res = list() - for ci_type in ci_types: - type_dict = row2dict(ci_type) - type_dict["uniq_key"] = CIAttributeCache.get( - type_dict["uniq_id"]).attr_name - res.append(type_dict) - return res - - def query(self, _type): - citype = CITypeCache.get(_type) - if citype: - return row2dict(citype) - return abort(404, "citype is not found") - - def add(self, type_name, type_alias, _id=None, unique=None, - icon_url="", enabled=True): - uniq_key = CIAttributeCache.get(_id) or CIAttributeCache.get(unique) - if uniq_key is None: - return False, "uniq_key is not existed" - citype = CITypeCache.get(type_name) - if citype: - return False, "this CIType {0} is existed".format(type_name) - _citype = CIType() - _citype.type_name = type_name - _citype.type_alias = type_alias - _citype.uniq_id = uniq_key.attr_id - _citype.enabled = enabled - _citype.icon_url = icon_url - db.session.add(_citype) - db.session.flush() - _citype_attr = CITypeAttribute() - _citype_attr.attr_id = uniq_key.attr_id - _citype_attr.type_id = _citype.type_id - _citype_attr.is_required = True - db.session.add(_citype_attr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("add CIType is error, {0}".format(str(e))) - return False, str(e) - CITypeCache.clean(type_name) - return True, _citype.type_id - - def update(self, type_id, type_name, type_alias, _id=None, unique=None, - icon_url="", enabled=None): - citype = CITypeCache.get(type_id) - if citype is None: - return False, "CIType {0} is not existed".format(type_name) - uniq_key = CIAttributeCache.get(_id) or CIAttributeCache.get(unique) - if uniq_key is not None: - citype.uniq_id = uniq_key.attr_id - citype_attr = db.session.query(CITypeAttribute).filter( - CITypeAttribute.type_id == type_id).filter( - CITypeAttribute.attr_id == uniq_key.attr_id).first() - if citype_attr is None: - citype_attr = CITypeAttribute() - citype_attr.attr_id = uniq_key.attr_id - citype_attr.type_id = type_id - citype_attr.is_required = True - db.session.add(citype_attr) - if type_name: - citype.type_name = type_name - if type_alias: - citype.type_alias = type_alias - if icon_url: - citype.icon_url = icon_url - if enabled is not None: - citype.enabled = enabled - db.session.add(citype) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("add CIType is error, {0}".format(str(e))) - return False, str(e) - CITypeCache.clean(type_id) - return True, type_id - - def set_enabled(self, type_id, enabled=True): - citype = CITypeCache.get(type_id) - if citype is None: - return abort(404, "CIType[{0}] is not existed".format(type_id)) - citype.enabled = enabled - db.session.add(citype) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "set CIType enabled is error, {0}".format(str(e))) - return abort(500, str(e)) - return type_id - - def delete(self, type_id): - citype = db.session.query(CIType).filter_by(type_id=type_id).first() - type_name = citype.type_name - if citype: - db.session.delete(citype) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "delete CIType is error, {0}".format(str(e))) - return abort(500, str(e)) - CITypeCache.clean(type_id) - return "CIType {0} deleted".format(type_name) - return abort(404, "CIType is not existed") - - -class CITypeRelationManager(object): - """ - manage relation between CITypes - """ - - def __init__(self): - pass - - @property - def relation_types(self): - """ all CIType relation types - """ - from lib.const import CITYPE_RELATION_TYPES - - return CITYPE_RELATION_TYPES - - def get_children(self, parent_id): - children = db.session.query(CITypeRelation).filter( - CITypeRelation.parent_id == parent_id).all() - result = [] - for child in children: - ctr_id = child.ctr_id - citype = CITypeCache.get(child.child_id) - citype_dict = row2dict(citype) - citype_dict["ctr_id"] = ctr_id - manager = CITypeAttributeManager() - citype_dict["attributes"] = manager.get_attributes_by_type_id( - citype.type_id) - citype_dict["relation_type"] = child.relation_type - result.append(citype_dict) - return result - - def get_parents(self, child_id): - parents = db.session.query(CITypeRelation).filter( - CITypeRelation.child_id == child_id).all() - result = [] - for parent in parents: - ctr_id = parent.ctr_id - citype = CITypeCache.get(parent.parent_id) - citype_dict = row2dict(citype) - citype_dict["ctr_id"] = ctr_id - manager = CITypeAttributeManager() - citype_dict["attributes"] = manager.get_attributes_by_type_id( - citype.type_id) - citype_dict["relation_type"] = parent.relation_type - result.append(citype_dict) - return result - - def add(self, parent, child, relation_type="contain"): - p = CITypeCache.get(parent) - if p is None: - return abort(404, "parent {0} is not existed".format(parent)) - c = CITypeCache.get(child) - if c is None: - return abort(404, "child {0} is not existed".format(child)) - existed = db.session.query(CITypeRelation.ctr_id).filter_by( - parent_id=parent).filter_by(child_id=child).first() - if existed is not None: - return True, existed.ctr_id - ctr = CITypeRelation() - ctr.parent_id = parent - ctr.child_id = child - ctr.relation_type = relation_type - db.session.add(ctr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "add CITypeRelation is error, {0}".format(str(e))) - return abort( - 500, "add CITypeRelation is error, {0}".format(str(e))) - return ctr.ctr_id - - def delete(self, ctr_id): - ctr = db.session.query(CITypeRelation).filter( - CITypeRelation.ctr_id == ctr_id).first() - if ctr: - db.session.delete(ctr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "delete CITypeRelation is error, {0}".format(str(e))) - return abort( - 500, "delete CITypeRelation is error, {0}".format(str(e))) - return True - return abort(404, "CIType relation is not existed") - - def delete_2(self, parent, child): - ctr = db.session.query(CITypeRelation).filter( - CITypeRelation.parent_id == parent).filter( - CITypeRelation.child_id == child).first() - return self.delete(ctr.ctr_id) \ No newline at end of file diff --git a/cmdb-api/lib/const.py b/cmdb-api/lib/const.py deleted file mode 100644 index 51409a4..0000000 --- a/cmdb-api/lib/const.py +++ /dev/null @@ -1,99 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from models.attribute import TextChoice -from models.attribute import FloatChoice -from models.attribute import IntegerChoice -from models.attribute import CIAttributeCache -from models.ci_value import CIValueText -from models.ci_value import CIValueInteger -from models.ci_value import CIValueFloat -from models.ci_value import CIValueDateTime -from models.ci_value import CIIndexValueDateTime -from models.ci_value import CIIndexValueFloat -from models.ci_value import CIIndexValueInteger -from models.ci_value import CIIndexValueText - - -def string2int(x): - return int(float(x)) - - -def str2datetime(x): - try: - v = datetime.datetime.strptime(x, "%Y-%m-%d") - return v - except ValueError: - pass - try: - v = datetime.datetime.strptime(x, "%Y-%m-%d %H:%M:%S") - return v - except ValueError: - pass - raise ValueError - - -type_map = { - 'converter': { - 'int': string2int, - 'float': float, - 'text': unicode, - 'datetime': str2datetime, - }, - 'choice': { - 'int': IntegerChoice, - 'float': FloatChoice, - 'text': TextChoice, - }, - 'table': { - 'int': CIValueInteger, - 'text': CIValueText, - 'datetime': CIValueDateTime, - 'float': CIValueFloat, - 'index_int': CIIndexValueInteger, - 'index_text': CIIndexValueText, - 'index_datetime': CIIndexValueDateTime, - 'index_float': CIIndexValueFloat, - }, - 'table_name': { - 'int': 'integers', - 'text': 'texts', - 'datetime': 'datetime', - 'float': 'floats', - 'index_int': 'index_integers', - 'index_text': 'index_texts', - 'index_datetime': 'index_datetime', - 'index_float': 'index_floats', - } -} - - -class TableMap(): - def __init__(self, attr_name=None): - self.attr_name = attr_name - - @property - def table(self): - if self.attr_name is not None: - attr = CIAttributeCache.get(self.attr_name) - if attr.is_index: - i = "index_{0}".format(attr.value_type) - else: - i = attr.value_type - return type_map["table"].get(i) - - @property - def table_name(self): - if self.attr_name is not None: - attr = CIAttributeCache.get(self.attr_name) - if attr.is_index: - i = "index_{0}".format(attr.value_type) - else: - i = attr.value_type - return type_map["table_name"].get(i) - - -CITYPE_RELATION_TYPES = ["connect", "deploy", "install", "contain"] -CI_RELATION_TYPES = ["connect", "deploy", "install", "contain"] \ No newline at end of file diff --git a/cmdb-api/lib/decorator.py b/cmdb-api/lib/decorator.py deleted file mode 100644 index 8cafba7..0000000 --- a/cmdb-api/lib/decorator.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding:utf-8 -*- - - -import time -from functools import wraps - -from flask import request -from flask import render_template -from flask import current_app - -from lib.exception import InvalidUsageError - - -def templated(template=None): - def decorator(f): - @wraps(f) - def decorated_function(*args, **kwargs): - template_name = template - if template_name is None: - template_name = request.endpoint.replace('.', '/') + '.html' - ctx = f(*args, **kwargs) - if ctx is None: - ctx = {} - elif not isinstance(ctx, dict): - return ctx - return render_template(template_name, **ctx) - - return decorated_function - - return decorator - - -def argument_required1(*args_required): - from manage import InvalidUsageError - - def decorator(f): - @wraps(f) - def decorated_function(*args, **kwargs): - for arg in args_required: - if request.values.get(arg, None) is None: - raise InvalidUsageError( - "argument {0} is required".format(arg), 400) - return f(*args, **kwargs) - - return decorated_function - - return decorator - - -class argument_required(object): - def __init__(self, *args): - self.args = args - - def __enter__(self): - for arg in self.args: - if not request.values.get(arg): - raise InvalidUsageError( - "argument {0} is required".format(arg), status_code=400) - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - - -def url_statistic(f): - @wraps(f) - def decorated_func(*args, **kwargs): - start = time.time() - r = f(*args, **kwargs) - spend = time.time() - start - url = request.path - current_app.logger.info(url) - current_app.logger.info(spend) - return r - return decorated_func \ No newline at end of file diff --git a/cmdb-api/lib/exception.py b/cmdb-api/lib/exception.py deleted file mode 100644 index a11af85..0000000 --- a/cmdb-api/lib/exception.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding:utf-8 -*- - - -class InvalidUsageError(Exception): - status_code = 400 - - def __init__(self, message, status_code=None, payload=None): - Exception.__init__(self) - self.message = message - if status_code is not None: - self.status_code = status_code - self.payload = payload - - def to_dict(self): - rv = dict(self.payload or ()) - rv['message'] = self.message - return rv \ No newline at end of file diff --git a/cmdb-api/lib/history.py b/cmdb-api/lib/history.py deleted file mode 100644 index ebcef62..0000000 --- a/cmdb-api/lib/history.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from flask import current_app -from flask import g - -from extensions import db -from models.history import OperationRecord -from models.history import CIAttributeHistory -from models.history import CIRelationHistory - - -class CIAttributeHistoryManger(object): - def __init__(self): - pass - - def add(self, ci_id, history_list): - if history_list: - record = OperationRecord() - record.uid = g.user.uid - record.timestamp = datetime.datetime.now() - db.session.add(record) - db.session.commit() - for attr_id, operate_type, old, new in history_list: - history = CIAttributeHistory() - history.attr_id = attr_id - history.operate_type = operate_type - history.old = old - history.new = new - history.ci_id = ci_id - history.record_id = record.record_id - db.session.add(history) - - try: - db.session.commit() - except Exception as e: - db.session.rollback() - db.session.rollback() - current_app.logger.error( - "add attribute history error, {0}".format(str(e))) - return False, "add attribute history error, {0}".format(str(e)) - return True, None - - -class CIRelationHistoryManager(object): - def __init__(self): - pass - - def add(self, relation, first_ci, second_ci, - relation_type, operate_type="add"): - record = OperationRecord() - record.uid = g.user.uid - record.timestamp = datetime.datetime.now() - db.session.add(record) - db.session.flush() - - history = CIRelationHistory() - history.relation = relation - history.record_id = record.record_id - history.operate_type = operate_type - history.first_ci_id = first_ci - history.second_ci_id = second_ci - history.relation_type = relation_type - db.session.add(history) - - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "add relation history is error, {0}".format(str(e))) - return False, "add relation history is error, {0}".format(str(e)) - return True, None diff --git a/cmdb-api/lib/mail.py b/cmdb-api/lib/mail.py deleted file mode 100644 index 57d8e03..0000000 --- a/cmdb-api/lib/mail.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding:utf-8 -*- - - -import requests - -from flask import current_app -from flask.ext.mail import Message - -from extensions import mail -from models.account import User - - -def sendmail(users, subject, message, html=False, app=None): - if app: - mail.app = app - else: - app = current_app - recipients = [x.email for x in users if isinstance(x, User)] - recipients.extend( - [x for x in users if isinstance(x, basestring) and '@' in x]) - sender = app.config.get('DEFAULT_MAIL_SENDER') - if html: - msg = Message(recipients=recipients, - html=message, - subject=subject, - sender=sender) - else: - msg = Message(recipients=recipients, - body=message, - subject=subject, - sender=sender) - mail.send(msg) - - -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email.header import Header -from email.mime.image import MIMEImage -import smtplib -import time -from email import Utils - - -def send_mail(sender, receiver, subject, content, ctype="html", pics=(), - smtpserver='mail.51ping.com', - username="networkbench@51ping.com", password="12qwaszx"): - """subject and body are unicode objects""" - if ctype == "html": - msg = MIMEText(content, 'html', 'utf-8') - else: - msg = MIMEText(content, 'plain', 'utf-8') - - if len(pics) != 0: - msgRoot = MIMEMultipart('related') - msgText = MIMEText(content, 'html', 'utf-8') - msgRoot.attach(msgText) - i = 1 - for pic in pics: - fp = open(pic, "rb") - image = MIMEImage(fp.read()) - fp.close() - image.add_header('Content-ID', '' % i) - msgRoot.attach(image) - i += 1 - msg = msgRoot - - msg['Subject'] = Header(subject, 'utf-8') - msg['From'] = sender - msg['To'] = ';'.join(receiver) - msg['Message-ID'] = Utils.make_msgid() - msg['date'] = time.strftime('%a, %d %b %Y %H:%M:%S %z') - - smtp = smtplib.SMTP() - smtp.connect(smtpserver, 25) - smtp.login(username, password) - smtp.sendmail(sender, receiver, msg.as_string()) - smtp.quit() - - -def send_sms(mobile, content): - sms_uri = current_app.config.get("SMS_URI") % (mobile, content) - try: - current_app.logger.info(sms_uri) - requests.get(sms_uri) - except Exception as e: - current_app.logger.error("send sms error, %s" % str(e)) \ No newline at end of file diff --git a/cmdb-api/lib/query_sql.py b/cmdb-api/lib/query_sql.py deleted file mode 100644 index 960f02b..0000000 --- a/cmdb-api/lib/query_sql.py +++ /dev/null @@ -1,107 +0,0 @@ -# -*- coding:utf-8 -*- - - -QUERY_HOSTS_BY_APP = """ - SELECT * - FROM cis - INNER JOIN ci_relations AS cr ON cis.`ci_id`=cr.`second_ci` - WHERE cr.`first_ci` = {0:d} LIMIT {1:d}, {2:d}; -""" - -QUERY_HOSTS_NUM_BY_PROJECT = """ - SELECT cr.first_ci_id, - count(DISTINCT cr.second_ci_id) - FROM ci_relations AS cr - WHERE cr.first_ci_id IN {0} - GROUP BY cr.first_ci_id -""" - -QUERY_HOSTS_NUM_BY_BU = """ - SELECT B.first_ci_id, - count(DISTINCT cr.second_ci_id) - FROM - (SELECT A.first_ci_id, - cr.second_ci_id - FROM - (SELECT cr.first_ci_id, - cis.ci_id - FROM cis - INNER JOIN ci_relations AS cr ON cis.ci_id=cr.second_ci_id - WHERE cr.first_ci_id IN {0}) AS A - INNER JOIN ci_relations AS cr ON cr.first_ci_id=A.ci_id) AS B - INNER JOIN ci_relations AS cr ON B.second_ci_id=cr.first_ci_id - GROUP BY B.first_ci_id -""" - -QUERY_HOSTS_NUM_BY_PRODUCT = """ - SELECT A.first_ci_id, - count(DISTINCT cr.second_ci_id) - FROM - (SELECT cr.first_ci_id, - cis.ci_id - FROM cis - INNER JOIN ci_relations AS cr ON cis.ci_id=cr.second_ci_id - WHERE cr.first_ci_id IN {0}) AS A - INNER JOIN ci_relations AS cr ON cr.first_ci_id=A.ci_id - GROUP BY A.first_ci_id; -""" - -QUERY_CIS_BY_VALUE_TABLE = """ - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - {0}.ci_id, - {0}.attr_id, - {0}.value - FROM {0} - INNER JOIN cis ON {0}.ci_id=cis.ci_id - AND {0}.`ci_id` IN ({1}) - INNER JOIN ci_attributes as attr ON attr.attr_id = {0}.attr_id -""" - -QUERY_CIS_BY_IDS = """ - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ({2}) AS A {1} - ORDER BY A.ci_id; -""" - -FACET_QUERY1 = """ - SELECT {0}.value, - count({0}.ci_id) - FROM {0} - INNER JOIN ci_attributes AS attr ON attr.attr_id={0}.attr_id - WHERE attr.attr_name="{1}" - GROUP BY {0}.ci_id; -""" - -FACET_QUERY = """ - SELECT {0}.value, - count({0}.ci_id) - FROM {0} - INNER JOIN ({1}) AS B ON B.ci_id={0}.ci_id - WHERE {0}.attr_id={2:d} - GROUP BY {0}.ci_id -""" - -QUERY_CI_BY_ATTR_NAME = """ - SELECT {0}.ci_id - FROM {0} - WHERE {0}.attr_id={1:d} - AND {0}.value {2} -""" - -QUERY_CI_BY_TYPE = """ - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in ({0}) -""" \ No newline at end of file diff --git a/cmdb-api/lib/search.py b/cmdb-api/lib/search.py deleted file mode 100644 index 341950d..0000000 --- a/cmdb-api/lib/search.py +++ /dev/null @@ -1,348 +0,0 @@ -# -*- coding:utf-8 -*- - - -import time - -from flask import current_app - -from lib.const import TableMap -from models.attribute import CIAttributeCache -from models.ci_type import CITypeCache -from extensions import db -from models import CI -from lib.ci import get_cis_by_ids -from lib.query_sql import FACET_QUERY -from lib.query_sql import QUERY_CI_BY_TYPE -from lib.query_sql import QUERY_CI_BY_ATTR_NAME - - -class SearchError(Exception): - def __init__(self, v): - self.v = v - - def __str__(self): - return self.v - - -class Search(object): - def __init__(self, query=None, fl=None, facet_field=None, - page=1, ret_key="name", count=1, sort=None): - self.orig_query = query - self.fl = fl - self.facet_field = facet_field - self.page = page - self.ret_key = ret_key - try: - self.count = int(count) - except ValueError: - self.count = current_app.config.get("DEFAULT_PAGE_COUNT") - self.sort = sort - self.query_sql = "" - self.type_id_list = [] - - def tor_proc(self, key): - tor = list() - if key.startswith("+"): - tor.append('&') - key = key[1:].strip() - elif key.startswith("-"): - tor.append('|') - key = key[1:].strip() - elif key.startswith("~"): - tor.append('~') - key = key[1:].strip() - if not tor: - tor = ['&', ''] - if len(tor) < 2: - tor.append('') - return tor, key - - def attr_name_proc(self, key): - tor, key = self.tor_proc(key) - if key in ('ci_type', 'type', '_type'): - return '_type', 'text', tor, None - if key in ('id', 'ci_id', '_id'): - return '_id', 'text', tor, None - attr = CIAttributeCache.get(key) - if attr is not None: - # if not attr.is_index: - # raise SearchError("{0} is not indexed".format(attr.attr_name)) - field_name = attr.attr_name - return field_name, attr.value_type, tor, attr - else: - raise SearchError("{0} is not existed".format(key)) - - def type_query_handler(self, v, only_type_query): - new_v = [v] - if v.startswith("(") and v.endswith(")"): - new_v = v[1:-1].split(";") - for _v in new_v: - ci_type = CITypeCache.get(_v) - if ci_type is not None: - self.type_id_list.append(str(ci_type.type_id)) - if self.type_id_list: - type_ids = ",".join(self.type_id_list) - _query_sql = QUERY_CI_BY_TYPE.format(type_ids) - if only_type_query: - return _query_sql - else: - return "" - return "" - - def in_query_handler(self, attr, v): - new_v = v[1:-1].split(";") - table_name = TableMap(attr_name=attr.attr_name).table_name - _query_sql = QUERY_CI_BY_ATTR_NAME.format( - table_name, attr.attr_id, - " OR {0}.value ".format(table_name).join(['LIKE "{0}"'.format( - _v.replace("*", "%")) for _v in new_v])) - return _query_sql - - def range_query_handler(self, attr, v): - start, end = [x.strip() for x in v[1:-1].split("_TO_")] - table_name = TableMap(attr_name=attr.attr_name).table_name - _query_sql = QUERY_CI_BY_ATTR_NAME.format( - table_name, attr.attr_id, "BETWEEN '{0}' AND '{1}'".format( - start.replace("*", "%"), end.replace("*", "%"))) - return _query_sql - - def comparison_query_handler(self, attr, v): - table_name = TableMap(attr_name=attr.attr_name).table_name - if (v.startswith("<") and not v.startswith("<=")) or \ - (v.startswith(">") and not v.startswith(">=")): - _query_sql = QUERY_CI_BY_ATTR_NAME.format( - table_name, attr.attr_id, "{0} '{1}'".format( - v[0], v[1:].replace("*", "%"))) - elif v.startswith(">=") or v.startswith("<="): - _query_sql = QUERY_CI_BY_ATTR_NAME.format( - table_name, attr.attr_id, "{0} '{1}'".format( - v[:2], v[2:].replace("*", "%"))) - return _query_sql - - def sort_query_handler(self, field, query_sql, only_type_query): - if field is None: - field = "" - if field.startswith("+"): - field = field[1:] - sort_type = "ASC" - elif field.startswith("-"): - field = field[1:] - sort_type = "DESC" - else: - sort_type = "ASC" - - if field in ("_id", "ci_id") or not field: - if only_type_query: - return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ({0}) AS B {1}""".format( - query_sql, - "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( - (self.page - 1) * self.count, sort_type, self.count)) - elif self.type_id_list: - return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ({0}) AS B {1}""".format( - query_sql, - "INNER JOIN cis on cis.ci_id=B.ci_id " - "WHERE cis.type_id in ({3}) " - "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( - (self.page - 1) * self.count, sort_type, self.count, - ",".join(self.type_id_list))) - else: - return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ({0}) AS B {1}""".format( - query_sql, - "INNER JOIN cis on cis.ci_id=B.ci_id " - "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( - (self.page - 1) * self.count, sort_type, self.count)) - else: - attr = CIAttributeCache.get(field) - attr_id = attr.attr_id - - table_name = TableMap(attr_name=attr.attr_name).table_name - _v_query_sql = """SELECT {0}.ci_id, {1}.value FROM - ({2}) AS {0} INNER JOIN {1} ON {1}.ci_id = {0}.ci_id - WHERE {1}.attr_id = {3}""".format("ALIAS", table_name, - query_sql, attr_id) - new_table = _v_query_sql - if only_type_query: - return "SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id " \ - "FROM ({0}) AS C " \ - "ORDER BY C.value {2} " \ - "LIMIT {1:d}, {3};".format(new_table, - (self.page - 1) * self.count, - sort_type, self.count) - elif self.type_id_list: - return """SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id - FROM ({0}) AS C - INNER JOIN cis on cis.ci_id=C.ci_id - WHERE cis.type_id in ({4}) - ORDER BY C.value {2} - LIMIT {1:d}, {3};""".format(new_table, - (self.page - 1) * self.count, - sort_type, self.count, - ",".join(self.type_id_list)) - else: - return """SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id - FROM ({0}) AS C - ORDER BY C.value {2} - LIMIT {1:d}, {3};""".format(new_table, - (self.page - 1) * self.count, - sort_type, self.count) - - def _wrap_sql(self, tor, alias, _query_sql, query_sql): - if tor[0] == "&": - query_sql = """SELECT * FROM ({0}) as {1} - INNER JOIN ({2}) as {3} USING(ci_id)""".format( - query_sql, alias, _query_sql, alias + "A") - elif tor[0] == "|": - query_sql = "SELECT * FROM ({0}) as {1} UNION ALL ({2})".format( - query_sql, alias, _query_sql) - elif tor[0] == "~": - query_sql = "SELECT * FROM ({0}) as {1} LEFT JOIN ({2}) as {3} " \ - "USING(ci_id) WHERE {3}.ci_id is NULL".format( - query_sql, alias, _query_sql, alias + "A") - return query_sql - - def _execute_sql(self, query_sql, only_type_query): - v_query_sql = self.sort_query_handler(self.sort, query_sql, - only_type_query) - start = time.time() - execute = db.session.execute - current_app.logger.debug(v_query_sql) - res = execute(v_query_sql).fetchall() - end_time = time.time() - current_app.logger.debug("query ci ids time is: {0}".format( - end_time - start)) - numfound = execute("SELECT FOUND_ROWS();").fetchall()[0][0] - current_app.logger.debug("statistics ci ids time is: {0}".format( - time.time() - end_time) - ) - return numfound, res - - def query_build_raw(self): - query_sql, alias, tor = "", "A", ["&"] - is_first = True - only_type_query = False - queries = self.orig_query.split(",") - queries = filter(lambda x: x != "", queries) - for q in queries: - if q.startswith("_type"): - queries.remove(q) - queries.insert(0, q) - if len(queries) == 1 or queries[1].startswith("-") or \ - queries[1].startswith("~"): - only_type_query = True - break - current_app.logger.debug(queries) - special = True - for q in queries: - _query_sql = "" - if ":" in q: - k = q.split(":")[0].strip() - v = ":".join(q.split(":")[1:]).strip() - current_app.logger.info(v) - field, field_type, tor, attr = self.attr_name_proc(k) - if field == "_type": - _query_sql = self.type_query_handler(v, only_type_query) - current_app.logger.debug(_query_sql) - elif field == "_id": # exclude all others - _ci_ids = [str(v)] - ci = db.session.query(CI.ci_id).filter( - CI.ci_id == int(v)).first() - if ci is not None: - return 1, _ci_ids - elif field: - if attr is None: - raise SearchError("{0} is not found".format(field)) - # in query - if v.startswith("(") and v.endswith(")"): - _query_sql = self.in_query_handler(attr, v) - # range query - elif v.startswith("[") and v.endswith("]") and "_TO_" in v: - _query_sql = self.range_query_handler(attr, v) - # comparison query - elif v.startswith(">=") or v.startswith("<=") or \ - v.startswith(">") or v.startswith("<"): - _query_sql = self.comparison_query_handler(attr, v) - else: - table_name = \ - TableMap(attr_name=attr.attr_name).table_name - _query_sql = QUERY_CI_BY_ATTR_NAME.format( - table_name, attr.attr_id, - 'LIKE "{0}"'.format(v.replace("*", "%"))) - else: - return 0, [] - elif q: - return 0, [] - - if is_first and _query_sql and not only_type_query: - query_sql = "SELECT * FROM ({0}) AS {1}".format(_query_sql, - alias) - is_first = False - alias += "A" - elif only_type_query and special: - is_first = False - special = False - query_sql = _query_sql - elif _query_sql: - query_sql = self._wrap_sql(tor, alias, _query_sql, query_sql) - alias += "AA" - - _start = time.time() - if query_sql: - self.query_sql = query_sql - current_app.logger.debug(query_sql) - numfound, res = self._execute_sql(query_sql, only_type_query) - current_app.logger.info("query ci ids is: {0}".format( - time.time() - _start)) - return numfound, [_res[0] for _res in res] - return 0, [] - - def facet_build(self): - facet = {} - for f in self.facet_field: - k, field_type, _, attr = self.attr_name_proc(f) - if k: - table_name = TableMap(attr_name=k).table_name - query_sql = FACET_QUERY.format( - table_name, self.query_sql, attr.attr_id) - result = db.session.execute(query_sql).fetchall() - facet[k] = result - facet_result = dict() - for k, v in facet.items(): - if not k.startswith('_'): - a = getattr(CIAttributeCache.get(k), "attr_%s" % self.ret_key) - facet_result[a] = list() - for f in v: - if f[1] != 0: - facet_result[a].append((f[0], f[1], a)) - return facet_result - - def fl_build(self): - _fl = list() - for f in self.fl: - k, _, _, _ = self.attr_name_proc(f) - if k: - _fl.append(k) - return _fl - - def search(self): - numfound, ci_ids = self.query_build_raw() - ci_ids = map(str, ci_ids) - _fl = self.fl_build() - - if self.facet_field and numfound: - facet = self.facet_build() - else: - facet = dict() - - response, counter = [], {} - if ci_ids: - response = get_cis_by_ids(ci_ids, ret_key=self.ret_key, fields=_fl) - for res in response: - ci_type = res.get("ci_type") - if ci_type not in counter.keys(): - counter[ci_type] = 0 - counter[ci_type] += 1 - total = len(response) - return response, counter, total, self.page, numfound, facet \ No newline at end of file diff --git a/cmdb-api/lib/template/__init__.py b/cmdb-api/lib/template/__init__.py deleted file mode 100644 index 44d37d3..0000000 --- a/cmdb-api/lib/template/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/cmdb-api/lib/template/filters.py b/cmdb-api/lib/template/filters.py deleted file mode 100644 index 149d4f7..0000000 --- a/cmdb-api/lib/template/filters.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding:utf-8 -*- - - -def convert_to_list(v): - if isinstance(v, list): - return v - if isinstance(v, tuple): - return list(v) - return [v, ] diff --git a/cmdb-api/lib/utils.py b/cmdb-api/lib/utils.py deleted file mode 100644 index 2a31655..0000000 --- a/cmdb-api/lib/utils.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding:utf-8 -*- - - -import redis - -from flask import current_app -import settings - - -class RedisHandler(object): - def __init__(self): - try: - pool = redis.ConnectionPool( - max_connections=settings.REDIS_MAX_CONN, - host=settings.REDIS_HOST, - port=settings.REDIS_PORT, - db=settings.REDIS_DB) - self.r = redis.Redis(connection_pool=pool) - except Exception as e: - print e - current_app.logger.error("init redis connection failed") - - @classmethod - def instance(cls): - if not hasattr(cls, "_instance"): - cls._instance = cls() - return cls._instance - - def get(self, ci_ids, key="CMDB_CI"): - try: - value = self.r.hmget(key, ci_ids) - except Exception as e: - current_app.logger.error("get redis error, %s" % str(e)) - return - return value - - def _set(self, ci, key="CMDB_CI"): - try: - self.r.hmset(key, ci) - except Exception as e: - current_app.logger.error("set redis error, %s" % str(e)) - - def add(self, ci): - self._set(ci) - - def delete(self, ci_id, key="CMDB_CI"): - try: - ret = self.r.hdel(key, ci_id) - if not ret: - current_app.logger.warn("ci [%d] is not in redis" % ci_id) - except Exception as e: - current_app.logger.error("delete redis key error, %s" % str(e)) - -rd = RedisHandler.instance() - - -def get_page(page): - try: - page = int(page) - except ValueError: - page = 1 - if page < 1: - page = 1 - return page - - -def get_per_page(per_page): - try: - per_page = int(per_page) - except: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - if per_page < 1: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - return per_page \ No newline at end of file diff --git a/cmdb-api/lib/value.py b/cmdb-api/lib/value.py deleted file mode 100644 index f9916f7..0000000 --- a/cmdb-api/lib/value.py +++ /dev/null @@ -1,170 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from flask import current_app - -from extensions import db -from models.attribute import CIAttributeCache -from lib.attribute import AttributeManager -from lib.const import type_map -from lib.const import TableMap - - -class AttributeValueManager(object): - """ - manage CI attribute values - """ - - def __init__(self): - pass - - def _get_attr(self, key): - """key is one of attr_id, attr_name and attr_alias - """ - attr = CIAttributeCache.get(key) - return attr - - def _get_attr_values(self, fields, ci_id, - ret_key="name", - uniq_key=None, - use_master=False): - res = dict() - for field in fields: - attr = CIAttributeCache.get(field) - if not attr: - current_app.logger.warn('attribute %s not found' % field) - return res - table = TableMap(attr_name=attr.attr_name).table - if use_master: - rs = db.session().using_bind("master").query( - table.value).filter_by(ci_id=ci_id).filter_by( - attr_id=attr.attr_id) - else: - rs = db.session.query(table.value).filter_by( - ci_id=ci_id).filter_by(attr_id=attr.attr_id) - field_name = getattr(attr, "attr_{0}".format(ret_key)) - try: - if attr.is_multivalue: - if attr.value_type == 'datetime': - res[field_name] = [datetime.datetime.strftime( - x.value, '%Y-%m-%d %H:%M:%S') for x in rs.all()] - else: - res[field_name] = [x.value for x in rs.all()] - else: - x = rs.first() - if x: - if attr.value_type == 'datetime': - res[field_name] = datetime.datetime.strftime( - rs.first().value, '%Y-%m-%d %H:%M:%S') - else: - res[field_name] = rs.first().value - else: - res[field_name] = None - except AttributeError as e: - current_app.logger.warn("get ci by id error, {0}".format(e)) - if attr.is_multivalue: - res[field_name] = list() - else: - res[field_name] = "" - if uniq_key is not None and attr.attr_id == uniq_key.attr_id \ - and rs.first() is not None: - res['unique'] = uniq_key.attr_name - return res - - def _validate(self, attr, value, table, ci_id): - converter = type_map.get("converter").get(attr.value_type) - try: - v = converter(value) - except ValueError: - return False, "attribute value {0} converter fail".format(value) - if attr.is_choice: - choice_list = AttributeManager()._get_choice_value( - attr.attr_id, attr.value_type) - if v not in choice_list: - return False, "{0} is not existed in choice values".format( - value) - elif attr.is_uniq: - old_value = db.session.query(table.attr_id).filter( - table.attr_id == attr.attr_id).filter( - table.value == v).filter(table.ci_id != ci_id).first() - if old_value is not None: - return False, "attribute {0} value {1} must be unique".format( - attr.attr_name, value) - return True, v - - def add_attr_value(self, key, value, ci_id, ci_type, - _no_attribute_policy="ignore", ci_existed=False): - """key is one of attr_id, attr_name and attr_alias - """ - attr = self._get_attr(key) - if attr is None: - if _no_attribute_policy == 'ignore': - return True, None - if _no_attribute_policy == 'reject': - return False, 'attribute {0} not exist'.format(key) - table, old_value, old_value_table = TableMap( - attr_name=attr.attr_name).table, None, None - if ci_existed: - old_value_table = db.session.query(table).filter( - table.attr_id == attr.attr_id).filter( - table.ci_id == ci_id).first() - if old_value_table is not None: - old_value = old_value_table.value - if not value and ci_existed: - db.session.query(table).filter( - table.attr_id == attr.attr_id).filter( - table.ci_id == ci_id).delete() - if old_value: - return True, (attr.attr_id, "delete", old_value, None) - else: - return True, None - elif not value: - return True, None - if not attr.is_multivalue: - ret, res = self._validate(attr, value, table, ci_id) - if not ret: - return False, res - value_table = table() - if ci_existed: # for history - old = db.session.query(table).filter( - table.attr_id == attr.attr_id).filter( - table.value == value).filter( - table.ci_id == ci_id).first() - if old is not None: - return True, None - elif old_value_table: - value_table = old_value_table - value_table.ci_id = ci_id - value_table.attr_id = attr.attr_id - value_table.value = res - db.session.add(value_table) - elif attr.is_multivalue: - if ci_existed: - db.session.query(table).filter( - table.attr_id == attr.attr_id).filter( - table.ci_id == ci_id).delete() - - for v in value.strip().split(","): - ret, res = self._validate(attr, v, table, ci_id) - if not ret: - return False, res - value_table = table() - value_table.ci_id = ci_id - value_table.attr_id = attr.attr_id - value_table.value = res - db.session.add(value_table) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "add attribute value is error, {0}".format(str(e))) - return False, "add attribute value is error, {0}".format(str(e)) - if ci_existed: - if old_value != value: - return True, (attr.attr_id, "update", old_value, value) - else: - return True, None - return True, (attr.attr_id, "add", None, value) \ No newline at end of file diff --git a/cmdb-api/manage.py b/cmdb-api/manage.py deleted file mode 100644 index 3488926..0000000 --- a/cmdb-api/manage.py +++ /dev/null @@ -1,77 +0,0 @@ -# -*- coding: utf-8 -*- - - -from flask import jsonify -from flask import make_response -from flask.ext.script import Manager -from flask.ext.script import prompt_bool -from flask.ext.celery import install_commands as install_celery_command - -from __init__ import make_app -from extensions import db -from gunicornserver import GunicornServer -from lib.exception import InvalidUsageError - - -app = make_app('config.cfg') - - -@app.errorhandler(InvalidUsageError) -def handle_invalid_usage(error): - response = jsonify(error.to_dict()) - response.status_code = error.status_code - return response - - -@app.errorhandler(404) -def not_found(error): - return make_response(jsonify({'message': error.description}), 404) - - -@app.errorhandler(400) -def bad_request(error): - return make_response(jsonify({'message': error.description}), 400) - - -@app.errorhandler(401) -def auth_lack(error): - return make_response(jsonify({'message': error.description}), 401) - - -@app.errorhandler(403) -def exception_403(error): - return make_response(jsonify({'message': error.description}), 403) - - -@app.errorhandler(405) -def exception_405(error): - return make_response(jsonify({'message': error.description}), 405) - - -@app.errorhandler(500) -def server_error(error): - return make_response(jsonify({"message": error.description}), 500) - - -manager = Manager(app) - -install_celery_command(manager) - - -@manager.command -def db_setup(): - "create all database tables" - db.create_all() - - -@manager.command -def db_dropall(): - "drop all databse tables" - if prompt_bool("Are you sure ? You will lose all your data !"): - db.drop_all() - - -manager.add_command("run", GunicornServer()) - -if __name__ == '__main__': - manager.run(default_command="runserver") diff --git a/cmdb-api/models/__init__.py b/cmdb-api/models/__init__.py deleted file mode 100644 index b5f28a6..0000000 --- a/cmdb-api/models/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding:utf-8 -*- - - -def row2dict(row): - d = dict() - for c in row.__table__.columns: - if not isinstance(getattr(row, c.name), - (basestring, long, int, float, list, tuple, dict)) \ - and getattr(row, c.name): - d[c.name] = getattr(row, c.name).strftime("%Y-%m-%d %H:%M:%S") - else: - d[c.name] = getattr(row, c.name) - return d - - -from account import * -from attribute import * -from ci import * -from ci_relation import * -from ci_type import * -from ci_type_relation import * -from ci_value import * -from history import * -from statis import * diff --git a/cmdb-api/models/account.py b/cmdb-api/models/account.py deleted file mode 100644 index 0a3b322..0000000 --- a/cmdb-api/models/account.py +++ /dev/null @@ -1,230 +0,0 @@ -# -*- coding:utf-8 -*- - - -import hashlib -import copy -from datetime import datetime - -from werkzeug.utils import cached_property -from flask.ext.sqlalchemy import BaseQuery -from flask.ext.principal import RoleNeed -from flask.ext.principal import UserNeed -from flask.ext.principal import Permission - -from extensions import db -from extensions import cache -from permissions import admin -from models import row2dict - - -class UserQuery(BaseQuery): - def from_identity(self, identity): - """ - Loads user from flask.ext.principal.Identity instance and - assigns permissions from user. - - A "user" instance is monkey patched to the identity instance. - - If no user found then None is returned. - """ - - try: - _id = identity.id - if _id: - _id = int(_id) - user = self.get(_id) - except ValueError: - user = None - except Exception: - user = None - if user: - identity.provides.update(user.provides) - identity.user = user - return user - - def authenticate(self, login, password): - user = self.filter(db.or_(User.username == login, - User.email == login)).first() - if user: - authenticated = user.check_password(password) - else: - authenticated = False - return user, authenticated - - def authenticate_with_key(self, key, secret, args, path): - user = self.filter(User.key == key).filter(User.block == 0).first() - if not user: - return None, False - if user and hashlib.sha1('%s%s%s' % ( - path, user.secret, "".join(args))).hexdigest() == secret: - authenticated = True - else: - authenticated = False - return row2dict(user), authenticated - - def search(self, key): - query = self.filter(db.or_(User.email == key, - User.nickname.ilike('%' + key + '%'), - User.username.ilike('%' + key + '%'))) - return query - - def get_by_username(self, username): - user = self.filter(User.username == username).first() - return user - - def get_by_nickname(self, nickname): - user = self.filter(User.nickname == nickname).first() - return user - - def get(self, uid): - user = self.filter(User.uid == uid).first() - return copy.deepcopy(user) - - def is_exits(self, username): - user = self.filter(User.username == username).first() - return user is not None - - -class User(db.Model): - __tablename__ = 'users' - query_class = UserQuery - - ADMIN = 1 - - uid = db.Column(db.Integer, primary_key=True, autoincrement=True) - username = db.Column(db.String(32), unique=True) - nickname = db.Column(db.String(20), nullable=True) - department = db.Column(db.String(20)) - catalog = db.Column(db.String(64)) - email = db.Column(db.String(100), unique=True, nullable=False) - mobile = db.Column(db.String(14), unique=True) - _password = db.Column("password", db.String(80), nullable=False) - key = db.Column(db.String(32), nullable=False) - secret = db.Column(db.String(32), nullable=False) - date_joined = db.Column(db.DateTime, default=datetime.utcnow) - last_login = db.Column(db.DateTime, default=datetime.utcnow) - block = db.Column(db.Boolean, default=False) - has_logined = db.Column(db.Boolean, default=False) - - class Permissions(object): - def __init__(self, obj): - self.obj = obj - - @cached_property - def is_admin(self): - return Permission(UserNeed(self.obj.id)) & admin - - def __init__(self, *args, **kwargs): - super(User, self).__init__(*args, **kwargs) - - def __str__(self): - return self.username - - @cached_property - def permissions(self): - return self.Permissions(self) - - def _get_password(self): - return self._password - - def _set_password(self, password): - self._password = password - - password = db.synonym("_password", descriptor=property( - _get_password, _set_password)) - - def check_password(self, password): - return self.password == password - - @cached_property - def provides(self): - needs = [RoleNeed('authenticated'), UserNeed(self.uid)] - for r in self.rolenames: - needs.append(RoleNeed(r)) - if self.is_admin: - needs.append(RoleNeed('admin')) - return needs - - @property - def roles(self): - urs = db.session.query(UserRole.rid).filter( - UserRole.uid == self.uid).all() - return [x.rid for x in urs] - - @property - def rolenames(self): - return [db.session.query(Role.role_name).filter( - Role.rid == rid).first().role_name for rid in self.roles] - - @property - def is_admin(self): - return self.ADMIN in self.roles - - -class Role(db.Model): - __tablename__ = 'roles' - - rid = db.Column(db.Integer, primary_key=True, autoincrement=True) - role_name = db.Column(db.String(64), nullable=False, unique=True) - - -class UserRole(db.Model): - __tablename__ = 'users_roles' - - uid = db.Column(db.Integer, db.ForeignKey('users.uid'), primary_key=True) - rid = db.Column(db.Integer, db.ForeignKey('roles.rid'), primary_key=True) - - -class UserCache(object): - @classmethod - def get(cls, key): - user = cache.get("User::uid::%s" % key) or \ - cache.get("User::username::%s" % key) or \ - cache.get("User::nickname::%s" % key) - if not user: - user = User.query.get(key) or \ - User.query.get_by_username(key) or \ - User.query.get_by_nickname(key) - if user: - cls.set(user) - return user - - @classmethod - def set(cls, user): - cache.set("User::uid::%s" % user.uid, user) - cache.set("User::username::%s" % user.username, user) - cache.set("User::nickname::%s" % user.nickname, user) - - @classmethod - def clean(cls, user): - cache.delete("User::uid::%s" % user.uid) - cache.delete("User::username::%s" % user.username) - cache.delete("User::nickname::%s" % user.nickname) - - -class RoleCache(object): - @classmethod - def get(cls, rid): - role = None - if isinstance(rid, (int, long)): - role = cache.get("Role::rid::%s" % rid) - if not role: - role = db.session.query(Role).filter(Role.rid == rid).first() - cls.set(role) - elif isinstance(rid, basestring): - role = cache.get("Role::role_name::%s" % rid) - if not role: - role = db.session.query(Role).filter( - Role.role_name == rid).first() - cls.set(role) - return role - - @classmethod - def set(cls, role): - cache.set("Role::rid::%s" % role.rid, role) - cache.set("Role::role_name::%s" % role.role_name, role) - - @classmethod - def clean(cls, role): - cache.delete("Role::rid::%s" % role.rid, role) - cache.delete("Role::role_name::%s" % role.role_name, role) \ No newline at end of file diff --git a/cmdb-api/models/attribute.py b/cmdb-api/models/attribute.py deleted file mode 100644 index fbc5c0b..0000000 --- a/cmdb-api/models/attribute.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding:utf-8 -*- - -from extensions import db, cache - - -class CIAttribute(db.Model): - __tablename__ = "ci_attributes" - - attr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - attr_name = db.Column(db.String(32), nullable=False, unique=True) - attr_alias = db.Column(db.String(32), nullable=False, unique=True) - value_type = db.Column( - db.String(8), - db.Enum("int", "float", "text", "datetime", name='value_type'), - default="text", - nullable=False) - is_choice = db.Column(db.Boolean, default=False) - is_multivalue = db.Column(db.Boolean, default=False) - is_uniq = db.Column(db.Boolean, default=False) - is_index = db.Column(db.Boolean, default=False) - - -class IntegerChoice(db.Model): - __tablename__ = 'choice_integers' - - choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - attr = db.relationship("CIAttribute", backref="choice_integers") - value = db.Column(db.Integer, nullable=False) - - -class FloatChoice(db.Model): - __tablename__ = 'choice_floats' - - choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - attr = db.relationship("CIAttribute", backref="choice_floats") - value = db.Column(db.Float, nullable=False) - - -class TextChoice(db.Model): - __tablename__ = 'choice_texts' - - choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - attr = db.relationship("CIAttribute", backref="choice_texts") - value = db.Column(db.Text, nullable=False) - - -class CIAttributeCache(object): - @classmethod - def get(cls, key): - if key is None: - return - attr = cache.get('Field::Name::%s' % key) or \ - cache.get('Field::ID::%s' % key) or \ - cache.get('Field::Alias::%s' % key) - if attr is None: - attr = db.session.query(CIAttribute).filter_by( - attr_name=key).first() or \ - db.session.query(CIAttribute).filter( - CIAttribute.attr_id == key).first() or \ - db.session.query(CIAttribute).filter( - CIAttribute.attr_alias == key).first() - db.session.close() - if attr is not None: - CIAttributeCache.set(attr) - return attr - - @classmethod - def set(cls, attr): - cache.set('Field::ID::%s' % attr.attr_id, attr) - cache.set('Field::Name::%s' % attr.attr_name, attr) - cache.set('Field::Alias::%s' % attr.attr_alias, attr) - - @classmethod - def clean(cls, attr): - if cache.get('Field::ID::%s' % attr.attr_id): - cache.delete('Field::ID::%s' % attr.attr_id) - cache.delete('Field::Name::%s' % attr.attr_name) - cache.delete('Field::Alias::%s' % attr.attr_alias) \ No newline at end of file diff --git a/cmdb-api/models/ci.py b/cmdb-api/models/ci.py deleted file mode 100644 index b4ee4cf..0000000 --- a/cmdb-api/models/ci.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding:utf-8 -*- - -import datetime - -from extensions import db - - -class CI(db.Model): - __tablename__ = "cis" - - ci_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - uuid = db.Column(db.String(32), nullable=False) - type_id = db.Column(db.Integer, - db.ForeignKey("ci_types.type_id"), - nullable=False) - ci_type = db.relationship("CIType", backref="cis") - status = db.Column(db.String(8), - db.Enum("review", "validate", name="stauts")) - created_time = db.Column(db.DateTime, default=datetime.datetime.now()) - heartbeat = db.Column(db.DateTime, default=datetime.datetime.now()) \ No newline at end of file diff --git a/cmdb-api/models/ci_relation.py b/cmdb-api/models/ci_relation.py deleted file mode 100644 index 6a347ea..0000000 --- a/cmdb-api/models/ci_relation.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding:utf-8 -*- - - -from extensions import db - - -class CIRelation(db.Model): - __tablename__ = "ci_relations" - cr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - first_ci_id = db.Column(db.Integer, - db.ForeignKey("cis.ci_id"), - primary_key=True) - second_ci_id = db.Column(db.Integer, - db.ForeignKey("cis.ci_id"), - primary_key=True) - first_ci = db.relationship("CI", - primaryjoin="CI.ci_id==CIRelation.first_ci_id") - second_ci = db.relationship( - "CI", primaryjoin="CI.ci_id==CIRelation.second_ci_id") - relation_type = db.Column( - db.String(8), db.Enum("connect", "deploy", "install", "contain", - name="relation_type"), nullable=False) - more = db.Column(db.Integer, db.ForeignKey("cis.ci_id")) - - __table_args__ = (db.UniqueConstraint("first_ci_id", "second_ci_id", - name="first_second_uniq"), ) diff --git a/cmdb-api/models/ci_type.py b/cmdb-api/models/ci_type.py deleted file mode 100644 index a995c82..0000000 --- a/cmdb-api/models/ci_type.py +++ /dev/null @@ -1,128 +0,0 @@ -# -*- coding:utf-8 -*- - -from extensions import db -from extensions import cache - - -class CIType(db.Model): - __tablename__ = "ci_types" - - type_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - type_name = db.Column(db.String(32)) - type_alias = db.Column(db.String(32)) - uniq_id = db.Column(db.Integer, - db.ForeignKey("ci_attributes.attr_id"), - nullable=False) - uniq_key = db.relationship("CIAttribute", backref="ci_types") - enabled = db.Column(db.Boolean, default=True, nullable=False) - is_attached = db.Column(db.Boolean, default=False, nullable=False) - icon_url = db.Column(db.String(256)) - order = db.Column(db.SmallInteger, default=0, nullable=False) - - -class CITypeAttribute(db.Model): - __tablename__ = "type_attributes" - - type_id = db.Column(db.Integer, - db.ForeignKey("ci_types.type_id"), - primary_key=True) - attr_id = db.Column(db.Integer, - db.ForeignKey("ci_attributes.attr_id"), - primary_key=True) - is_required = db.Column(db.Boolean, default=False) - - __table_args__ = (db.UniqueConstraint("type_id", "attr_id", - name="type_attr_uniq"), ) - - -class CITypeCache(object): - @classmethod - def get(cls, key): - if key is None: - return - ct = cache.get("CIType::ID::%s" % key) or \ - cache.get("CIType::Name::%s" % key) - if ct is None: - ct = db.session.query(CIType).filter( - CIType.type_name == key).first() or \ - db.session.query(CIType).filter(CIType.type_id == key).first() - if ct is not None: - CITypeCache.set(ct) - return ct - - @classmethod - def set(cls, ct): - cache.set("CIType::Name::%s" % ct.type_name, ct) - cache.set("CIType::ID::%d" % ct.type_id, ct) - - @classmethod - def clean(cls, key): - ct = CITypeCache.get(key) - if ct is not None: - cache.delete("CIType::Name::%s" % ct.type_name) - cache.delete("CIType::ID::%s" % ct.type_id) - - -class CITypeSpecCache(object): - @classmethod - def get(cls, key): - if key is None: - return - ct = cache.get("CITypeSPEC::ID::%d" % key) - if ct is None: - ct = db.session.query(CIType).filter(CIType.type_id == key).first() - if ct is not None: - CITypeSpecCache.set(ct) - return ct - - @classmethod - def set(cls, ct): - cache.set("CITypeSPEC::ID::%d" % ct.type_id, ct) - - @classmethod - def clean(cls, key): - ct = CITypeCache.get(key) - if ct is not None: - cache.delete("CITypeSPEC::ID::%d" % ct.type_id) - - -class CITypeAttributeCache(object): - """ - key is type_id or type_name - """ - - @classmethod - def get(cls, key): - if key is None: - return - if isinstance(key, basestring) and isinstance(key, unicode): - key = unicode(key, 'utf8') - citypes = cache.get("CITypeAttribute::Name::%s" % key) or \ - cache.get("CITypeAttribute::ID::%s" % key) - if not citypes: - citypes = db.session.query(CITypeAttribute).filter( - CITypeAttribute.type_id == key).all() - if citypes is None: - ci_type = db.session.query(CIType).filter( - CIType.type_name == key).first() - if ci_type is not None: - citypes = db.session.query(CITypeAttribute).filter_by( - type_id=ci_type.type_id).all() - if citypes is not None: - CITypeAttributeCache.set(key, citypes) - return citypes - - @classmethod - def set(cls, key, values): - citype = CITypeCache.get(key) - if citype is not None: - cache.set("CITypeAttribute::ID::%s" % citype.type_id, values) - cache.set("CITypeAttribute::Name::%s" % citype.type_name, values) - - @classmethod - def clean(cls, key): - citype = CITypeCache.get(key) - attrs = CITypeAttributeCache.get(key) - if attrs is not None and citype: - cache.delete("CITypeAttribute::ID::%s" % citype.type_id) - cache.delete("CITypeAttribute::Name::%s" % citype.type_name) \ No newline at end of file diff --git a/cmdb-api/models/ci_type_relation.py b/cmdb-api/models/ci_type_relation.py deleted file mode 100644 index cde0486..0000000 --- a/cmdb-api/models/ci_type_relation.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding:utf-8 -*- - -from extensions import db - - -class CITypeRelation(db.Model): - __tablename__ = "ci_type_relations" - - ctr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - parent_id = db.Column(db.Integer, - db.ForeignKey("ci_types.type_id"), - primary_key=True) - parent = db.relationship( - "CIType", primaryjoin="CIType.type_id==CITypeRelation.parent_id") - child_id = db.Column(db.Integer, - db.ForeignKey("ci_types.type_id"), - primary_key=True) - child = db.relationship( - "CIType", primaryjoin="CIType.type_id==CITypeRelation.child_id") - relation_type = db.Column( - db.String(7), - db.Enum("contain", "connect", "deploy", "install", - name="relation_type"), - default="contain") - - __table_args__ = (db.UniqueConstraint("parent_id", "child_id", - name="parent_child_uniq"), ) \ No newline at end of file diff --git a/cmdb-api/models/ci_value.py b/cmdb-api/models/ci_value.py deleted file mode 100644 index f99068c..0000000 --- a/cmdb-api/models/ci_value.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- coding:utf-8 -*- - - -from extensions import db -from sqlalchemy import Index - - -class CIIndexValueInteger(db.Model): - __tablename__ = "index_integers" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="index_integers") - attr = db.relationship("CIAttribute", backref="index_integers") - value = db.Column(db.Integer, nullable=False) - - __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) - - -class CIIndexValueFloat(db.Model): - __tablename__ = "index_floats" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="index_floats") - attr = db.relationship("CIAttribute", backref="index_floats") - value = db.Column(db.Float, nullable=False) - - __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) - - -class CIIndexValueText(db.Model): - __tablename__ = "index_texts" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="index_texts") - attr = db.relationship("CIAttribute", backref="index_texts") - value = db.Column(db.String(128), nullable=False) - - __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) - - -class CIIndexValueDateTime(db.Model): - __tablename__ = "index_datetime" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="index_datetime") - attr = db.relationship("CIAttribute", backref="index_datetime") - value = db.Column(db.DateTime, nullable=False) - - __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) - - -class CIValueInteger(db.Model): - __tablename__ = "integers" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="integers") - attr = db.relationship("CIAttribute", backref="integers") - value = db.Column(db.Integer, nullable=False) - - -class CIValueFloat(db.Model): - __tablename__ = "floats" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="floats") - attr = db.relationship("CIAttribute", backref="floats") - value = db.Column(db.Float, nullable=False) - - -class CIValueText(db.Model): - __tablename__ = "texts" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="texts") - attr = db.relationship("CIAttribute", backref="texts") - value = db.Column(db.Text, nullable=False) - - -class CIValueDateTime(db.Model): - __tablename__ = "datetime" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="datetime") - attr = db.relationship("CIAttribute", backref="datetime") - value = db.Column(db.DateTime, nullable=False) diff --git a/cmdb-api/models/history.py b/cmdb-api/models/history.py deleted file mode 100644 index 8fb9e7a..0000000 --- a/cmdb-api/models/history.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from extensions import db - - -class OperationRecord(db.Model): - __tablename__ = "records" - - record_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - uid = db.Column(db.Integer, db.ForeignKey('users.uid'), nullable=False) - timestamp = db.Column(db.DateTime, - nullable=False, - default=datetime.datetime.now()) - origin = db.Column(db.String(32)) - ticket_id = db.Column(db.String(32)) - reason = db.Column(db.Text) - - -class CIAttributeHistory(db.Model): - __tablename__ = "histories" - - h_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - operate_type = db.Column(db.String(6), db.Enum("add", "delete", "update", - name="operate_type")) - record_id = db.Column(db.Integer, - db.ForeignKey("records.record_id"), - nullable=False) - ci_id = db.Column(db.Integer, nullable=False) - attr_id = db.Column(db.Integer, nullable=False) - old = db.Column(db.Text) - new = db.Column(db.Text) - - -class CIRelationHistory(db.Model): - __tablename__ = "relation_histories" - - rh_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - operate_type = db.Column(db.String(6), - db.Enum("add", "delete", name="operate_type")) - record_id = db.Column(db.Integer, - db.ForeignKey("records.record_id"), - nullable=False) - first_ci_id = db.Column(db.Integer) - second_ci_id = db.Column(db.Integer) - relation_type = db.Column( - db.String(8), db.Enum("connect", "deploy", "install", "contain", - name="relation_type")) - relation = db.Column(db.Integer, nullable=False) diff --git a/cmdb-api/models/statis.py b/cmdb-api/models/statis.py deleted file mode 100644 index 64e03a4..0000000 --- a/cmdb-api/models/statis.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from extensions import db - - -class UrlRecord(db.Model): - - url_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - - url = db.Column(db.String(64), nullable=False) - response_time = db.Column(db.Float, nullable=False) - is_ok = db.Column(db.Boolean, default=True) - source = db.Column(db.String(32)) - remote_addr = db.Column(db.String(20)) - hits = db.Column(db.Integer) - method = db.Column(db.String(5), default="GET") - created_at = db.Column(db.DateTime, default=datetime.datetime.now()) \ No newline at end of file diff --git a/cmdb-api/permissions.py b/cmdb-api/permissions.py deleted file mode 100644 index 891b952..0000000 --- a/cmdb-api/permissions.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask.ext.principal import RoleNeed, Permission - - -admin = Permission(RoleNeed('admin')) -auth = Permission(RoleNeed('authenticated')) -null = Permission(RoleNeed('null')) \ No newline at end of file diff --git a/cmdb-api/requirements/default.txt b/cmdb-api/requirements/default.txt deleted file mode 100644 index 6ee0a59..0000000 --- a/cmdb-api/requirements/default.txt +++ /dev/null @@ -1,14 +0,0 @@ -Flask==0.9 -Flask-Script==0.5.2 -Flask-Babel==0.8 -Flask-principal==0.3.5 -Flask-mail==0.7.4 -pymysql==0.5 -sqlalchemy==0.8.2 -Flask-sqlalchemy==0.16 -Flask-cache==0.9.2 -redis==2.7.2 -gunicorn==0.17.4 -celery==3.0.18 -flask-celery=2.4.3 -Jinja2==2.7.1 \ No newline at end of file diff --git a/cmdb-api/settings.py b/cmdb-api/settings.py deleted file mode 100644 index 9819a83..0000000 --- a/cmdb-api/settings.py +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding:utf-8 -*- - -## CI cache -REDIS_HOST = "127.0.0.1" -REDIS_PORT = 6379 -REDIS_DB = 0 -REDIS_MAX_CONN = 30 diff --git a/cmdb-api/tasks/__init__.py b/cmdb-api/tasks/__init__.py deleted file mode 100644 index 44d37d3..0000000 --- a/cmdb-api/tasks/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/cmdb-api/tasks/cmdb.py b/cmdb-api/tasks/cmdb.py deleted file mode 100644 index 11f5cbe..0000000 --- a/cmdb-api/tasks/cmdb.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding:utf-8 -*- - - -import json -import time - -from flask import current_app - -from extensions import celery -from extensions import db -from lib.utils import rd -import lib.ci - - -@celery.task(name="cmdb.ci_cache", queue="cmdb_async") -def ci_cache(ci_id): - time.sleep(0.1) - db.session.close() - m = lib.ci.CIManager() - ci = m.get_ci_by_id(ci_id, need_children=False, use_master=True) - rd.delete(ci_id) - rd.add({ci_id: json.dumps(ci)}) - current_app.logger.info("%d caching.........." % ci_id) - - -@celery.task(name="cmdb.ci_delete", queue="cmdb_async") -def ci_delete(ci_id): - current_app.logger.info(ci_id) - rd.delete(ci_id) - current_app.logger.info("%d delete.........." % ci_id) diff --git a/cmdb-api/tasks/statis.py b/cmdb-api/tasks/statis.py deleted file mode 100644 index 0971117..0000000 --- a/cmdb-api/tasks/statis.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from flask import current_app - -from extensions import celery -from extensions import db -from models.statis import UrlRecord - - -@celery.task(name="statis.url_record", queue="statis_async") -def url_record(url, method, remote_addr, response_time, status_code, source): - current_app.logger.info("%s add 1" % url) - now = datetime.datetime.now() - u = UrlRecord(url=url, response_time=response_time, is_ok=1, - source="default", hits=1, method=method, created_at=now, - remote_addr=remote_addr) - db.session.add(u) - db.session.commit() \ No newline at end of file diff --git a/cmdb-api/templates/search.xml b/cmdb-api/templates/search.xml deleted file mode 100644 index e30f791..0000000 --- a/cmdb-api/templates/search.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - {{ numfound }} - {{ page }} - - {% for ci in result %} - - {% for k, v in ci.items() %} - {% if not k.startswith('_') %} - {% for item in v | convert_to_list %} - {{ item }} - {% endfor %} - {% endif %} - {% endfor %} - - {% endfor %} - - - {% for k,v in facet.items() %} - - {% for item in v %} - {{ item[1] }} - {% endfor %} - - {% endfor %} - - \ No newline at end of file diff --git a/cmdb-api/templates/search_tidy.xml b/cmdb-api/templates/search_tidy.xml deleted file mode 100644 index 52832a0..0000000 --- a/cmdb-api/templates/search_tidy.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - {{ code }} - - {% for k, v in ret.items() %} - - {% for ci in v %} - - - {% for item in ci|convert_to_list %} - {{ item }} - {% endfor %} - - - {% endfor %} - - {% endfor %} - - \ No newline at end of file From 6489a2eb485c1b9feca88fbb8f80b9532f7ef190 Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 09:53:18 +0800 Subject: [PATCH 007/159] modify .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3953a64..93ecf2f 100755 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ config.cfg *.tar.gz core/special.py lib/special +lib/audit* From 7f647887c857dce20e6b2ca81a8134924f5fa3fb Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 10:00:33 +0800 Subject: [PATCH 008/159] clear --- .gitignore | 1 + lib/audit.py | 168 --------------------------------- lib/mail.py | 86 ----------------- templates/ci_audit_notify.html | 51 ---------- 4 files changed, 1 insertion(+), 305 deletions(-) delete mode 100644 lib/audit.py delete mode 100644 lib/mail.py delete mode 100644 templates/ci_audit_notify.html diff --git a/.gitignore b/.gitignore index 93ecf2f..1cc6836 100755 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ config.cfg core/special.py lib/special lib/audit* +templates/*audit* diff --git a/lib/audit.py b/lib/audit.py deleted file mode 100644 index 1e95b79..0000000 --- a/lib/audit.py +++ /dev/null @@ -1,168 +0,0 @@ -# -*- coding:utf-8 -*- - -__author__ = 'pycook' - -import datetime - -from flask import current_app - -from models.cmdb import CIAudit -from models.cmdb import CIAttributeAudit -from models.cmdb import CIAttributeCache -from models.cmdb import CITypeCache -from models.cmdb import CI -from models import row2dict -from extensions import db -from lib.const import TableMap -from tasks.cmdb import ci_cache - - -class CIAuditManager(object): - def __init__(self): - pass - - def get_cis_for_audits(self, page, type_ids, per_page=25): - audit_cis = db.session.query(CIAudit) - if type_ids: - audit_cis = audit_cis.join(CI, CI.ci_id == CIAudit.ci_id).filter( - CI.type_id.in_(type_ids)) - - audit_cis = audit_cis.filter(CIAudit.is_audit == 0).order_by( - CIAudit.created_at) - numfound = audit_cis.count() - audit_cis = audit_cis.offset((page - 1) * per_page).limit(per_page) - total = audit_cis.count() - audit_cis = audit_cis.all() - result = list() - for audit_ci in audit_cis: - audit_dict = row2dict(audit_ci) - audit_attrs = db.session.query(CIAttributeAudit).filter( - CIAttributeAudit.audit_id == audit_ci.audit_id).all() - audit_dict["values"] = list() - for audit_attr in audit_attrs: - audit_attr_dict = row2dict(audit_attr) - audit_attr_dict["attr_name"] = CIAttributeCache.get( - audit_attr.attr_id).attr_name - audit_dict['values'].append(audit_attr_dict) - result.append(audit_dict) - return numfound, total, result - - def create_ci_audits(self, type_name, attr_pairs): - ci_type = CITypeCache.get(type_name) - uniq_key = CIAttributeCache.get(ci_type.uniq_id) - table = TableMap(attr_name=uniq_key.attr_name).table - value = db.session.query(table.ci_id).filter( - table.attr_id == uniq_key.attr_id).filter( - table.value == attr_pairs.get(uniq_key.attr_name)).first() - del attr_pairs[uniq_key.attr_name] - if value and attr_pairs: - ci_audit = db.session.query(CIAudit).filter( - CIAudit.ci_id == value.ci_id).filter( - CIAudit.is_audit == 0).first() - if ci_audit is None: - ci_audit = CIAudit() - ci_audit.is_notified = False - ci_audit.created_at = datetime.datetime.now() - ci_audit.ci_id = value.ci_id - ci_audit.updated_at = datetime.datetime.now() - ci_audit.origin = 1 # TODO - db.session.add(ci_audit) - db.session.commit() - for attr, attr_value in attr_pairs.items(): - attr_id = CIAttributeCache.get(attr).attr_id - ci_attr_audit = CIAttributeAudit() - ci_attr_audit.attr_id = attr_id - all_values = attr_value.strip().split("###") - ci_attr_audit.cur_value = all_values[0] - ci_attr_audit.new_value = all_values[1] - ci_attr_audit.audit_id = ci_audit.audit_id - db.session.add(ci_attr_audit) - db.session.flush() - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("create ci audits error, %s" % str(e)) - return False, "create ci audits error, %s" % str(e) - return True, None - - def _update_cmdb(self, ci_id, attr_id, value): - try: - attr_name = CIAttributeCache.get(attr_id).attr_name - table = TableMap(attr_name=attr_name).table - attr_value = db.session.query(table).filter( - table.attr_id == attr_id).filter( - table.ci_id == ci_id).first() - attr_value.value = value - db.session.add(attr_value) - - except Exception as e: - return False, "audit failed, %s" % str(e) - return True, ci_id - - def audit_by_attr(self, audit_id, attr_ids, value=None): - ci_audit = CIAudit.query.get(audit_id) - ci_id = ci_audit.ci_id - for attr_id in attr_ids: - attr_audit = db.session.query(CIAttributeAudit).filter( - CIAttributeAudit.audit_id == audit_id).filter( - CIAttributeAudit.attr_id == attr_id).first() - if attr_audit: - attr_audit.is_audit = True - attr_audit.auditor = 1 # TODO - attr_audit.audited_at = datetime.datetime.now() - if value is not None: - attr_audit.audit_value = value - else: - attr_audit.audit_value = attr_audit.new_value - if attr_audit.cur_value != value: # update cmdb - ret, res = self._update_cmdb(ci_id, attr_id, value) - if not ret: - return False, res - attr_audit.is_updated = True - db.session.add(attr_audit) - db.session.flush() - if db.session.query(CIAttributeAudit).filter_by( - audit_id=audit_id).filter_by(is_audit=0).first() is None: - ci_audit.is_audit = True - ci_audit.updated_at = datetime.datetime.now() - db.session.add(ci_audit) - ci_cache.apply_async([ci_id], queue="cmdb_async") - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "audit by attribute is error, {0}".format(str(e))) - return False, "audit by attribute is error, %s" % str(e) - return True, None - - def audit_by_cis(self, ci_ids): - for ci_id in ci_ids: - ci_audit = db.session.query(CIAudit).filter_by(ci_id=ci_id).first() - attr_audits = db.session.query(CIAttributeAudit).filter_by( - audit_id=ci_audit.audit_id).all() - for attr_audit in attr_audits: - attr_audit.is_audit = True - attr_audit.auditor = 1 # TODO - attr_audit.audited_at = datetime.datetime.now() - attr_audit.audit_value = attr_audit.new_value - ret, res = self._update_cmdb( - ci_id, attr_audit.attr_id, - attr_audit.new_value) - if not ret: - return False, res - attr_audit.is_updated = True - db.session.add(attr_audit) - ci_audit.is_audit = True - ci_audit.updated_at = datetime.datetime.now() - db.session.add(ci_audit) - ci_cache.apply_async([ci_id], queue="cmdb_async") - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "audit by attribute error, {0}".format(str(e))) - return False, "audit by cis is error, %s" % str(e) - return True, None diff --git a/lib/mail.py b/lib/mail.py deleted file mode 100644 index 57d8e03..0000000 --- a/lib/mail.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding:utf-8 -*- - - -import requests - -from flask import current_app -from flask.ext.mail import Message - -from extensions import mail -from models.account import User - - -def sendmail(users, subject, message, html=False, app=None): - if app: - mail.app = app - else: - app = current_app - recipients = [x.email for x in users if isinstance(x, User)] - recipients.extend( - [x for x in users if isinstance(x, basestring) and '@' in x]) - sender = app.config.get('DEFAULT_MAIL_SENDER') - if html: - msg = Message(recipients=recipients, - html=message, - subject=subject, - sender=sender) - else: - msg = Message(recipients=recipients, - body=message, - subject=subject, - sender=sender) - mail.send(msg) - - -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email.header import Header -from email.mime.image import MIMEImage -import smtplib -import time -from email import Utils - - -def send_mail(sender, receiver, subject, content, ctype="html", pics=(), - smtpserver='mail.51ping.com', - username="networkbench@51ping.com", password="12qwaszx"): - """subject and body are unicode objects""" - if ctype == "html": - msg = MIMEText(content, 'html', 'utf-8') - else: - msg = MIMEText(content, 'plain', 'utf-8') - - if len(pics) != 0: - msgRoot = MIMEMultipart('related') - msgText = MIMEText(content, 'html', 'utf-8') - msgRoot.attach(msgText) - i = 1 - for pic in pics: - fp = open(pic, "rb") - image = MIMEImage(fp.read()) - fp.close() - image.add_header('Content-ID', '' % i) - msgRoot.attach(image) - i += 1 - msg = msgRoot - - msg['Subject'] = Header(subject, 'utf-8') - msg['From'] = sender - msg['To'] = ';'.join(receiver) - msg['Message-ID'] = Utils.make_msgid() - msg['date'] = time.strftime('%a, %d %b %Y %H:%M:%S %z') - - smtp = smtplib.SMTP() - smtp.connect(smtpserver, 25) - smtp.login(username, password) - smtp.sendmail(sender, receiver, msg.as_string()) - smtp.quit() - - -def send_sms(mobile, content): - sms_uri = current_app.config.get("SMS_URI") % (mobile, content) - try: - current_app.logger.info(sms_uri) - requests.get(sms_uri) - except Exception as e: - current_app.logger.error("send sms error, %s" % str(e)) \ No newline at end of file diff --git a/templates/ci_audit_notify.html b/templates/ci_audit_notify.html deleted file mode 100644 index 1a6fd8c..0000000 --- a/templates/ci_audit_notify.html +++ /dev/null @@ -1,51 +0,0 @@ - -
- - - - - - - - - - - - - - {%- for res in result %} - {%- for v in res.get("values") %} - - {%- if res.get("values").index(v) == 0 %} - - {%- endif %} - - - - - - - {%- endfor %} - {%- endfor %} - -
变更设备变更字段原值变更值创建时间
- {{res.get("ci_id")}} - - {{ v.get('attr_name') }} - - {{ v.get('cur_value') }} - - {{ v.get('new_value') }} - - {{ v.get('created_at') }} -
- -
-

- - 查看详情 -

-
-
- From 1b4396bafd0dde7c41366bbc2bc0cc95ea95f2f9 Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 10:03:58 +0800 Subject: [PATCH 009/159] init.... --- core/audit.py | 100 -------------------------------------------------- 1 file changed, 100 deletions(-) delete mode 100644 core/audit.py diff --git a/core/audit.py b/core/audit.py deleted file mode 100644 index 2ebad9e..0000000 --- a/core/audit.py +++ /dev/null @@ -1,100 +0,0 @@ -# -*- coding:utf-8 -*- - -__author__ = 'pycook' - -import urllib - -from flask import Blueprint -from flask import request -from flask import jsonify -from flask import abort - -from lib.audit import CIAuditManager -from lib.utils import get_page -from lib.auth import auth_with_key - - -audit = Blueprint("audit", __name__) - - -@audit.route("", methods=["GET"]) -def get_ci_audits(): - page = get_page(request.values.get("page", 1)) - type_ids = request.values.get("type_ids", "").split(",") - type_ids = map(int, filter(lambda x: x != "", type_ids)) - type_ids = tuple(type_ids) - numfound, total, ci_audits = CIAuditManager().get_cis_for_audits( - page, type_ids) - return jsonify(numfound=numfound, total=total, - page=page, ci_audits=ci_audits) - - -@audit.route("", methods=["POST"]) -@auth_with_key -def create_ci_audit(): - if request.data: - args = dict() - _args = request.data.split("&") - for arg in _args: - if arg: - args[arg.split("=")[0]] = \ - urllib.unquote(urllib.unquote(arg.split("=")[1])) - else: - args = request.values - attr_pairs = dict() - type_name = "" - for k, v in args.items(): - if k == "ci_type": - type_name = v - elif not k.startswith("_"): - attr_pairs[k] = v - ret, res = CIAuditManager().create_ci_audits(type_name=type_name, - attr_pairs=attr_pairs) - if not ret: - return abort(500, res) - return jsonify(code=200) - - -@audit.route("/attribute/", methods=["POST"]) -@auth_with_key -def audit_by_attr(audit_id): - attr_ids = request.values.get("attr_ids", "") - if not attr_ids: - return abort(500, "argument attr_ids is required") - split_tag = filter(lambda x: x in attr_ids, [";", ","]) - attr_value = None - if not split_tag: - attr_value = request.values.get("attr_value") - if attr_value is None: - return abort(500, "argument attr_value is required") - attr_ids = [int(attr_ids)] - else: - attr_ids = attr_ids.split(split_tag[0]) - attr_ids = map(int, attr_ids) - - manager = CIAuditManager() - ret, res = manager.audit_by_attr(audit_id, attr_ids, value=attr_value) - if ret: - return jsonify(code=200) - else: - return abort(500, res) - - -@audit.route("/cis", methods=["POST"]) -@auth_with_key -def audit_by_cis(): - ci_ids = request.values.get("ci_ids", "") - if not ci_ids: - return abort(500, "argument ci_ids is required") - split_tag = filter(lambda x: x in ci_ids, [",", ";"]) - if split_tag: - ci_ids = ci_ids.split(split_tag[0]) - else: - ci_ids = [ci_ids] - ci_ids = map(int, ci_ids) - manager = CIAuditManager() - ret, res = manager.audit_by_cis(ci_ids) - if ret: - return jsonify(code=200) - else: - return abort(500, res) \ No newline at end of file From ac48e1cb19ac2f39df2213ee820445caa1e1b951 Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 10:08:45 +0800 Subject: [PATCH 010/159] delete code line count --- .gitignore | 1 + codeLineCnt.py | 15 --------------- 2 files changed, 1 insertion(+), 15 deletions(-) delete mode 100644 codeLineCnt.py diff --git a/.gitignore b/.gitignore index 1cc6836..57532b8 100755 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ core/special.py lib/special lib/audit* templates/*audit* +codeLin* diff --git a/codeLineCnt.py b/codeLineCnt.py deleted file mode 100644 index 247aa7d..0000000 --- a/codeLineCnt.py +++ /dev/null @@ -1,15 +0,0 @@ -import os -from collections import defaultdict - -d = defaultdict(int) # value is 'int' - -for dirpath, dirnames, filenames in os.walk('.'): - for filename in filenames: - if dirpath.endswith("tools"): - continue - path = os.path.join(dirpath, filename) - ext = os.path.splitext(filename)[1] - d[ext] += len(list(open(path))) - -for ext, n_lines in d.items(): - print ext, n_lines From 6976d183d288f5647cefdd98188fb40e8f422319 Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 10:22:44 +0800 Subject: [PATCH 011/159] delete settings.py --- .gitignore | 1 + config-sample.cfg | 15 +++++++-------- lib/spec_query_sql.py | 3 +++ lib/utils.py | 10 +++++----- settings.py | 7 ------- 5 files changed, 16 insertions(+), 20 deletions(-) create mode 100644 lib/spec_query_sql.py delete mode 100644 settings.py diff --git a/.gitignore b/.gitignore index 57532b8..daa87a1 100755 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ lib/special lib/audit* templates/*audit* codeLin* +lib/spec_* diff --git a/config-sample.cfg b/config-sample.cfg index 88177f4..83f4077 100644 --- a/config-sample.cfg +++ b/config-sample.cfg @@ -19,13 +19,18 @@ CACHE_REDIS_PORT = 6379 CACHE_KEY_PREFIX = "CMDB-API" CACHE_DEFAULT_TIMEOUT = 3000 + # # CI cache -REDIS_HOST = "127.0.0.1" -REDIS_PORT = 6379 REDIS_DB = 0 REDIS_MAX_CONN = 30 +# # queue +CELERY_RESULT_BACKEND = "redis://127.0.0.1//" +BROKER_URL = 'redis://127.0.0.1//' +BROKER_VHOST = '/' + + # # i18n ACCEPT_LANGUAGES = ['en', 'zh'] BABEL_DEFAULT_LOCALE = 'zh' @@ -48,12 +53,6 @@ MAIL_PASSWORD = '' DEFAULT_MAIL_SENDER = '' -# # queue -CELERY_RESULT_BACKEND = "redis://127.0.0.1//" -BROKER_URL = 'redis://127.0.0.1//' -BROKER_VHOST = '/' - - # # pagination PER_PAGE_COUNT_RANGE = (10, 25, 50, 100) DEFAULT_PAGE_COUNT = 25 diff --git a/lib/spec_query_sql.py b/lib/spec_query_sql.py new file mode 100644 index 0000000..8cc488f --- /dev/null +++ b/lib/spec_query_sql.py @@ -0,0 +1,3 @@ +# -*- coding:utf-8 -*- + +__author__ = 'pycook' diff --git a/lib/utils.py b/lib/utils.py index 2a31655..c8bf58f 100644 --- a/lib/utils.py +++ b/lib/utils.py @@ -4,17 +4,17 @@ import redis from flask import current_app -import settings class RedisHandler(object): def __init__(self): + config = current_app.config try: pool = redis.ConnectionPool( - max_connections=settings.REDIS_MAX_CONN, - host=settings.REDIS_HOST, - port=settings.REDIS_PORT, - db=settings.REDIS_DB) + max_connections=config.get("REDIS_MAX_CONN"), + host=config.get("CACHE_REDIS_HOST"), + port=config.get("CACHE_REDIS_PORT"), + db=config.get("REDIS_DB")) self.r = redis.Redis(connection_pool=pool) except Exception as e: print e diff --git a/settings.py b/settings.py deleted file mode 100644 index 9819a83..0000000 --- a/settings.py +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding:utf-8 -*- - -## CI cache -REDIS_HOST = "127.0.0.1" -REDIS_PORT = 6379 -REDIS_DB = 0 -REDIS_MAX_CONN = 30 From bd94bdc575521a09c4f8a235947a1092b65622cf Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 10:26:41 +0800 Subject: [PATCH 012/159] merge --- lib/spec_query_sql.py | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 lib/spec_query_sql.py diff --git a/lib/spec_query_sql.py b/lib/spec_query_sql.py deleted file mode 100644 index 8cc488f..0000000 --- a/lib/spec_query_sql.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding:utf-8 -*- - -__author__ = 'pycook' From eb092d4983d2abfd6981f7d656f3d6efa3bc6cbe Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 11:13:44 +0800 Subject: [PATCH 013/159] fix outside of application context --- __init__.py | 33 +++++++++++++-------------------- extensions.py | 9 ++++++--- gunicornserver.py | 4 ++-- lib/ci.py | 2 +- lib/utils.py | 21 +++++++++++---------- tasks/cmdb.py | 2 +- 6 files changed, 34 insertions(+), 37 deletions(-) diff --git a/__init__.py b/__init__.py index a4d8219..f9df9af 100644 --- a/__init__.py +++ b/__init__.py @@ -1,4 +1,4 @@ -# encoding=utf-8 +# -*- coding: utf-8 -*- import os import logging @@ -11,18 +11,12 @@ from flask import g from flask.ext.babel import Babel from flask.ext.principal import identity_loaded +import core from extensions import db from extensions import mail from extensions import cache from extensions import celery -from core import attribute -from core import citype -from core import cityperelation -from core import cirelation -from core import ci -from core import history -from core import account -from core import special +from extensions import rd from models.account import User from lib.template import filters @@ -30,19 +24,18 @@ from lib.template import filters APP_NAME = "CMDB-API" MODULES = ( - (attribute, "/api/v0.1/attributes"), - (citype, "/api/v0.1/citypes"), - (cityperelation, "/api/v0.1/cityperelations"), - (cirelation, "/api/v0.1/cirelations"), - (ci, "/api/v0.1/ci"), - (history, "/api/v0.1/history"), - (account, "/api/v0.1/accounts"), - (special, ""), + (core.attribute, "/api/v0.1/attributes"), + (core.citype, "/api/v0.1/citypes"), + (core.cityperelation, "/api/v0.1/cityperelations"), + (core.cirelation, "/api/v0.1/cirelations"), + (core.ci, "/api/v0.1/ci"), + (core.history, "/api/v0.1/history"), + (core.account, "/api/v0.1/accounts"), + # (core.special, ""), ) def make_app(config=None, modules=None): - modules = modules if not modules: modules = MODULES app = Flask(APP_NAME) @@ -58,11 +51,11 @@ def make_app(config=None, modules=None): def configure_extensions(app): db.app = app - celery.init_app(app) db.init_app(app) mail.init_app(app) cache.init_app(app) celery.init_app(app) + rd.init_app(app) def configure_i18n(app): @@ -97,7 +90,7 @@ def configure_logging(app): app.config['MAIL_SERVER'], app.config['DEFAULT_MAIL_SENDER'], app.config['ADMINS'], - '[%s] CMDB error' % hostname, + '[%s] CMDB API error' % hostname, ( app.config['MAIL_USERNAME'], app.config['MAIL_PASSWORD'], diff --git a/extensions.py b/extensions.py index 5dfb606..176c96c 100644 --- a/extensions.py +++ b/extensions.py @@ -1,4 +1,4 @@ -# encoding=utf-8 +# -*- coding: utf-8 -*- from flask.ext.mail import Mail @@ -6,11 +6,14 @@ from flask.ext.sqlalchemy import SQLAlchemy from flask.ext.cache import Cache from flask.ext.celery import Celery +from lib.utils import RedisHandler -__all__ = ['mail', 'db', 'cache', 'celery'] + +__all__ = ['mail', 'db', 'cache', 'celery', "rd"] mail = Mail() db = SQLAlchemy() cache = Cache() -celery = Celery() \ No newline at end of file +celery = Celery() +rd = RedisHandler() \ No newline at end of file diff --git a/gunicornserver.py b/gunicornserver.py index 6c5feab..996804e 100644 --- a/gunicornserver.py +++ b/gunicornserver.py @@ -1,4 +1,4 @@ -# encoding=utf-8 +# -*- coding: utf-8 -*- from flask_script import Command, Option @@ -7,7 +7,7 @@ class GunicornServer(Command): description = 'Run the app within Gunicorn' def __init__(self, host='127.0.0.1', port=5000, workers=8, - worker_class="gevent", daemon=False): + worker_class="sync", daemon=False): self.port = port self.host = host self.workers = workers diff --git a/lib/ci.py b/lib/ci.py index a6282b0..28e5f91 100644 --- a/lib/ci.py +++ b/lib/ci.py @@ -11,6 +11,7 @@ from flask import abort from sqlalchemy import or_ from extensions import db +from extensions import rd from models.ci import CI from models.ci_relation import CIRelation from models.ci_type import CITypeAttribute @@ -28,7 +29,6 @@ from lib.query_sql import QUERY_HOSTS_NUM_BY_BU from lib.query_sql import QUERY_HOSTS_NUM_BY_PROJECT from lib.query_sql import QUERY_CIS_BY_IDS from lib.query_sql import QUERY_CIS_BY_VALUE_TABLE -from lib.utils import rd from tasks.cmdb import ci_cache from tasks.cmdb import ci_delete diff --git a/lib/utils.py b/lib/utils.py index c8bf58f..944a6d1 100644 --- a/lib/utils.py +++ b/lib/utils.py @@ -7,8 +7,12 @@ from flask import current_app class RedisHandler(object): - def __init__(self): - config = current_app.config + def __init__(self, flask_app=None): + self.flask_app = flask_app + + def init_app(self, app): + self.flask_app = app + config = self.flask_app.config try: pool = redis.ConnectionPool( max_connections=config.get("REDIS_MAX_CONN"), @@ -17,14 +21,13 @@ class RedisHandler(object): db=config.get("REDIS_DB")) self.r = redis.Redis(connection_pool=pool) except Exception as e: - print e current_app.logger.error("init redis connection failed") - @classmethod - def instance(cls): - if not hasattr(cls, "_instance"): - cls._instance = cls() - return cls._instance + # @classmethod + # def instance(cls): + # if not hasattr(cls, "_instance"): + # cls._instance = cls() + # return cls._instance def get(self, ci_ids, key="CMDB_CI"): try: @@ -51,8 +54,6 @@ class RedisHandler(object): except Exception as e: current_app.logger.error("delete redis key error, %s" % str(e)) -rd = RedisHandler.instance() - def get_page(page): try: diff --git a/tasks/cmdb.py b/tasks/cmdb.py index 11f5cbe..45a13e1 100644 --- a/tasks/cmdb.py +++ b/tasks/cmdb.py @@ -8,7 +8,7 @@ from flask import current_app from extensions import celery from extensions import db -from lib.utils import rd +from extensions import rd import lib.ci From 3385b123081b48df66908191f3b7ef5e0e63b5fd Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 11:26:51 +0800 Subject: [PATCH 014/159] README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8fd6703..ced09e7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ ## cmdb ### cmdb即配置管理数据库 -### 目前只发布api部分,安装脚本和portal计划很快push \ No newline at end of file +### 该部分为API,Portal即将单独开源 \ No newline at end of file From 41cbc1e5b8b9372d669f6c0d81b333cfd160c5c7 Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 1 Jan 2016 11:32:29 +0800 Subject: [PATCH 015/159] fix --- .gitignore | 5 +---- core/__init__.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index daa87a1..f76ea86 100755 --- a/.gitignore +++ b/.gitignore @@ -2,11 +2,8 @@ *.pyc .idea data -logs -*/logs/* -*.sql -deploy.sh logs/* +*.sql test/* tools/* cmdb_agent/* diff --git a/core/__init__.py b/core/__init__.py index 99d8104..203368d 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -8,4 +8,4 @@ from ci_relation import cirelation from ci import ci from history import history from account import account -from special import special \ No newline at end of file +# from special import special \ No newline at end of file From b3d5557bc7a52a23fb0aaa31fabc71edf955c5b8 Mon Sep 17 00:00:00 2001 From: pycook Date: Thu, 7 Jan 2016 14:10:55 +0800 Subject: [PATCH 016/159] fix --- __init__.py | 3 ++- core/attribute.py | 3 ++- lib/attribute.py | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/__init__.py b/__init__.py index f9df9af..62a98b8 100644 --- a/__init__.py +++ b/__init__.py @@ -10,6 +10,7 @@ from flask import request from flask import g from flask.ext.babel import Babel from flask.ext.principal import identity_loaded +from flask.ext.principal import Principal import core from extensions import db @@ -78,7 +79,7 @@ def configure_blueprints(app, modules): def configure_identity(app): - + principal = Principal(app) @identity_loaded.connect_via(app) def on_identity_loaded(sender, identity): g.user = User.query.from_identity(identity) diff --git a/core/attribute.py b/core/attribute.py index edff09e..fd1aa54 100644 --- a/core/attribute.py +++ b/core/attribute.py @@ -104,7 +104,8 @@ def delete_attribute(attr_id=None): @attribute.route("/citype/", methods=["GET"]) def get_attributes_by_type(type_id=None): manager = CITypeAttributeManager() - from models.cmdb import CITypeCache, CIAttributeCache + from models.attribute import CIAttributeCache + from models.ci_type import CITypeCache t = CITypeCache.get(type_id) if not t: diff --git a/lib/attribute.py b/lib/attribute.py index 19e889d..dd6f6ca 100644 --- a/lib/attribute.py +++ b/lib/attribute.py @@ -152,6 +152,7 @@ class AttributeManager(object): choice_table = type_map["choice"].get(attr.value_type) db.session.query(choice_table).filter( choice_table.attr_id == attr_id).delete() + db.session.flush() name = attr.attr_name CIAttributeCache.clean(attr) db.session.delete(attr) From f15726876c47a1dd79740c045046abfa5dc89848 Mon Sep 17 00:00:00 2001 From: pycook Date: Tue, 12 Apr 2016 13:54:09 +0800 Subject: [PATCH 017/159] facet query fix --- __init__.py | 2 +- core/__init__.py | 2 +- core/attribute.py | 10 ++++++++-- core/ci.py | 29 ++++++++++++++++++++++++++++- core/ci_type.py | 2 +- lib/auth.py | 12 ++++++------ lib/ci.py | 45 ++++++++++++++++++++++++++++++++++++--------- lib/ci_type.py | 1 + lib/query_sql.py | 4 ++-- lib/search.py | 17 +++++++++++++++++ models/ci_type.py | 1 + 11 files changed, 102 insertions(+), 23 deletions(-) diff --git a/__init__.py b/__init__.py index 62a98b8..94f505e 100644 --- a/__init__.py +++ b/__init__.py @@ -32,7 +32,7 @@ MODULES = ( (core.ci, "/api/v0.1/ci"), (core.history, "/api/v0.1/history"), (core.account, "/api/v0.1/accounts"), - # (core.special, ""), + (core.special, ""), ) diff --git a/core/__init__.py b/core/__init__.py index 203368d..99d8104 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -8,4 +8,4 @@ from ci_relation import cirelation from ci import ci from history import history from account import account -# from special import special \ No newline at end of file +from special import special \ No newline at end of file diff --git a/core/attribute.py b/core/attribute.py index fd1aa54..1d79a7b 100644 --- a/core/attribute.py +++ b/core/attribute.py @@ -102,15 +102,21 @@ def delete_attribute(attr_id=None): @attribute.route("/citype/", methods=["GET"]) -def get_attributes_by_type(type_id=None): +@attribute.route("/citype/", methods=["GET"]) +def get_attributes_by_type(type_id=None, type_name=None): manager = CITypeAttributeManager() from models.attribute import CIAttributeCache from models.ci_type import CITypeCache + from models.ci_type import CITypeAttributeCache t = CITypeCache.get(type_id) if not t: - return abort(400, "CIType {0} is not existed".format(type_id)) + t = CITypeCache.get(type_name) + if not t: + return abort(400, "CIType {0} is not existed".format(type_id)) + type_id = t.type_id uniq_id = t.uniq_id + CITypeAttributeCache.clean(type_id) unique = CIAttributeCache.get(uniq_id).attr_name return jsonify(attributes=manager.get_attributes_by_type_id(type_id), type_id=type_id, uniq_id=uniq_id, unique=unique) diff --git a/core/ci.py b/core/ci.py index 151e0aa..3f13eae 100644 --- a/core/ci.py +++ b/core/ci.py @@ -16,6 +16,7 @@ from flask import abort from lib.auth import auth_with_key from lib.ci import CIManager +from lib.ci import HostNumStatis from lib.search import Search from lib.search import SearchError from lib.utils import get_page @@ -156,6 +157,14 @@ def update_ci(): return jsonify(ci_id=ci_id) +@ci.route("//unique", methods=["PUT"]) +@auth_with_key +def update_ci_unique(ci_id): + m = CIManager() + m.update_unique_value(ci_id, request.values) + return jsonify(ci_id=ci_id) + + @ci.route("/", methods=["DELETE"]) @auth_with_key def delete_ci(ci_id=None): @@ -186,4 +195,22 @@ def get_heartbeat(): numfound, result = CIManager().get_heartbeat(page, ci_type, agent_status=agent_status) - return jsonify(numfound=numfound, result=result) \ No newline at end of file + return jsonify(numfound=numfound, result=result) + + +######################### just for frontend ################################### + +@ci.route("/hosts/nums", methods=["GET"]) +def get_hosts_nums(): + ci_type = request.args.get("ci_type", "").strip() + ci_ids = request.args.get("ci_ids", "").strip() + ci_id_list = ci_ids.split(",") + ci_id_list = map(str, filter(lambda x: x != "", ci_id_list)) + res = {} + if ci_type == "bu": + res = HostNumStatis().get_hosts_by_bu(ci_id_list) + elif ci_type == "product": + res = HostNumStatis().get_hosts_by_product(ci_id_list) + elif ci_type == "project": + res = HostNumStatis().get_hosts_by_project(ci_id_list) + return jsonify(hosts=res) \ No newline at end of file diff --git a/core/ci_type.py b/core/ci_type.py index 85efa12..18aa23c 100644 --- a/core/ci_type.py +++ b/core/ci_type.py @@ -86,4 +86,4 @@ def enable(type_id=None): enable = request.values.get("enable", True) manager = CITypeManager() manager.set_enabled(type_id, enabled=enable) - return jsonify(type_id=type_id) \ No newline at end of file + return jsonify(type_id=type_id) diff --git a/lib/auth.py b/lib/auth.py index ce43d43..5a00b83 100644 --- a/lib/auth.py +++ b/lib/auth.py @@ -18,10 +18,10 @@ from models.account import UserCache def auth_with_key(func): @wraps(func) def wrapper(*args, **kwargs): - if isinstance(getattr(g, 'user', None), User): - identity_changed.send(current_app._get_current_object(), - identity=Identity(g.user.uid)) - return func(*args, **kwargs) + # if isinstance(getattr(g, 'user', None), User): + # identity_changed.send(current_app._get_current_object(), + # identity=Identity(g.user.uid)) + # return func(*args, **kwargs) ip = request.remote_addr if request.data: request_args = dict() @@ -46,7 +46,7 @@ def auth_with_key(func): else: identity_changed.send(current_app._get_current_object(), identity=AnonymousIdentity()) - return abort(400, "invalid _key and _secret") + return abort(401, "invalid _key and _secret") path = request.path @@ -63,6 +63,6 @@ def auth_with_key(func): else: identity_changed.send(current_app._get_current_object(), identity=AnonymousIdentity()) - return abort(400, "invalid _key and _secret") + return abort(401, "invalid _key and _secret") return wrapper diff --git a/lib/ci.py b/lib/ci.py index 28e5f91..e34be25 100644 --- a/lib/ci.py +++ b/lib/ci.py @@ -140,16 +140,16 @@ class CIManager(object): abort(404, "CIType {0} is not existed".format(ci_type_name)) unique_key = CIAttributeCache.get(ci_type.uniq_id) \ - or abort(500, 'illegality unique attribute') + or abort(400, 'illegality unique attribute') unique = ci_dict.get(unique_key.attr_name) \ - or abort(500, '{0} missing'.format(unique_key.attr_name)) + or abort(400, '{0} missing'.format(unique_key.attr_name)) old_ci = self.ci_is_exist(ci_type, unique_key, unique) if old_ci is not None: ci_existed = True if exist_policy == 'reject': - return abort(500, 'CI is existed') + return abort(400, 'CI is existed') if old_ci.type_id != ci_type.type_id: # update ci_type old_ci.type_id = ci_type.type_id db.session.add(old_ci) @@ -169,7 +169,7 @@ class CIManager(object): except Exception as e: db.session.rollback() current_app.logger.error('add CI error: {0}'.format(str(e))) - return abort(500, 'add CI error') + return abort(400, 'add CI error') value_manager = AttributeValueManager() histories = list() for p, v in ci_dict.items(): @@ -182,7 +182,7 @@ class CIManager(object): if not ci_existed: self.delete(ci.ci_id) current_app.logger.info(res) - return abort(500, res) + return abort(400, res) if res is not None: histories.append(res) try: @@ -192,12 +192,39 @@ class CIManager(object): db.session.rollback() if not ci_existed: # only add self.delete(ci.ci_id) - return abort(500, "add CI error") + return abort(400, "add CI error") his_manager = CIAttributeHistoryManger() his_manager.add(ci.ci_id, histories) ci_cache.apply_async([ci.ci_id], queue="cmdb_async") return ci.ci_id + def update_unique_value(self, ci_id, args): + ci = self.get_ci_by_id(ci_id, need_children=False) + unique_key = ci.get("unique") + attr = CIAttributeCache.get(unique_key) + table_key = "index_{0}".format(attr.value_type) \ + if attr.is_index else attr.value_type + value_table = type_map.get("table").get(table_key) + v = args.get(unique_key) + if value_table and v: + item = db.session.query(value_table).filter( + value_table.ci_id == ci_id).filter( + value_table.attr_id == attr.attr_id).first() + if item: + converter = type_map.get("converter").get(attr.value_type) + try: + item.value = converter(v) + except: + return abort(400, "value is illegal") + db.session.add(item) + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error(str(e)) + return abort(400, "update unique failed") + ci_cache.apply_async([ci_id], queue="cmdb_async") + def delete(self, ci_id): ci = db.session.query(CI).filter(CI.ci_id == ci_id).first() if ci is not None: @@ -224,7 +251,7 @@ class CIManager(object): except Exception as e: db.session.rollback() current_app.logger.error("delete CI error, {0}".format(str(e))) - return abort(500, "delete CI error, {0}".format(str(e))) + return abort(400, "delete CI error, {0}".format(str(e))) # TODO: write history ci_delete.apply_async([ci.ci_id], queue="cmdb_async") return ci_id @@ -485,7 +512,7 @@ class CIRelationManager(object): db.session.rollback() current_app.logger.error("add CIRelation is error, {0}".format( str(e))) - return abort(500, "add CIRelation is error, {0}".format(str(e))) + return abort(400, "add CIRelation is error, {0}".format(str(e))) # write history his_manager = CIRelationHistoryManager() his_manager.add(cr.cr_id, cr.first_ci_id, cr.second_ci_id, @@ -507,7 +534,7 @@ class CIRelationManager(object): current_app.logger.error( "delete CIRelation is error, {0}".format(str(e))) return abort( - 500, "delete CIRelation is error, {0}".format(str(e))) + 400, "delete CIRelation is error, {0}".format(str(e))) his_manager = CIRelationHistoryManager() his_manager.add(cr_id, first_ci, second_ci, cr.relation_type, operate_type="delete") diff --git a/lib/ci_type.py b/lib/ci_type.py index 728beed..51f70ca 100644 --- a/lib/ci_type.py +++ b/lib/ci_type.py @@ -30,6 +30,7 @@ class CITypeAttributeManager(object): for attr in attrs: attr_dict = attr_manager.get_attribute_by_id(attr.attr_id) attr_dict["is_required"] = attr.is_required + attr_dict["order"] = attr.order result.append(attr_dict) return result diff --git a/lib/query_sql.py b/lib/query_sql.py index 960f02b..66e89b1 100644 --- a/lib/query_sql.py +++ b/lib/query_sql.py @@ -88,9 +88,9 @@ FACET_QUERY = """ SELECT {0}.value, count({0}.ci_id) FROM {0} - INNER JOIN ({1}) AS B ON B.ci_id={0}.ci_id + INNER JOIN ({1}) AS F ON F.ci_id={0}.ci_id WHERE {0}.attr_id={2:d} - GROUP BY {0}.ci_id + GROUP BY {0}.value """ QUERY_CI_BY_ATTR_NAME = """ diff --git a/lib/search.py b/lib/search.py index 341950d..72e9b21 100644 --- a/lib/search.py +++ b/lib/search.py @@ -139,6 +139,12 @@ class Search(object): "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( (self.page - 1) * self.count, sort_type, self.count)) elif self.type_id_list: + self.query_sql = """SELECT B.ci_id + FROM ({0}) AS B {1}""".format( + query_sql, + "INNER JOIN cis on cis.ci_id=B.ci_id " + "WHERE cis.type_id in ({0}) ".format( + ",".join(self.type_id_list))) return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id FROM ({0}) AS B {1}""".format( query_sql, @@ -148,6 +154,10 @@ class Search(object): (self.page - 1) * self.count, sort_type, self.count, ",".join(self.type_id_list))) else: + self.query_sql = """SELECT B.ci_id + FROM ({0}) AS B {1}""".format( + query_sql, + "INNER JOIN cis on cis.ci_id=B.ci_id ") return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id FROM ({0}) AS B {1}""".format( query_sql, @@ -172,6 +182,12 @@ class Search(object): (self.page - 1) * self.count, sort_type, self.count) elif self.type_id_list: + self.query_sql = """SELECT C.ci_id + FROM ({0}) AS C + INNER JOIN cis on cis.ci_id=C.ci_id + WHERE cis.type_id in ({1})""".format( + new_table, + ",".join(self.type_id_list)) return """SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id FROM ({0}) AS C INNER JOIN cis on cis.ci_id=C.ci_id @@ -306,6 +322,7 @@ class Search(object): table_name = TableMap(attr_name=k).table_name query_sql = FACET_QUERY.format( table_name, self.query_sql, attr.attr_id) + current_app.logger.debug(query_sql) result = db.session.execute(query_sql).fetchall() facet[k] = result facet_result = dict() diff --git a/models/ci_type.py b/models/ci_type.py index a995c82..7ec4e78 100644 --- a/models/ci_type.py +++ b/models/ci_type.py @@ -30,6 +30,7 @@ class CITypeAttribute(db.Model): db.ForeignKey("ci_attributes.attr_id"), primary_key=True) is_required = db.Column(db.Boolean, default=False) + order = db.Column(db.Integer, default=0) __table_args__ = (db.UniqueConstraint("type_id", "attr_id", name="type_attr_uniq"), ) From 60233101edd4d65f2d8ccbf74f2f118a787bce6c Mon Sep 17 00:00:00 2001 From: pycook Date: Tue, 19 Apr 2016 10:38:29 +0800 Subject: [PATCH 018/159] pep 8 --- lib/auth.py | 4 ---- lib/search.py | 4 ++-- models/__init__.py | 13 +------------ 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/lib/auth.py b/lib/auth.py index 5a00b83..7147e78 100644 --- a/lib/auth.py +++ b/lib/auth.py @@ -18,10 +18,6 @@ from models.account import UserCache def auth_with_key(func): @wraps(func) def wrapper(*args, **kwargs): - # if isinstance(getattr(g, 'user', None), User): - # identity_changed.send(current_app._get_current_object(), - # identity=Identity(g.user.uid)) - # return func(*args, **kwargs) ip = request.remote_addr if request.data: request_args = dict() diff --git a/lib/search.py b/lib/search.py index 72e9b21..fc9c997 100644 --- a/lib/search.py +++ b/lib/search.py @@ -9,7 +9,7 @@ from lib.const import TableMap from models.attribute import CIAttributeCache from models.ci_type import CITypeCache from extensions import db -from models import CI +from models.ci import CI from lib.ci import get_cis_by_ids from lib.query_sql import FACET_QUERY from lib.query_sql import QUERY_CI_BY_TYPE @@ -362,4 +362,4 @@ class Search(object): counter[ci_type] = 0 counter[ci_type] += 1 total = len(response) - return response, counter, total, self.page, numfound, facet \ No newline at end of file + return response, counter, total, self.page, numfound, facet diff --git a/models/__init__.py b/models/__init__.py index b5f28a6..a28cb5d 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -10,15 +10,4 @@ def row2dict(row): d[c.name] = getattr(row, c.name).strftime("%Y-%m-%d %H:%M:%S") else: d[c.name] = getattr(row, c.name) - return d - - -from account import * -from attribute import * -from ci import * -from ci_relation import * -from ci_type import * -from ci_type_relation import * -from ci_value import * -from history import * -from statis import * + return d \ No newline at end of file From 99870b33deb54f78a7424d001f08677c2a5d93bc Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 27 Apr 2016 17:38:21 +0800 Subject: [PATCH 019/159] models Enum type fix --- models/__init__.py | 2 +- models/attribute.py | 1 - models/ci.py | 5 ++--- models/ci_relation.py | 4 ++-- models/ci_type_relation.py | 1 - models/history.py | 11 +++++------ 6 files changed, 10 insertions(+), 14 deletions(-) diff --git a/models/__init__.py b/models/__init__.py index a28cb5d..f18317d 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -8,6 +8,6 @@ def row2dict(row): (basestring, long, int, float, list, tuple, dict)) \ and getattr(row, c.name): d[c.name] = getattr(row, c.name).strftime("%Y-%m-%d %H:%M:%S") - else: + elif c.name not in ("password", "secret"): d[c.name] = getattr(row, c.name) return d \ No newline at end of file diff --git a/models/attribute.py b/models/attribute.py index fbc5c0b..1f5081f 100644 --- a/models/attribute.py +++ b/models/attribute.py @@ -10,7 +10,6 @@ class CIAttribute(db.Model): attr_name = db.Column(db.String(32), nullable=False, unique=True) attr_alias = db.Column(db.String(32), nullable=False, unique=True) value_type = db.Column( - db.String(8), db.Enum("int", "float", "text", "datetime", name='value_type'), default="text", nullable=False) diff --git a/models/ci.py b/models/ci.py index b4ee4cf..ab1a897 100644 --- a/models/ci.py +++ b/models/ci.py @@ -14,7 +14,6 @@ class CI(db.Model): db.ForeignKey("ci_types.type_id"), nullable=False) ci_type = db.relationship("CIType", backref="cis") - status = db.Column(db.String(8), - db.Enum("review", "validate", name="stauts")) + status = db.Column(db.Enum("review", "validate", name="status")) created_time = db.Column(db.DateTime, default=datetime.datetime.now()) - heartbeat = db.Column(db.DateTime, default=datetime.datetime.now()) \ No newline at end of file + heartbeat = db.Column(db.DateTime, default=datetime.datetime.now()) diff --git a/models/ci_relation.py b/models/ci_relation.py index 6a347ea..10585c9 100644 --- a/models/ci_relation.py +++ b/models/ci_relation.py @@ -18,8 +18,8 @@ class CIRelation(db.Model): second_ci = db.relationship( "CI", primaryjoin="CI.ci_id==CIRelation.second_ci_id") relation_type = db.Column( - db.String(8), db.Enum("connect", "deploy", "install", "contain", - name="relation_type"), nullable=False) + db.Enum("connect", "deploy", "install", "contain", + name="relation_type"), nullable=False) more = db.Column(db.Integer, db.ForeignKey("cis.ci_id")) __table_args__ = (db.UniqueConstraint("first_ci_id", "second_ci_id", diff --git a/models/ci_type_relation.py b/models/ci_type_relation.py index cde0486..b36509f 100644 --- a/models/ci_type_relation.py +++ b/models/ci_type_relation.py @@ -18,7 +18,6 @@ class CITypeRelation(db.Model): child = db.relationship( "CIType", primaryjoin="CIType.type_id==CITypeRelation.child_id") relation_type = db.Column( - db.String(7), db.Enum("contain", "connect", "deploy", "install", name="relation_type"), default="contain") diff --git a/models/history.py b/models/history.py index 8fb9e7a..e0bf10a 100644 --- a/models/history.py +++ b/models/history.py @@ -23,8 +23,8 @@ class CIAttributeHistory(db.Model): __tablename__ = "histories" h_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - operate_type = db.Column(db.String(6), db.Enum("add", "delete", "update", - name="operate_type")) + operate_type = db.Column(db.Enum("add", "delete", "update", + name="operate_type")) record_id = db.Column(db.Integer, db.ForeignKey("records.record_id"), nullable=False) @@ -38,14 +38,13 @@ class CIRelationHistory(db.Model): __tablename__ = "relation_histories" rh_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - operate_type = db.Column(db.String(6), - db.Enum("add", "delete", name="operate_type")) + operate_type = db.Column(db.Enum("add", "delete", name="operate_type")) record_id = db.Column(db.Integer, db.ForeignKey("records.record_id"), nullable=False) first_ci_id = db.Column(db.Integer) second_ci_id = db.Column(db.Integer) relation_type = db.Column( - db.String(8), db.Enum("connect", "deploy", "install", "contain", - name="relation_type")) + db.Enum("connect", "deploy", "install", "contain", + name="relation_type")) relation = db.Column(db.Integer, nullable=False) From 89fa687bba22cfb84d1cdf5783c4383d207f1265 Mon Sep 17 00:00:00 2001 From: pycook Date: Mon, 27 Jun 2016 10:46:04 +0800 Subject: [PATCH 020/159] delete ci... --- lib/ci.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ci.py b/lib/ci.py index e34be25..f69991f 100644 --- a/lib/ci.py +++ b/lib/ci.py @@ -241,8 +241,8 @@ class CIManager(object): CIRelation.first_ci_id == ci_id).delete() db.session.query(CIRelation).filter( CIRelation.second_ci_id == ci_id).delete() - db.session.query(CIAttributeHistory).filter( - CIAttributeHistory.ci_id == ci_id).delete() + # db.session.query(CIAttributeHistory).filter( + # CIAttributeHistory.ci_id == ci_id).delete() db.session.flush() db.session.delete(ci) @@ -252,7 +252,7 @@ class CIManager(object): db.session.rollback() current_app.logger.error("delete CI error, {0}".format(str(e))) return abort(400, "delete CI error, {0}".format(str(e))) - # TODO: write history + # todo: write history ci_delete.apply_async([ci.ci_id], queue="cmdb_async") return ci_id return abort(404, "CI {0} not found".format(ci_id)) From ccc4bb48fa9bc4b16e9f4bf594dfb6dbfdeffb15 Mon Sep 17 00:00:00 2001 From: pycook Date: Mon, 27 Jun 2016 10:50:32 +0800 Subject: [PATCH 021/159] pep8 --- core/__init__.py | 2 +- lib/const.py | 4 +- lib/value.py | 2 +- nohup.out | 17549 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 17554 insertions(+), 3 deletions(-) create mode 100644 nohup.out diff --git a/core/__init__.py b/core/__init__.py index 99d8104..218d127 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -8,4 +8,4 @@ from ci_relation import cirelation from ci import ci from history import history from account import account -from special import special \ No newline at end of file +from special import special diff --git a/lib/const.py b/lib/const.py index 51409a4..ee25660 100644 --- a/lib/const.py +++ b/lib/const.py @@ -3,6 +3,8 @@ import datetime +from markupsafe import escape + from models.attribute import TextChoice from models.attribute import FloatChoice from models.attribute import IntegerChoice @@ -39,7 +41,7 @@ type_map = { 'converter': { 'int': string2int, 'float': float, - 'text': unicode, + 'text': escape, 'datetime': str2datetime, }, 'choice': { diff --git a/lib/value.py b/lib/value.py index f9916f7..4c98469 100644 --- a/lib/value.py +++ b/lib/value.py @@ -167,4 +167,4 @@ class AttributeValueManager(object): return True, (attr.attr_id, "update", old_value, value) else: return True, None - return True, (attr.attr_id, "add", None, value) \ No newline at end of file + return True, (attr.attr_id, "add", None, value) diff --git a/nohup.out b/nohup.out new file mode 100644 index 0000000..70f71a7 --- /dev/null +++ b/nohup.out @@ -0,0 +1,17549 @@ + * Running on http://127.0.0.1:5000/ + * Restarting with reloader +127.0.0.1 - - [04/May/2016 09:32:53] "GET /api/v0.1/citypes/test HTTP/1.1" 404 - +127.0.0.1 - - [04/May/2016 09:32:53] "GET /favicon.ico HTTP/1.1" 404 - +127.0.0.1 - - [04/May/2016 09:33:05] "GET /api/v0.1/citypes/test HTTP/1.1" 404 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00168991088867 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.0010130405426 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00322699546814 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.198438882828 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 10:08:34] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0014021396637 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000633001327515 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00225591659546 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0042040348053 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 10:08:49] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00191187858582 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00113415718079 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00333905220032 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.313664913177 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 13:10:32] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - + * Detected change in '/Users/pycook/PycharmProjects/cmdb-api/lib/const.py', reloading +Engine(mysql+pymysql://root:12qwaszx@127.0.0.1:3306/cmdb?charset=utf8) + * Restarting with reloader +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'sn': u'test', 'private_ip': u'\u6211\u4e48'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 15:46:45] "POST /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [04/May/2016 15:47:34] "GET /api/v0.1/ci/11238 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0506961345673 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.0010027885437 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0520710945129 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.18240404129 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 15:57:24] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.000910043716431 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000577926635742 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00169992446899 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0425431728363 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 16:45:26] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00154399871826 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000653028488159 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00249695777893 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0680940151215 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:17:25] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00356793403625 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00132894515991 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00535202026367 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.010763168335 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:23:38] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0264749526978 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.0010461807251 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0278940200806 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0366520881653 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:24:26] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0019371509552 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00100803375244 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00320816040039 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00779008865356 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:28:12] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00407910346985 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00105810165405 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00563716888428 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0106608867645 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:29:17] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00188398361206 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000676155090332 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00281691551208 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00757098197937 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:29:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0039210319519 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00129199028015 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00571703910828 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0124680995941 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:30:41] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00422286987305 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00146913528442 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00628805160522 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0118639469147 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:30:56] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00198101997375 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000663995742798 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00293016433716 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00727486610413 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:31:07] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00292706489563 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00109195709229 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00443601608276 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00992894172668 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:31:40] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00206089019775 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000764131546021 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00310897827148 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00736784934998 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:32:04] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00242686271667 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000970125198364 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0039119720459 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00997400283813 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:32:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00192189216614 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000703096389771 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0028760433197 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00708293914795 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:33:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00278306007385 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000799894332886 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00387978553772 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00937294960022 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:34:47] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0021390914917 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000871896743774 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00348711013794 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00840711593628 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:34:55] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00194406509399 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000855922698975 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00313210487366 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00801920890808 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:35:21] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00188088417053 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000905990600586 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0031201839447 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00819301605225 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:35:30] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00329399108887 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.001384973526 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00519394874573 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0122549533844 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:36:59] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00400114059448 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00180196762085 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00640606880188 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0205891132355 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:37:59] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00472283363342 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.0011990070343 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00637793540955 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0111930370331 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:41:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00413990020752 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00175905227661 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00669693946838 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0142269134521 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:42:24] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00310206413269 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00144004821777 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0050220489502 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0119028091431 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:42:52] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00410795211792 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00157308578491 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00650787353516 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.014965057373 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:43:29] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00244402885437 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000788927078247 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00356388092041 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00857877731323 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:43:50] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00294017791748 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.0016758441925 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00509810447693 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0121698379517 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:43:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00237703323364 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00112318992615 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00380516052246 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00930500030518 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:44:22] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00446009635925 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00140905380249 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00650596618652 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0161590576172 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:45:17] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0027129650116 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00136399269104 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00454807281494 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0110859870911 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:45:20] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00222182273865 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00100207328796 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00354790687561 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0103268623352 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 17:59:59] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00243282318115 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000861167907715 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00357699394226 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0442547798157 +-------------------------------------------------------------------------------- +127.0.0.1 - - [04/May/2016 18:31:06] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00129294395447 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000882148742676 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00257706642151 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.142752885818 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 17:24:50] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00185298919678 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000818014144897 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0030369758606 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00541496276855 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 17:25:36] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00154495239258 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000635147094727 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00250387191772 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.051069021225 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 17:27:08] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00217890739441 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00059700012207 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00302195549011 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00492405891418 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 17:36:08] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00218796730042 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.0010449886322 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00360012054443 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00551700592041 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 17:39:35] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00260400772095 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000864028930664 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00382113456726 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0411348342896 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:14:33] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00181007385254 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000784873962402 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00294995307922 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0173177719116 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:14:47] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00204801559448 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00113201141357 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00355219841003 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00924301147461 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:16:25] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00280618667603 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00119185447693 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00445604324341 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00995492935181 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:17:35] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0018470287323 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00067400932312 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00275993347168 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00680994987488 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:18:20] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00179600715637 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000636100769043 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00266981124878 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00681519508362 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:19:32] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0039370059967 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000799894332886 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0049901008606 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00932097434998 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:20:20] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00290489196777 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00122117996216 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00456190109253 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0095009803772 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:21:55] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00276899337769 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00116801261902 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00424194335938 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00968599319458 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:23:57] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0019679069519 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000694990158081 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00290894508362 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00722193717957 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:24:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00294184684753 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000672101974487 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00388193130493 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0430560112 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:26:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00246095657349 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.0010130405426 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00382304191589 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00915908813477 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:27:01] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00193095207214 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000999212265015 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00324487686157 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00796294212341 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:28:00] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00185894966125 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000678062438965 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0028121471405 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0375330448151 +-------------------------------------------------------------------------------- +127.0.0.1 - - [05/May/2016 18:31:28] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +127.0.0.1 - - [05/May/2016 18:31:36] "GET /api/v0.1/attributes/idc?_key=20c4773dece64394bce23d074d19e609&_secret=65fb0aadbaf2f7bbcc693e66651a971694fb13ec HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0356650352478 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.0346050262451 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0706639289856 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.334421873093 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.0102000236511 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :1.34820795059 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 14:25:02] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00253105163574 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00127005577087 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00412607192993 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0394840240479 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00411605834961 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0525629520416 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 14:25:03] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00180196762085 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00066089630127 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00267100334167 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.03528881073 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00451993942261 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0451531410217 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 14:25:38] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00155186653137 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000653028488159 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00251293182373 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0830659866333 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:23:15] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00237798690796 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000860929489136 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0034921169281 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00814914703369 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:23:34] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00210309028625 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00123381614685 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00372314453125 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00819706916809 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:23:36] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00262212753296 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000769853591919 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00373816490173 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00808191299438 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:31:06] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00188302993774 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000674962997437 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0027961730957 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00756907463074 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:32:16] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00438594818115 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000910997390747 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0057909488678 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0372879505157 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:37:36] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00378322601318 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000932931900024 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00506496429443 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.110025167465 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:53:43] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0021870136261 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000694036483765 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00321102142334 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00901317596436 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:54:32] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00182700157166 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000674962997437 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00275182723999 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00668287277222 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:55:56] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00242185592651 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000854015350342 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00357508659363 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00892615318298 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:56:39] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00207710266113 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00077486038208 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00311899185181 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00812101364136 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:57:06] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00185489654541 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000639915466309 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0027289390564 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.007404088974 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:57:26] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.005126953125 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00113391876221 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00704193115234 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0435559749603 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 16:59:14] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00351214408875 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00133395195007 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00542497634888 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0134720802307 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 17:03:53] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00596499443054 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00145888328552 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00791692733765 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0145330429077 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 17:04:34] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'private_ip:10.201.100.40\n10.201.100.43', u'-ctc_ip:10.201.100.40\n10.201.100.43', u'-cmc_ip:10.201.100.40\n10.201.100.43', u'-cnc_ip:10.201.100.40\n10.201.100.43'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +10.201.100.40 +10.201.100.43 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +10.201.100.40 +10.201.100.43 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +10.201.100.40 +10.201.100.43 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +10.201.100.40 +10.201.100.43 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=76 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +) AS A) as AA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=321 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +)) as AAAA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=322 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +)) as AAAAAA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=323 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=76 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +) AS A) as AA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=321 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +)) as AAAA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=322 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +)) as AAAAAA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=323 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0428020954132 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00106501579285 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0608348846436 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.242650985718 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 18:00:54] "GET /api/v0.1/ci/s?q=private_ip:10.201.100.40%0A10.201.100.43,-ctc_ip:10.201.100.40%0A10.201.100.43,-cmc_ip:10.201.100.40%0A10.201.100.43,-cnc_ip:10.201.100.40%0A10.201.100.43&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'private_ip:10.201.100.40\n10.201.100.43', u'-ctc_ip:10.201.100.40\n10.201.100.43', u'-cmc_ip:10.201.100.40\n10.201.100.43', u'-cnc_ip:10.201.100.40\n10.201.100.43'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +10.201.100.40 +10.201.100.43 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +10.201.100.40 +10.201.100.43 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +10.201.100.40 +10.201.100.43 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +10.201.100.40 +10.201.100.43 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=76 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +) AS A) as AA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=321 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +)) as AAAA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=322 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +)) as AAAAAA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=323 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=76 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +) AS A) as AA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=321 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +)) as AAAA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=322 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +)) as AAAAAA UNION ALL ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=323 + AND index_texts.value LIKE "10.201.100.40 +10.201.100.43" +)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0025098323822 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000977039337158 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.179939985275 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.182359933853 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 18:01:04] "GET /api/v0.1/ci/s?q=private_ip:10.201.100.40%0A10.201.100.43,-ctc_ip:10.201.100.40%0A10.201.100.43,-cmc_ip:10.201.100.40%0A10.201.100.43,-cnc_ip:10.201.100.40%0A10.201.100.43&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00103092193604 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000633001327515 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00195002555847 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0424840450287 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 18:04:27] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00238108634949 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00109004974365 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00394082069397 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0367732048035 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 18:05:44] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00294899940491 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00110387802124 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00455594062805 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0705690383911 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 18:16:51] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00221800804138 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000672101974487 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00313115119934 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00474309921265 +-------------------------------------------------------------------------------- +127.0.0.1 - - [06/May/2016 18:25:31] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +Engine(mysql+pymysql://root:12qwaszx@127.0.0.1:3306/cmdb?charset=utf8) + * Running on http://127.0.0.1:5000/ + * Restarting with reloader +127.0.0.1 - - [09/May/2016 10:18:03] "GET /api/v0.1/citypes/test HTTP/1.1" 404 - +127.0.0.1 - - [09/May/2016 10:18:03] "GET /favicon.ico HTTP/1.1" 404 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0598759651184 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000992059707642 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0611588954926 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.803076028824 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00978183746338 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :1.29803514481 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 10:18:26] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00186991691589 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000639915466309 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00271892547607 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0403780937195 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00546097755432 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0523240566254 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 10:19:28] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00334310531616 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000907897949219 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00447702407837 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0965549945831 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00406098365784 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.107922077179 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 10:25:30] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00181102752686 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000884056091309 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00296902656555 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0375919342041 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00465297698975 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.047956943512 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 10:25:52] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00202107429504 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000730991363525 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00300407409668 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0385808944702 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00391387939453 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0482230186462 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 10:26:03] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0121281147003 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00113201141357 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0136950016022 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0762298107147 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 14:12:46] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00149393081665 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000712871551514 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00247406959534 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=76 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=113 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=332 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=338 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0412571430206 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00859308242798 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0869870185852 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 14:12:46] "GET /api/v0.1/ci/s?q=_type:(server;vserver),,&facet=private_ip,idc,i_bu,category,category_branch&page=1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00148487091064 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000642061233521 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00236916542053 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00406694412231 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 14:12:50] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00177097320557 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000633001327515 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00260806083679 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=76 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=113 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=332 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=338 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0359408855438 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00387692451477 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.053603887558 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 14:12:50] "GET /api/v0.1/ci/s?q=_type:(server;vserver),,&facet=private_ip,idc,i_bu,category,category_branch&page=1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00196719169617 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000930786132812 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00319194793701 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00538301467896 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 14:14:10] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00214695930481 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000745058059692 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00322508811951 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=76 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=113 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=332 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=338 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.429610967636 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00446391105652 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.452435016632 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 14:14:11] "GET /api/v0.1/ci/s?q=_type:(server;vserver),,&facet=private_ip,idc,i_bu,category,category_branch&page=1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00226783752441 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000981092453003 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00360298156738 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00578713417053 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 14:14:22] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00214505195618 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00092077255249 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00335288047791 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=76 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=113 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=332 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=338 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0536489486694 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00423884391785 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0775620937347 +-------------------------------------------------------------------------------- +127.0.0.1 - - [09/May/2016 14:14:22] "GET /api/v0.1/ci/s?q=_type:(server;vserver),,&facet=private_ip,idc,i_bu,category,category_branch&page=1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00220489501953 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000792980194092 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00323104858398 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.338953971863 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.0110371112823 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :1.18443512917 +-------------------------------------------------------------------------------- +127.0.0.1 - - [11/May/2016 11:27:46] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00188589096069 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000808954238892 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00297713279724 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0992829799652 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00404500961304 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.113486051559 +-------------------------------------------------------------------------------- +127.0.0.1 - - [11/May/2016 11:32:35] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0302109718323 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00176095962524 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0479810237885 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.260961055756 +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 10:46:17] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.227611064911 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.0352039337158 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.263208150864 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.531694173813 +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 15:52:53] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.000857830047607 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000586986541748 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00165390968323 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0472660064697 +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 16:45:35] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00222492218018 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00065016746521 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00310301780701 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :1.87419700623 +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 17:02:50] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0293130874634 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000784873962402 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0304498672485 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0375719070435 +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 17:17:17] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0025269985199 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00074291229248 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00347685813904 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00498795509338 +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 17:25:15] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: +args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.12', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.33', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 17:40:41] "PUT /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: +args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.13', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.32', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 17:40:41] "PUT /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: +args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.12', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.35', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 17:48:24] "PUT /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: +args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.13', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.34', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 17:48:24] "PUT /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: +args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.12', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.37', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 17:59:31] "PUT /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: +args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.13', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.36', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 17:59:31] "PUT /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: +args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.13', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.39', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 17:59:40] "PUT /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: +args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.13', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.38', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] +-------------------------------------------------------------------------------- +127.0.0.1 - - [12/May/2016 17:59:41] "PUT /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=98 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00213813781738 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000752925872803 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00332283973694 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.476519107819 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 11:57:30] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0657520294189 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00116896629333 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0672781467438 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0799460411072 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 11:57:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00168704986572 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000638961791992 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0025680065155 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00442481040955 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 11:57:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'238318b8b1b64420b7a11423c14a4d08', 'private_ip': u'1.1.1.0'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd7f4f608441f4578a6c48aa14bcd1537', 'private_ip': u'1.1.1.1'} +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:184]: +attribute private_ip value 1.1.1.1 must be unique +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 400 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'3f8fe5210aed4ca7ad766adc28898253', 'private_ip': u'1.1.1.2'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'5531332a8f1c4591b1518ed0e153d034', 'private_ip': u'1.1.1.3'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'6f7057e0046e4285ac76eddbfb237fb9', 'private_ip': u'1.1.1.4'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'0fe0234cbebd4f14aba230b8f74324b9', 'private_ip': u'1.1.1.5'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'8d4c48322b93467c8f38efa806d26ebe', 'private_ip': u'1.1.1.6'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'b469a0fba6914e80a2856dbb9d52a628', 'private_ip': u'1.1.1.7'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'4ae6f4a95eb74c729ea6de45bb1a5f4a', 'private_ip': u'1.1.1.8'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'66c0b262f01d4632bcd894c32b3a79db', 'private_ip': u'1.1.1.9'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'f250855a503842d9ad614187ddad2fc7', 'private_ip': u'1.1.1.10'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'dc50ef2ed2434d71b9420615b4dcc2eb', 'private_ip': u'1.1.1.11'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'e0831cca7e3f4ff8bce99f3bfc35f8e2', 'private_ip': u'1.1.1.12'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'1f36bd8f63dd4a5285fbaebdd553d9f7', 'private_ip': u'1.1.1.13'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'29e6e7623a65489fa5b54615e6a223af', 'private_ip': u'1.1.1.14'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'dffffa4f06bc4108a4a117edf20d826a', 'private_ip': u'1.1.1.15'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'67eb329bdfd546e797caa063af33839e', 'private_ip': u'1.1.1.16'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd91b70417df44b1aa76af9fb3ef756d7', 'private_ip': u'1.1.1.17'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'34a05521585a450e965ae6ac8cc904e7', 'private_ip': u'1.1.1.18'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'b0ee30600aed4ff6a0c770334e0d0c79', 'private_ip': u'1.1.1.19'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'ab71d306d81f40c1b7c7ce2a38fd58d8', 'private_ip': u'1.1.1.20'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'1d2c5510e13d4d6c843e360365bfb8f4', 'private_ip': u'1.1.1.21'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'813114f89be448f2a6347fdf32577ff2', 'private_ip': u'1.1.1.22'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'b07ef0515f0245679b838bf3a5337ab1', 'private_ip': u'1.1.1.23'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'643ebb2a9d954311be013fa22083be56', 'private_ip': u'1.1.1.24'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'c9e025439067492581757109b336f57c', 'private_ip': u'1.1.1.25'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'6841d9fe60e6429b85aa9f23920c344b', 'private_ip': u'1.1.1.26'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:25] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'3d5617f268b24bcdbc58a0203e99408d', 'private_ip': u'1.1.1.27'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:25] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'9099ba6560c84f868bf673b10251f5b0', 'private_ip': u'1.1.1.28'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:25] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'082c8a6d749646d1b7cc4c8b78b2c2f9', 'private_ip': u'1.1.1.29'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:25] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'5331acf9b29f4d94b6be1825062b1e86', 'private_ip': u'1.1.1.30'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'b4af503947444c8c89cd94cf69419ce7', 'private_ip': u'1.1.1.31'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'109ce79bcf624b5c8bb3ec6551a92f3b', 'private_ip': u'1.1.1.32'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'9e1dab86eb8a4ad0b42ff3c70431831a', 'private_ip': u'1.1.1.33'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd331ddfa708a442e92520d05f2757370', 'private_ip': u'1.1.1.34'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'c4c2d3abdc594c4bbe267d282dc75366', 'private_ip': u'1.1.1.35'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'43b4ca49a08a47efab811885da5c1628', 'private_ip': u'1.1.1.36'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'6d86c081c0434468841f0f75b1295f3e', 'private_ip': u'1.1.1.37'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd1cf468c9744408a9b52e0410e8963ed', 'private_ip': u'1.1.1.38'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd381d18c516747c3a977a9f529e7f327', 'private_ip': u'1.1.1.39'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'c177b579c90c457fade719f97656de92', 'private_ip': u'1.1.1.40'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'e713a9797e34450aae10472e5880a42c', 'private_ip': u'1.1.1.41'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'ca802410aaa548cdad114ac8cf89a234', 'private_ip': u'1.1.1.42'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'81ddce082044486181384811db57b192', 'private_ip': u'1.1.1.43'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'cb1904b483b84cffb71d1115cb568d7d', 'private_ip': u'1.1.1.44'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'abe2240b36e94362b98e2418c1ef6b09', 'private_ip': u'1.1.1.45'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'416d092dee8f4c149ce5f2029cd671a6', 'private_ip': u'1.1.1.46'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd6334c901eeb41829781bf5da10e4dee', 'private_ip': u'1.1.1.47'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'cdd43f907b384f159ae1c172d6c4376b', 'private_ip': u'1.1.1.48'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: +{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'0b4a284df6284e0684a408bf46758b9b', 'private_ip': u'1.1.1.49'} +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00224494934082 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000680923461914 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00315690040588 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00497984886169 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:29] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00276017189026 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000838994979858 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00385999679565 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0061469078064 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:03:30] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00148701667786 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00086498260498 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00268697738647 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0044629573822 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:04:38] "GET /api/v0.1/ci/s?q=_type:bu HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:04:38] "GET /api/v0.1/attributes/citype/server HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:04:38] "GET /api/v0.1/attributes/citype/vserver HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (7,8) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00205087661743 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000679016113281 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0029501914978 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.127548933029 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.012983083725 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.1467897892 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:04:38] "GET /api/v0.1/ci/s?q=_type:(server;vserver)&page=1&count=25 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00172686576843 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000852108001709 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00288796424866 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00469398498535 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:04:41] "GET /api/v0.1/ci/s?q=_type:bu HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)', u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00354599952698 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000818014144897 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00464296340942 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=338 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=342 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0613300800323 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00638389587402 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0849468708038 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:04:41] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category,category_branch,category_zone HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:04:42] "GET /api/v0.1/attributes/citype/server HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:04:42] "GET /api/v0.1/attributes/citype/vserver HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)', u'i_bu:*\u4fe1\u606f\u6280\u672f\u90e8*'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*信息技术部* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "%信息技术部%" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "%信息技术部%" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0022599697113 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000699043273926 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00317907333374 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0396199226379 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00492191314697 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0509600639343 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:04:42] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:*%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8*&page=1&count=25 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00164914131165 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000954866409302 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00288200378418 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.00433206558228 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:04:46] "GET /api/v0.1/ci/s?q=_type:bu HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)', u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00326800346375 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.0013370513916 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00494790077209 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=338 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=342 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0403969287872 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00525093078613 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0617871284485 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:04:46] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category,category_branch,category_zone HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:04:47] "GET /api/v0.1/attributes/citype/server HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:04:47] "GET /api/v0.1/attributes/citype/vserver HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)', u'i_bu:*\u4fe1\u606f\u6280\u672f\u90e8*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*信息技术部* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "%信息技术部%" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "%信息技术部%" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00278210639954 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000895023345947 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00399589538574 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0156910419464 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00427293777466 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0278310775757 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:04:47] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:*%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8*,status:%E5%BE%85%E7%94%A8&page=1&count=25 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:bu'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +bu +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: + + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM ( + SELECT cis.ci_id + FROM cis + WHERE cis.type_id in (9) +) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00163507461548 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000936985015869 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00283718109131 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0042290687561 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:04:52] "GET /api/v0.1/ci/s?q=_type:bu HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)', u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00322985649109 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000859975814819 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00433492660522 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=337 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=338 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=342 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0482909679413 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00556492805481 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0705921649933 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:04:53] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category,category_branch,category_zone HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:04:53] "GET /api/v0.1/attributes/citype/server HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:04:53] "GET /api/v0.1/attributes/citype/vserver HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'_type:(server;vserver)', u'i_bu:*\u4fe1\u606f\u6280\u672f\u90e8*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +(server;vserver) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*信息技术部* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "%信息技术部%" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "%信息技术部%" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 50; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00473594665527 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000981092453003 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00601601600647 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0301220417023 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00951981544495 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.05104804039 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:04:53] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:*%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8*,status:%E5%BE%85%E7%94%A8&page=1&count=50 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 50; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00338816642761 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000671863555908 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00431108474731 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.208733081818 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00945806503296 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.254358053207 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:05:55] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8&count=50 HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:12] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:12] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:12] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00266480445862 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000663995742798 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00354790687561 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=113 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT texts.value, + count(texts.ci_id) + FROM texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id + WHERE texts.attr_id=81 + GROUP BY texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=84 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=85 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=134 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0168650150299 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00460696220398 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0594260692596 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:07:17] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00300288200378 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000783920288086 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00402903556824 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0193889141083 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00432205200195 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0311801433563 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:07:17] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00279402732849 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00103402137756 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00405311584473 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=113 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT texts.value, + count(texts.ci_id) + FROM texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id + WHERE texts.attr_id=81 + GROUP BY texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=84 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=85 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=134 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0165219306946 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00419497489929 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0460839271545 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:07:19] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.002690076828 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000685930252075 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00360584259033 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0194938182831 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00451993942261 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0312259197235 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:07:19] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00401782989502 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00122618675232 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00571608543396 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0562770366669 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00567412376404 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0721549987793 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:07:25] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00393295288086 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000884056091309 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00515413284302 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0229218006134 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00479197502136 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.037230014801 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:07:35] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00577712059021 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00100088119507 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00712203979492 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=113 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT texts.value, + count(texts.ci_id) + FROM texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id + WHERE texts.attr_id=81 + GROUP BY texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=84 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=85 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=134 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0214371681213 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00474882125854 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0584471225739 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:08:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00485491752625 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00115609169006 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00634002685547 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0418310165405 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00527000427246 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0578470230103 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:08:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00277400016785 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000687122344971 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00369191169739 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0173580646515 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00422215461731 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0284731388092 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:08:41] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00268816947937 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000670909881592 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00359201431274 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0173001289368 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00586199760437 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0301668643951 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:08:55] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0026478767395 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000631093978882 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00351214408875 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.016566991806 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00436902046204 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0275938510895 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:09:02] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00368499755859 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000967979431152 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00488615036011 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0186278820038 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00511789321899 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0318710803986 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:09:03] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00268793106079 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000670909881592 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00357484817505 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0175449848175 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00444889068604 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0288112163544 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:09:04] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.0026638507843 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000672101974487 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00357604026794 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0188949108124 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00421285629272 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0299999713898 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:09:06] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00363802909851 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000690937042236 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0045690536499 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0164041519165 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00412201881409 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0895571708679 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:14:28] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00398683547974 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.0012891292572 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00565814971924 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=113 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT texts.value, + count(texts.ci_id) + FROM texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id + WHERE texts.attr_id=81 + GROUP BY texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=84 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=85 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=134 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0190281867981 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00619602203369 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.366659879684 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:15:45] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00439190864563 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00114893913269 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00593590736389 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0367379188538 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00744009017944 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0544347763062 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:15:46] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00426197052002 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000977993011475 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00555920600891 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0202751159668 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00476598739624 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0344297885895 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:15:50] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00276517868042 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000663995742798 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00367999076843 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0184230804443 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00432586669922 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0299971103668 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:15:53] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00266408920288 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000677824020386 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00359392166138 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=113 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT texts.value, + count(texts.ci_id) + FROM texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id + WHERE texts.attr_id=81 + GROUP BY texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=84 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=85 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=134 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0173199176788 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00425982475281 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0407638549805 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:16:14] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00425410270691 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00123405456543 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00600504875183 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.029629945755 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00638294219971 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0468158721924 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:16:14] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00269889831543 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000703096389771 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00362205505371 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.200909137726 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00399088859558 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.211716890335 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:16:18] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00272393226624 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000693082809448 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00364112854004 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0183601379395 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00473380088806 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0301830768585 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:16:32] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00452303886414 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00118803977966 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00610113143921 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0212669372559 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00476884841919 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0366308689117 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 12:16:35] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.021723985672 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000670909881592 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.0226528644562 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=113 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT texts.value, + count(texts.ci_id) + FROM texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id + WHERE texts.attr_id=81 + GROUP BY texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=84 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_integers.value, + count(index_integers.ci_id) + FROM index_integers + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id + WHERE index_integers.attr_id=85 + GROUP BY index_integers.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: + + SELECT index_texts.value, + count(index_texts.ci_id) + FROM index_texts + INNER JOIN (SELECT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "Windows%" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id + WHERE index_texts.attr_id=134 + GROUP BY index_texts.value + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0218780040741 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00820517539978 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.221758127213 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 13:16:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00270700454712 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000648021697998 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00359416007996 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0344240665436 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00449895858765 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.04585313797 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 13:16:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00276303291321 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000801801681519 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00382900238037 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.223458051682 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.0042028427124 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.234619855881 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 13:16:41] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00281310081482 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.000668048858643 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00372004508972 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0693650245667 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00427412986755 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0808877944946 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 13:16:45] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: +[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +信息技术部 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +*Windows* +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: +待用 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: +SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: +SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id + FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=332 + AND index_texts.value LIKE "信息技术部" +) AS A) as AA + INNER JOIN ( + SELECT texts.ci_id + FROM texts + WHERE texts.attr_id=81 + AND texts.value LIKE "%Windows%" +) as AAA USING(ci_id)) as AAAA + INNER JOIN ( + SELECT index_texts.ci_id + FROM index_texts + WHERE index_texts.attr_id=115 + AND index_texts.value LIKE "待用" +) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: +query ci ids time is: 0.00271892547607 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: +statistics ci ids time is: 0.00068211555481 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: +query ci ids is: 0.00364398956299 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: +cache not hit............... +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: +['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: + + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_multivalue + FROM + ( + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_floats.ci_id, + index_floats.attr_id, + index_floats.value + FROM index_floats + INNER JOIN cis ON index_floats.ci_id=cis.ci_id + AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_datetime.ci_id, + index_datetime.attr_id, + index_datetime.value + FROM index_datetime + INNER JOIN cis ON index_datetime.ci_id=cis.ci_id + AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_texts.ci_id, + index_texts.attr_id, + index_texts.value + FROM index_texts + INNER JOIN cis ON index_texts.ci_id=cis.ci_id + AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + index_integers.ci_id, + index_integers.attr_id, + index_integers.value + FROM index_integers + INNER JOIN cis ON index_integers.ci_id=cis.ci_id + AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + integers.ci_id, + integers.attr_id, + integers.value + FROM integers + INNER JOIN cis ON integers.ci_id=cis.ci_id + AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + texts.ci_id, + texts.attr_id, + texts.value + FROM texts + INNER JOIN cis ON texts.ci_id=cis.ci_id + AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + floats.ci_id, + floats.attr_id, + floats.value + FROM floats + INNER JOIN cis ON floats.ci_id=cis.ci_id + AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id + UNION + SELECT attr.attr_name, + attr.attr_alias, + attr.value_type, + attr.is_multivalue, + cis.type_id, + datetime.ci_id, + datetime.attr_id, + datetime.value + FROM datetime + INNER JOIN cis ON datetime.ci_id=cis.ci_id + AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) + INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id +) AS A + ORDER BY A.ci_id; + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: +get cis time is: 0.0179951190948 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: +result parser time is: 0.00405502319336 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: +search time is :0.0288989543915 +-------------------------------------------------------------------------------- +127.0.0.1 - - [18/May/2016 13:16:46] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - From 420c6cea2bbf906a5a1b334cd253a644211d8429 Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 26 Aug 2016 13:46:03 +0800 Subject: [PATCH 022/159] =?UTF-8?q?delete=E3=80=82=E3=80=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nohup.out | 17549 ---------------------------------------------------- 1 file changed, 17549 deletions(-) delete mode 100644 nohup.out diff --git a/nohup.out b/nohup.out deleted file mode 100644 index 70f71a7..0000000 --- a/nohup.out +++ /dev/null @@ -1,17549 +0,0 @@ - * Running on http://127.0.0.1:5000/ - * Restarting with reloader -127.0.0.1 - - [04/May/2016 09:32:53] "GET /api/v0.1/citypes/test HTTP/1.1" 404 - -127.0.0.1 - - [04/May/2016 09:32:53] "GET /favicon.ico HTTP/1.1" 404 - -127.0.0.1 - - [04/May/2016 09:33:05] "GET /api/v0.1/citypes/test HTTP/1.1" 404 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00168991088867 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.0010130405426 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00322699546814 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.198438882828 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 10:08:34] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0014021396637 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000633001327515 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00225591659546 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0042040348053 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 10:08:49] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00191187858582 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00113415718079 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00333905220032 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.313664913177 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 13:10:32] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - - * Detected change in '/Users/pycook/PycharmProjects/cmdb-api/lib/const.py', reloading -Engine(mysql+pymysql://root:12qwaszx@127.0.0.1:3306/cmdb?charset=utf8) - * Restarting with reloader --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'sn': u'test', 'private_ip': u'\u6211\u4e48'} --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 15:46:45] "POST /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [04/May/2016 15:47:34] "GET /api/v0.1/ci/11238 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0506961345673 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.0010027885437 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0520710945129 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.18240404129 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 15:57:24] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.000910043716431 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000577926635742 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00169992446899 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0425431728363 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 16:45:26] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00154399871826 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000653028488159 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00249695777893 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0680940151215 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:17:25] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00356793403625 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00132894515991 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00535202026367 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.010763168335 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:23:38] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0264749526978 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.0010461807251 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0278940200806 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0366520881653 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:24:26] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0019371509552 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00100803375244 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00320816040039 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00779008865356 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:28:12] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00407910346985 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00105810165405 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00563716888428 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0106608867645 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:29:17] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00188398361206 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000676155090332 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00281691551208 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00757098197937 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:29:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0039210319519 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00129199028015 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00571703910828 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0124680995941 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:30:41] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00422286987305 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00146913528442 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00628805160522 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0118639469147 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:30:56] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00198101997375 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000663995742798 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00293016433716 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00727486610413 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:31:07] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00292706489563 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00109195709229 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00443601608276 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00992894172668 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:31:40] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00206089019775 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000764131546021 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00310897827148 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00736784934998 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:32:04] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00242686271667 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000970125198364 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0039119720459 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00997400283813 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:32:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00192189216614 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000703096389771 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0028760433197 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00708293914795 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:33:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00278306007385 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000799894332886 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00387978553772 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00937294960022 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:34:47] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0021390914917 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000871896743774 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00348711013794 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00840711593628 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:34:55] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00194406509399 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000855922698975 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00313210487366 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00801920890808 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:35:21] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00188088417053 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000905990600586 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0031201839447 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00819301605225 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:35:30] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00329399108887 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.001384973526 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00519394874573 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0122549533844 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:36:59] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00400114059448 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00180196762085 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00640606880188 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0205891132355 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:37:59] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00472283363342 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.0011990070343 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00637793540955 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0111930370331 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:41:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00413990020752 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00175905227661 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00669693946838 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0142269134521 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:42:24] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00310206413269 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00144004821777 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0050220489502 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0119028091431 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:42:52] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00410795211792 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00157308578491 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00650787353516 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.014965057373 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:43:29] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00244402885437 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000788927078247 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00356388092041 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00857877731323 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:43:50] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00294017791748 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.0016758441925 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00509810447693 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0121698379517 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:43:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00237703323364 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00112318992615 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00380516052246 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00930500030518 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:44:22] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00446009635925 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00140905380249 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00650596618652 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0161590576172 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:45:17] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0027129650116 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00136399269104 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00454807281494 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0110859870911 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:45:20] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00222182273865 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00100207328796 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00354790687561 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0103268623352 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 17:59:59] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00243282318115 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000861167907715 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00357699394226 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0442547798157 --------------------------------------------------------------------------------- -127.0.0.1 - - [04/May/2016 18:31:06] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00129294395447 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000882148742676 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00257706642151 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.142752885818 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 17:24:50] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00185298919678 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000818014144897 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0030369758606 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00541496276855 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 17:25:36] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00154495239258 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000635147094727 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00250387191772 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.051069021225 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 17:27:08] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00217890739441 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00059700012207 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00302195549011 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00492405891418 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 17:36:08] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00218796730042 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.0010449886322 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00360012054443 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00551700592041 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 17:39:35] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00260400772095 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000864028930664 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00382113456726 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0411348342896 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:14:33] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00181007385254 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000784873962402 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00294995307922 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0173177719116 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:14:47] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00204801559448 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00113201141357 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00355219841003 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00924301147461 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:16:25] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00280618667603 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00119185447693 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00445604324341 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00995492935181 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:17:35] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0018470287323 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00067400932312 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00275993347168 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00680994987488 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:18:20] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00179600715637 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000636100769043 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00266981124878 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00681519508362 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:19:32] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0039370059967 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000799894332886 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0049901008606 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00932097434998 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:20:20] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00290489196777 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00122117996216 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00456190109253 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0095009803772 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:21:55] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00276899337769 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00116801261902 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00424194335938 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00968599319458 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:23:57] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0019679069519 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000694990158081 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00290894508362 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00722193717957 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:24:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00294184684753 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000672101974487 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00388193130493 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0430560112 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:26:54] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00246095657349 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.0010130405426 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00382304191589 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00915908813477 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:27:01] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00193095207214 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000999212265015 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00324487686157 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00796294212341 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:28:00] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00185894966125 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000678062438965 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0028121471405 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0375330448151 --------------------------------------------------------------------------------- -127.0.0.1 - - [05/May/2016 18:31:28] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - -127.0.0.1 - - [05/May/2016 18:31:36] "GET /api/v0.1/attributes/idc?_key=20c4773dece64394bce23d074d19e609&_secret=65fb0aadbaf2f7bbcc693e66651a971694fb13ec HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0356650352478 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.0346050262451 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0706639289856 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.334421873093 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.0102000236511 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :1.34820795059 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 14:25:02] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00253105163574 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00127005577087 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00412607192993 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0394840240479 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00411605834961 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0525629520416 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 14:25:03] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00180196762085 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00066089630127 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00267100334167 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.03528881073 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00451993942261 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0451531410217 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 14:25:38] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00155186653137 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000653028488159 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00251293182373 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0830659866333 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:23:15] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00237798690796 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000860929489136 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0034921169281 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00814914703369 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:23:34] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00210309028625 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00123381614685 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00372314453125 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00819706916809 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:23:36] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00262212753296 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000769853591919 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00373816490173 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00808191299438 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:31:06] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00188302993774 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000674962997437 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0027961730957 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00756907463074 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:32:16] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00438594818115 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000910997390747 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0057909488678 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0372879505157 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:37:36] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00378322601318 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000932931900024 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00506496429443 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.110025167465 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:53:43] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0021870136261 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000694036483765 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00321102142334 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00901317596436 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:54:32] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00182700157166 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000674962997437 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00275182723999 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00668287277222 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:55:56] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00242185592651 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000854015350342 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00357508659363 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00892615318298 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:56:39] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00207710266113 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00077486038208 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00311899185181 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00812101364136 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:57:06] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00185489654541 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000639915466309 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0027289390564 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.007404088974 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:57:26] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.005126953125 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00113391876221 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00704193115234 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0435559749603 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 16:59:14] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00351214408875 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00133395195007 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00542497634888 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0134720802307 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 17:03:53] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00596499443054 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00145888328552 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00791692733765 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0145330429077 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 17:04:34] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'private_ip:10.201.100.40\n10.201.100.43', u'-ctc_ip:10.201.100.40\n10.201.100.43', u'-cmc_ip:10.201.100.40\n10.201.100.43', u'-cnc_ip:10.201.100.40\n10.201.100.43'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -10.201.100.40 -10.201.100.43 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -10.201.100.40 -10.201.100.43 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -10.201.100.40 -10.201.100.43 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -10.201.100.40 -10.201.100.43 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=76 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -) AS A) as AA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=321 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -)) as AAAA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=322 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -)) as AAAAAA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=323 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=76 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -) AS A) as AA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=321 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -)) as AAAA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=322 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -)) as AAAAAA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=323 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0428020954132 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00106501579285 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0608348846436 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.242650985718 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 18:00:54] "GET /api/v0.1/ci/s?q=private_ip:10.201.100.40%0A10.201.100.43,-ctc_ip:10.201.100.40%0A10.201.100.43,-cmc_ip:10.201.100.40%0A10.201.100.43,-cnc_ip:10.201.100.40%0A10.201.100.43&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'private_ip:10.201.100.40\n10.201.100.43', u'-ctc_ip:10.201.100.40\n10.201.100.43', u'-cmc_ip:10.201.100.40\n10.201.100.43', u'-cnc_ip:10.201.100.40\n10.201.100.43'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -10.201.100.40 -10.201.100.43 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -10.201.100.40 -10.201.100.43 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -10.201.100.40 -10.201.100.43 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -10.201.100.40 -10.201.100.43 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=76 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -) AS A) as AA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=321 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -)) as AAAA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=322 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -)) as AAAAAA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=323 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=76 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -) AS A) as AA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=321 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -)) as AAAA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=322 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -)) as AAAAAA UNION ALL ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=323 - AND index_texts.value LIKE "10.201.100.40 -10.201.100.43" -)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0025098323822 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000977039337158 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.179939985275 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.182359933853 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 18:01:04] "GET /api/v0.1/ci/s?q=private_ip:10.201.100.40%0A10.201.100.43,-ctc_ip:10.201.100.40%0A10.201.100.43,-cmc_ip:10.201.100.40%0A10.201.100.43,-cnc_ip:10.201.100.40%0A10.201.100.43&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00103092193604 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000633001327515 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00195002555847 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0424840450287 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 18:04:27] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00238108634949 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00109004974365 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00394082069397 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0367732048035 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 18:05:44] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00294899940491 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00110387802124 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00455594062805 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0705690383911 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 18:16:51] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00221800804138 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000672101974487 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00313115119934 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00474309921265 --------------------------------------------------------------------------------- -127.0.0.1 - - [06/May/2016 18:25:31] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - -Engine(mysql+pymysql://root:12qwaszx@127.0.0.1:3306/cmdb?charset=utf8) - * Running on http://127.0.0.1:5000/ - * Restarting with reloader -127.0.0.1 - - [09/May/2016 10:18:03] "GET /api/v0.1/citypes/test HTTP/1.1" 404 - -127.0.0.1 - - [09/May/2016 10:18:03] "GET /favicon.ico HTTP/1.1" 404 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0598759651184 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000992059707642 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0611588954926 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.803076028824 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00978183746338 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :1.29803514481 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 10:18:26] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00186991691589 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000639915466309 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00271892547607 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0403780937195 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00546097755432 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0523240566254 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 10:19:28] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00334310531616 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000907897949219 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00447702407837 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0965549945831 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00406098365784 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.107922077179 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 10:25:30] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00181102752686 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000884056091309 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00296902656555 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0375919342041 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00465297698975 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.047956943512 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 10:25:52] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00202107429504 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000730991363525 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00300407409668 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0385808944702 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00391387939453 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0482230186462 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 10:26:03] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0121281147003 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00113201141357 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0136950016022 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0762298107147 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 14:12:46] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00149393081665 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000712871551514 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00247406959534 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=76 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=113 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=332 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=338 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0412571430206 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00859308242798 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0869870185852 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 14:12:46] "GET /api/v0.1/ci/s?q=_type:(server;vserver),,&facet=private_ip,idc,i_bu,category,category_branch&page=1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00148487091064 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000642061233521 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00236916542053 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00406694412231 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 14:12:50] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00177097320557 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000633001327515 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00260806083679 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=76 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=113 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=332 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=338 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0359408855438 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00387692451477 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.053603887558 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 14:12:50] "GET /api/v0.1/ci/s?q=_type:(server;vserver),,&facet=private_ip,idc,i_bu,category,category_branch&page=1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00196719169617 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000930786132812 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00319194793701 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00538301467896 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 14:14:10] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00214695930481 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000745058059692 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00322508811951 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=76 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=113 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=332 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=338 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.429610967636 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00446391105652 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.452435016632 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 14:14:11] "GET /api/v0.1/ci/s?q=_type:(server;vserver),,&facet=private_ip,idc,i_bu,category,category_branch&page=1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00226783752441 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000981092453003 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00360298156738 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00578713417053 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 14:14:22] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00214505195618 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00092077255249 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00335288047791 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=76 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=113 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=332 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=338 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0536489486694 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00423884391785 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0775620937347 --------------------------------------------------------------------------------- -127.0.0.1 - - [09/May/2016 14:14:22] "GET /api/v0.1/ci/s?q=_type:(server;vserver),,&facet=private_ip,idc,i_bu,category,category_branch&page=1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00220489501953 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000792980194092 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00323104858398 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.338953971863 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.0110371112823 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :1.18443512917 --------------------------------------------------------------------------------- -127.0.0.1 - - [11/May/2016 11:27:46] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00188589096069 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000808954238892 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00297713279724 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0992829799652 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00404500961304 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.113486051559 --------------------------------------------------------------------------------- -127.0.0.1 - - [11/May/2016 11:32:35] "GET /api/v0.1/ci/s?q=_type:(server;vserver) HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0302109718323 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00176095962524 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0479810237885 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.260961055756 --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 10:46:17] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.227611064911 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.0352039337158 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.263208150864 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.531694173813 --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 15:52:53] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.000857830047607 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000586986541748 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00165390968323 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0472660064697 --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 16:45:35] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00222492218018 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00065016746521 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00310301780701 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :1.87419700623 --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 17:02:50] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0293130874634 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000784873962402 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0304498672485 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0375719070435 --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 17:17:17] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0025269985199 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00074291229248 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00347685813904 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00498795509338 --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 17:25:15] "GET /api/v0.1/ci/s?q=_type:bu&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: -args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.12', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.33', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 17:40:41] "PUT /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: -args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.13', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.32', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 17:40:41] "PUT /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: -args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.12', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.35', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 17:48:24] "PUT /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: -args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.13', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.34', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 17:48:24] "PUT /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: -args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.12', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.37', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 17:59:31] "PUT /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: -args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.13', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.36', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 17:59:31] "PUT /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: -args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.13', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.39', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 17:59:40] "PUT /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in auth [/Users/pycook/PycharmProjects/cmdb-api/lib/auth.py:52]: -args is [u'test', u'\u81ea\u52a8\u5316\u8fd0\u7ef4', u'test', u'2', u'vserver', u'test', u'\u751f\u4ea7', u'10.10.10.13', u'\u4fe1\u606f\u6280\u672f\u90e8', u'\u9ec4\u6c38', u'10.10.10.38', u'\u9ec4\u6c38', u'6CUDFW34', u'\u5728\u7ebf', u'FJK12421413FDFWRWRWEWE', u'2456'] --------------------------------------------------------------------------------- -127.0.0.1 - - [12/May/2016 17:59:41] "PUT /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu', u'bu_name:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=98 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (9) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00213813781738 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000752925872803 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00332283973694 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.476519107819 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 11:57:30] "GET /api/v0.1/ci/s?q=_type:bu,bu_name:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0657520294189 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00116896629333 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0672781467438 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0799460411072 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 11:57:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00168704986572 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000638961791992 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0025680065155 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00442481040955 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 11:57:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'238318b8b1b64420b7a11423c14a4d08', 'private_ip': u'1.1.1.0'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd7f4f608441f4578a6c48aa14bcd1537', 'private_ip': u'1.1.1.1'} --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:184]: -attribute private_ip value 1.1.1.1 must be unique --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 400 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'3f8fe5210aed4ca7ad766adc28898253', 'private_ip': u'1.1.1.2'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'5531332a8f1c4591b1518ed0e153d034', 'private_ip': u'1.1.1.3'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'6f7057e0046e4285ac76eddbfb237fb9', 'private_ip': u'1.1.1.4'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'0fe0234cbebd4f14aba230b8f74324b9', 'private_ip': u'1.1.1.5'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'8d4c48322b93467c8f38efa806d26ebe', 'private_ip': u'1.1.1.6'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'b469a0fba6914e80a2856dbb9d52a628', 'private_ip': u'1.1.1.7'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'4ae6f4a95eb74c729ea6de45bb1a5f4a', 'private_ip': u'1.1.1.8'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:23] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'66c0b262f01d4632bcd894c32b3a79db', 'private_ip': u'1.1.1.9'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'f250855a503842d9ad614187ddad2fc7', 'private_ip': u'1.1.1.10'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'dc50ef2ed2434d71b9420615b4dcc2eb', 'private_ip': u'1.1.1.11'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'e0831cca7e3f4ff8bce99f3bfc35f8e2', 'private_ip': u'1.1.1.12'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'1f36bd8f63dd4a5285fbaebdd553d9f7', 'private_ip': u'1.1.1.13'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'29e6e7623a65489fa5b54615e6a223af', 'private_ip': u'1.1.1.14'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'dffffa4f06bc4108a4a117edf20d826a', 'private_ip': u'1.1.1.15'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'67eb329bdfd546e797caa063af33839e', 'private_ip': u'1.1.1.16'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd91b70417df44b1aa76af9fb3ef756d7', 'private_ip': u'1.1.1.17'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'34a05521585a450e965ae6ac8cc904e7', 'private_ip': u'1.1.1.18'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'b0ee30600aed4ff6a0c770334e0d0c79', 'private_ip': u'1.1.1.19'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'ab71d306d81f40c1b7c7ce2a38fd58d8', 'private_ip': u'1.1.1.20'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'1d2c5510e13d4d6c843e360365bfb8f4', 'private_ip': u'1.1.1.21'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'813114f89be448f2a6347fdf32577ff2', 'private_ip': u'1.1.1.22'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'b07ef0515f0245679b838bf3a5337ab1', 'private_ip': u'1.1.1.23'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'643ebb2a9d954311be013fa22083be56', 'private_ip': u'1.1.1.24'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'c9e025439067492581757109b336f57c', 'private_ip': u'1.1.1.25'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:24] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'6841d9fe60e6429b85aa9f23920c344b', 'private_ip': u'1.1.1.26'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:25] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'3d5617f268b24bcdbc58a0203e99408d', 'private_ip': u'1.1.1.27'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:25] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'9099ba6560c84f868bf673b10251f5b0', 'private_ip': u'1.1.1.28'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:25] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'082c8a6d749646d1b7cc4c8b78b2c2f9', 'private_ip': u'1.1.1.29'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:25] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'5331acf9b29f4d94b6be1825062b1e86', 'private_ip': u'1.1.1.30'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'b4af503947444c8c89cd94cf69419ce7', 'private_ip': u'1.1.1.31'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'109ce79bcf624b5c8bb3ec6551a92f3b', 'private_ip': u'1.1.1.32'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'9e1dab86eb8a4ad0b42ff3c70431831a', 'private_ip': u'1.1.1.33'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd331ddfa708a442e92520d05f2757370', 'private_ip': u'1.1.1.34'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'c4c2d3abdc594c4bbe267d282dc75366', 'private_ip': u'1.1.1.35'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'43b4ca49a08a47efab811885da5c1628', 'private_ip': u'1.1.1.36'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'6d86c081c0434468841f0f75b1295f3e', 'private_ip': u'1.1.1.37'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd1cf468c9744408a9b52e0410e8963ed', 'private_ip': u'1.1.1.38'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd381d18c516747c3a977a9f529e7f327', 'private_ip': u'1.1.1.39'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'c177b579c90c457fade719f97656de92', 'private_ip': u'1.1.1.40'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'e713a9797e34450aae10472e5880a42c', 'private_ip': u'1.1.1.41'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'ca802410aaa548cdad114ac8cf89a234', 'private_ip': u'1.1.1.42'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:26] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'81ddce082044486181384811db57b192', 'private_ip': u'1.1.1.43'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'cb1904b483b84cffb71d1115cb568d7d', 'private_ip': u'1.1.1.44'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'abe2240b36e94362b98e2418c1ef6b09', 'private_ip': u'1.1.1.45'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'416d092dee8f4c149ce5f2029cd671a6', 'private_ip': u'1.1.1.46'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'd6334c901eeb41829781bf5da10e4dee', 'private_ip': u'1.1.1.47'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'cdd43f907b384f159ae1c172d6c4376b', 'private_ip': u'1.1.1.48'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:128]: -{'status': u'\u5f85\u7528', 'i_bu': u'\u4fe1\u606f\u6280\u672f\u90e8', 'uuid': u'0b4a284df6284e0684a408bf46758b9b', 'private_ip': u'1.1.1.49'} --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:27] "POST /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00224494934082 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000680923461914 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00315690040588 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00497984886169 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:29] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00276017189026 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000838994979858 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00385999679565 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0061469078064 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:03:30] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00148701667786 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00086498260498 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00268697738647 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0044629573822 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:04:38] "GET /api/v0.1/ci/s?q=_type:bu HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:04:38] "GET /api/v0.1/attributes/citype/server HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:04:38] "GET /api/v0.1/attributes/citype/vserver HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (7,8) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00205087661743 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000679016113281 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0029501914978 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.127548933029 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.012983083725 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.1467897892 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:04:38] "GET /api/v0.1/ci/s?q=_type:(server;vserver)&page=1&count=25 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00172686576843 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000852108001709 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00288796424866 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00469398498535 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:04:41] "GET /api/v0.1/ci/s?q=_type:bu HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)', u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00354599952698 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000818014144897 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00464296340942 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=338 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=342 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0613300800323 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00638389587402 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0849468708038 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:04:41] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category,category_branch,category_zone HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:04:42] "GET /api/v0.1/attributes/citype/server HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:04:42] "GET /api/v0.1/attributes/citype/vserver HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)', u'i_bu:*\u4fe1\u606f\u6280\u672f\u90e8*'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*信息技术部* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "%信息技术部%" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "%信息技术部%" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0022599697113 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000699043273926 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00317907333374 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0396199226379 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00492191314697 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0509600639343 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:04:42] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:*%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8*&page=1&count=25 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00164914131165 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000954866409302 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00288200378418 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.00433206558228 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:04:46] "GET /api/v0.1/ci/s?q=_type:bu HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)', u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00326800346375 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.0013370513916 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00494790077209 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=338 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=342 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0403969287872 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00525093078613 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0617871284485 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:04:46] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category,category_branch,category_zone HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:04:47] "GET /api/v0.1/attributes/citype/server HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:04:47] "GET /api/v0.1/attributes/citype/vserver HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)', u'i_bu:*\u4fe1\u606f\u6280\u672f\u90e8*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*信息技术部* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "%信息技术部%" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "%信息技术部%" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00278210639954 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000895023345947 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00399589538574 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0156910419464 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00427293777466 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0278310775757 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:04:47] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:*%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8*,status:%E5%BE%85%E7%94%A8&page=1&count=25 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:bu'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -bu --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: - - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ( - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in (9) -) AS B ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00163507461548 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000936985015869 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00283718109131 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0042290687561 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:04:52] "GET /api/v0.1/ci/s?q=_type:bu HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)', u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00322985649109 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000859975814819 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00433492660522 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=337 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=338 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=342 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (1296,2446,2447,2448,2449,2450,2451,7769,7916,7930,7986,8107,8129,11210,11211,11237,11239,11241,11242,11243,11244,11245,11246,11247,11248) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0482909679413 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00556492805481 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0705921649933 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:04:53] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8&facet=category,category_branch,category_zone HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:04:53] "GET /api/v0.1/attributes/citype/server HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:04:53] "GET /api/v0.1/attributes/citype/vserver HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'_type:(server;vserver)', u'i_bu:*\u4fe1\u606f\u6280\u672f\u90e8*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -(server;vserver) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:263]: - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*信息技术部* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "%信息技术部%" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "%信息技术部%" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id WHERE cis.type_id in (7,8) ORDER BY B.ci_id ASC LIMIT 0, 50; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00473594665527 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000981092453003 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00601601600647 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0301220417023 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00951981544495 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.05104804039 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:04:53] "GET /api/v0.1/ci/s?q=_type:(server;vserver),i_bu:*%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8*,status:%E5%BE%85%E7%94%A8&page=1&count=50 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 50; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00338816642761 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000671863555908 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00431108474731 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.208733081818 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00945806503296 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.254358053207 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:05:55] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8&count=50 HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:10] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:11] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:12] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:12] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:12] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - -127.0.0.1 - - [18/May/2016 12:07:13] "PUT /api/v0.1/ci HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00266480445862 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000663995742798 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00354790687561 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=113 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT texts.value, - count(texts.ci_id) - FROM texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id - WHERE texts.attr_id=81 - GROUP BY texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=84 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=85 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=134 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0168650150299 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00460696220398 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0594260692596 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:07:17] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00300288200378 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000783920288086 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00402903556824 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0193889141083 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00432205200195 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0311801433563 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:07:17] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00279402732849 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00103402137756 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00405311584473 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=113 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT texts.value, - count(texts.ci_id) - FROM texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id - WHERE texts.attr_id=81 - GROUP BY texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=84 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=85 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=134 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0165219306946 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00419497489929 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0460839271545 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:07:19] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.002690076828 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000685930252075 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00360584259033 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0194938182831 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00451993942261 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0312259197235 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:07:19] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00401782989502 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00122618675232 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00571608543396 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0562770366669 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00567412376404 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0721549987793 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:07:25] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00393295288086 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000884056091309 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00515413284302 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0229218006134 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00479197502136 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.037230014801 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:07:35] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00577712059021 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00100088119507 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00712203979492 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=113 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT texts.value, - count(texts.ci_id) - FROM texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id - WHERE texts.attr_id=81 - GROUP BY texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=84 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=85 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=134 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0214371681213 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00474882125854 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0584471225739 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:08:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00485491752625 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00115609169006 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00634002685547 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0418310165405 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00527000427246 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0578470230103 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:08:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00277400016785 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000687122344971 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00369191169739 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0173580646515 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00422215461731 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0284731388092 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:08:41] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00268816947937 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000670909881592 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00359201431274 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0173001289368 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00586199760437 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0301668643951 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:08:55] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0026478767395 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000631093978882 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00351214408875 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.016566991806 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00436902046204 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0275938510895 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:09:02] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00368499755859 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000967979431152 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00488615036011 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0186278820038 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00511789321899 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0318710803986 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:09:03] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00268793106079 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000670909881592 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00357484817505 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0175449848175 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00444889068604 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0288112163544 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:09:04] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.0026638507843 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000672101974487 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00357604026794 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0188949108124 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00421285629272 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0299999713898 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:09:06] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00363802909851 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000690937042236 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0045690536499 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0164041519165 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00412201881409 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0895571708679 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:14:28] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00398683547974 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.0012891292572 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00565814971924 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=113 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT texts.value, - count(texts.ci_id) - FROM texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id - WHERE texts.attr_id=81 - GROUP BY texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=84 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=85 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=134 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0190281867981 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00619602203369 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.366659879684 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:15:45] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00439190864563 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00114893913269 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00593590736389 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0367379188538 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00744009017944 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0544347763062 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:15:46] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00426197052002 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000977993011475 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00555920600891 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0202751159668 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00476598739624 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0344297885895 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:15:50] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00276517868042 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000663995742798 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00367999076843 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0184230804443 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00432586669922 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0299971103668 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:15:53] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00266408920288 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000677824020386 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00359392166138 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=113 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT texts.value, - count(texts.ci_id) - FROM texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id - WHERE texts.attr_id=81 - GROUP BY texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=84 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=85 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=134 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0173199176788 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00425982475281 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0407638549805 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:16:14] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00425410270691 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00123405456543 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00600504875183 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.029629945755 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00638294219971 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0468158721924 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:16:14] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00269889831543 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000703096389771 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00362205505371 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.200909137726 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00399088859558 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.211716890335 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:16:18] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00272393226624 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000693082809448 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00364112854004 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0183601379395 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00473380088806 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0301830768585 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:16:32] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00452303886414 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00118803977966 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00610113143921 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0212669372559 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00476884841919 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0366308689117 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 12:16:35] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'status:\u5f85\u7528', u'os_version:Windows*'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.021723985672 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000670909881592 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.0226528644562 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=113 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT texts.value, - count(texts.ci_id) - FROM texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=texts.ci_id - WHERE texts.attr_id=81 - GROUP BY texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=84 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_integers.value, - count(index_integers.ci_id) - FROM index_integers - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_integers.ci_id - WHERE index_integers.attr_id=85 - GROUP BY index_integers.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:325]: - - SELECT index_texts.value, - count(index_texts.ci_id) - FROM index_texts - INNER JOIN (SELECT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "Windows%" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ) AS F ON F.ci_id=index_texts.ci_id - WHERE index_texts.attr_id=134 - GROUP BY index_texts.value - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0218780040741 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00820517539978 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.221758127213 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 13:16:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,status:%E5%BE%85%E7%94%A8,os_version:Windows*&facet=idc,os_version,cpu_count,logic_cpu_count,ram_size&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00270700454712 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000648021697998 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00359416007996 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0344240665436 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00449895858765 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.04585313797 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 13:16:33] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00276303291321 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000801801681519 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00382900238037 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.223458051682 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.0042028427124 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.234619855881 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 13:16:41] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 0, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00281310081482 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.000668048858643 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00372004508972 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11239,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0693650245667 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00427412986755 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0808877944946 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 13:16:45] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=1&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:252]: -[u'i_bu:\u4fe1\u606f\u6280\u672f\u90e8', u'os_version:*Windows*', u'status:\u5f85\u7528'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -信息技术部 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -*Windows* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:259]: -待用 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:310]: -SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id) --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:227]: -SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=332 - AND index_texts.value LIKE "信息技术部" -) AS A) as AA - INNER JOIN ( - SELECT texts.ci_id - FROM texts - WHERE texts.attr_id=81 - AND texts.value LIKE "%Windows%" -) as AAA USING(ci_id)) as AAAA - INNER JOIN ( - SELECT index_texts.ci_id - FROM index_texts - WHERE index_texts.attr_id=115 - AND index_texts.value LIKE "待用" -) as AAAAA USING(ci_id)) AS B INNER JOIN cis on cis.ci_id=B.ci_id ORDER BY B.ci_id ASC LIMIT 25, 25; --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:231]: -query ci ids time is: 0.00271892547607 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:234]: -statistics ci ids time is: 0.00068211555481 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in search [/Users/pycook/PycharmProjects/cmdb-api/lib/search.py:313]: -query ci ids is: 0.00364398956299 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -WARNING in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:638]: -cache not hit............... --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:651]: -['index_floats', 'index_datetime', 'index_texts', 'index_integers', 'integers', 'texts', 'floats', 'datetime'] --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:656]: - - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ( - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_floats.ci_id, - index_floats.attr_id, - index_floats.value - FROM index_floats - INNER JOIN cis ON index_floats.ci_id=cis.ci_id - AND index_floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_datetime.ci_id, - index_datetime.attr_id, - index_datetime.value - FROM index_datetime - INNER JOIN cis ON index_datetime.ci_id=cis.ci_id - AND index_datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_datetime.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_texts.ci_id, - index_texts.attr_id, - index_texts.value - FROM index_texts - INNER JOIN cis ON index_texts.ci_id=cis.ci_id - AND index_texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - index_integers.ci_id, - index_integers.attr_id, - index_integers.value - FROM index_integers - INNER JOIN cis ON index_integers.ci_id=cis.ci_id - AND index_integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = index_integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - integers.ci_id, - integers.attr_id, - integers.value - FROM integers - INNER JOIN cis ON integers.ci_id=cis.ci_id - AND integers.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = integers.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - texts.ci_id, - texts.attr_id, - texts.value - FROM texts - INNER JOIN cis ON texts.ci_id=cis.ci_id - AND texts.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = texts.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - floats.ci_id, - floats.attr_id, - floats.value - FROM floats - INNER JOIN cis ON floats.ci_id=cis.ci_id - AND floats.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = floats.attr_id - UNION - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - datetime.ci_id, - datetime.attr_id, - datetime.value - FROM datetime - INNER JOIN cis ON datetime.ci_id=cis.ci_id - AND datetime.`ci_id` IN (11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288) - INNER JOIN ci_attributes as attr ON attr.attr_id = datetime.attr_id -) AS A - ORDER BY A.ci_id; - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -INFO in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:660]: -get cis time is: 0.0179951190948 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/lib/ci.py:703]: -result parser time is: 0.00405502319336 --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -DEBUG in ci [/Users/pycook/PycharmProjects/cmdb-api/core/ci.py:107]: -search time is :0.0288989543915 --------------------------------------------------------------------------------- -127.0.0.1 - - [18/May/2016 13:16:46] "GET /api/v0.1/ci/s?q=i_bu:%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E9%83%A8,os_version:*Windows*,status:%E5%BE%85%E7%94%A8&page=2&_key=20c4773dece64394bce23d074d19e609&_secret=ff6a222c01a3b89c8bbcd6c17abfe77d719437e1 HTTP/1.1" 200 - From 12ca296879f3aa8ace1bcf6d6fe64e46ba3b73b1 Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 28 Aug 2019 20:34:10 +0800 Subject: [PATCH 023/159] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E5=B9=B6=E5=BC=80=E6=BA=90UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 7 + .gitignore | 104 +++- LICENSE | 353 +------------- Makefile | 25 + Pipfile | 59 +++ README.md | 56 ++- __init__.py | 120 ----- api/__init__.py | 1 + api/app.py | 166 +++++++ {lib => api/commands}/__init__.py | 3 - api/commands/common.py | 152 ++++++ api/extensions.py | 21 + api/flask_cas/__init__.py | 78 +++ api/flask_cas/cas_urls.py | 122 +++++ api/flask_cas/routing.py | 164 +++++++ api/lib/__init__.py | 1 + api/lib/cmdb/__init__.py | 1 + api/lib/cmdb/attribute.py | 150 ++++++ api/lib/cmdb/cache.py | 138 ++++++ api/lib/cmdb/ci.py | 552 ++++++++++++++++++++++ api/lib/cmdb/ci_type.py | 392 ++++++++++++++++ api/lib/cmdb/const.py | 148 ++++++ api/lib/cmdb/history.py | 126 +++++ api/lib/cmdb/preference.py | 137 ++++++ api/lib/cmdb/query_sql.py | 63 +++ api/lib/cmdb/relation_type.py | 37 ++ api/lib/cmdb/search.py | 356 ++++++++++++++ api/lib/cmdb/value.py | 138 ++++++ api/lib/database.py | 121 +++++ api/lib/decorator.py | 35 ++ api/lib/exception.py | 5 + api/lib/http_cli.py | 48 ++ api/lib/mail.py | 49 ++ api/lib/perm/__init__.py | 1 + api/lib/perm/acl.py | 139 ++++++ api/lib/perm/auth.py | 102 ++++ {lib => api/lib}/utils.py | 77 ++- api/models/__init__.py | 5 + {models => api/models}/account.py | 112 ++--- api/models/cmdb.py | 325 +++++++++++++ api/resource.py | 45 ++ api/settings.py.example | 77 +++ api/tasks/__init__.py | 1 + {tasks => api/tasks}/cmdb.py | 19 +- api/tasks/test.py | 9 + api/views/__init__.py | 31 ++ api/views/account.py | 47 ++ api/views/cmdb/__init__.py | 1 + api/views/cmdb/attribute.py | 65 +++ api/views/cmdb/ci.py | 218 +++++++++ api/views/cmdb/ci_relation.py | 66 +++ api/views/cmdb/ci_type.py | 202 ++++++++ api/views/cmdb/ci_type_relation.py | 49 ++ api/views/cmdb/history.py | 63 +++ api/views/cmdb/preference.py | 89 ++++ api/views/cmdb/relation_type.py | 37 ++ api/views/permission.py | 49 ++ autoapp.py | 14 + celery_worker.py | 9 + cmdb_api.md | 11 +- command/__init__.py | 1 - config-sample.cfg | 61 --- core/__init__.py | 11 - core/account.py | 98 ---- core/attribute.py | 152 ------ core/ci.py | 216 --------- core/ci_relation.py | 70 --- core/ci_type.py | 89 ---- core/ci_type_relation.py | 55 --- core/history.py | 116 ----- core/statis.py | 12 - extensions.py | 19 - gunicornserver.py | 72 --- lib/account.py | 145 ------ lib/attribute.py | 168 ------- lib/auth.py | 64 --- lib/ci.py | 704 ---------------------------- lib/ci_type.py | 316 ------------- lib/const.py | 101 ---- lib/decorator.py | 74 --- lib/exception.py | 17 - lib/history.py | 75 --- lib/query_sql.py | 107 ----- lib/search.py | 365 -------------- lib/template/__init__.py | 1 - lib/template/filters.py | 9 - lib/value.py | 170 ------- manage.py | 77 --- models/__init__.py | 13 - models/attribute.py | 86 ---- models/ci.py | 19 - models/ci_relation.py | 26 - models/ci_type.py | 129 ----- models/ci_type_relation.py | 26 - models/ci_value.py | 117 ----- models/history.py | 50 -- models/statis.py | 20 - permissions.py | 9 - requirements/default.txt | 14 - setup.cfg | 11 + tasks/__init__.py | 1 - tasks/statis.py | 21 - templates/search.xml | 27 -- templates/search_tidy.xml | 19 - tests/__init__.py | 1 + tests/conftest.py | 24 + tests/test_cmdb_attribute.py | 1 + tests/test_cmdb_ci.py | 10 + tests/test_cmdb_ci_realtion.py | 1 + tests/test_cmdb_ci_type.py | 1 + tests/test_cmdb_ci_type_relation.py | 1 + tests/test_cmdb_history.py | 1 + tests/test_cmdb_preference.py | 1 + tests/test_cmdb_relation_type.py | 1 + ui | 1 + 115 files changed, 5244 insertions(+), 4543 deletions(-) create mode 100644 .env create mode 100644 Makefile create mode 100644 Pipfile delete mode 100644 __init__.py create mode 100644 api/__init__.py create mode 100644 api/app.py rename {lib => api/commands}/__init__.py (63%) create mode 100644 api/commands/common.py create mode 100644 api/extensions.py create mode 100644 api/flask_cas/__init__.py create mode 100644 api/flask_cas/cas_urls.py create mode 100644 api/flask_cas/routing.py create mode 100644 api/lib/__init__.py create mode 100644 api/lib/cmdb/__init__.py create mode 100644 api/lib/cmdb/attribute.py create mode 100644 api/lib/cmdb/cache.py create mode 100644 api/lib/cmdb/ci.py create mode 100644 api/lib/cmdb/ci_type.py create mode 100644 api/lib/cmdb/const.py create mode 100644 api/lib/cmdb/history.py create mode 100644 api/lib/cmdb/preference.py create mode 100644 api/lib/cmdb/query_sql.py create mode 100644 api/lib/cmdb/relation_type.py create mode 100644 api/lib/cmdb/search.py create mode 100644 api/lib/cmdb/value.py create mode 100644 api/lib/database.py create mode 100644 api/lib/decorator.py create mode 100644 api/lib/exception.py create mode 100644 api/lib/http_cli.py create mode 100644 api/lib/mail.py create mode 100644 api/lib/perm/__init__.py create mode 100644 api/lib/perm/acl.py create mode 100644 api/lib/perm/auth.py rename {lib => api/lib}/utils.py (53%) create mode 100644 api/models/__init__.py rename {models => api/models}/account.py (69%) create mode 100644 api/models/cmdb.py create mode 100644 api/resource.py create mode 100644 api/settings.py.example create mode 100644 api/tasks/__init__.py rename {tasks => api/tasks}/cmdb.py (51%) create mode 100644 api/tasks/test.py create mode 100644 api/views/__init__.py create mode 100644 api/views/account.py create mode 100644 api/views/cmdb/__init__.py create mode 100644 api/views/cmdb/attribute.py create mode 100644 api/views/cmdb/ci.py create mode 100644 api/views/cmdb/ci_relation.py create mode 100644 api/views/cmdb/ci_type.py create mode 100644 api/views/cmdb/ci_type_relation.py create mode 100644 api/views/cmdb/history.py create mode 100644 api/views/cmdb/preference.py create mode 100644 api/views/cmdb/relation_type.py create mode 100644 api/views/permission.py create mode 100644 autoapp.py create mode 100644 celery_worker.py delete mode 100644 command/__init__.py delete mode 100644 config-sample.cfg delete mode 100644 core/__init__.py delete mode 100644 core/account.py delete mode 100644 core/attribute.py delete mode 100644 core/ci.py delete mode 100644 core/ci_relation.py delete mode 100644 core/ci_type.py delete mode 100644 core/ci_type_relation.py delete mode 100644 core/history.py delete mode 100644 core/statis.py delete mode 100644 extensions.py delete mode 100644 gunicornserver.py delete mode 100644 lib/account.py delete mode 100644 lib/attribute.py delete mode 100644 lib/auth.py delete mode 100644 lib/ci.py delete mode 100644 lib/ci_type.py delete mode 100644 lib/const.py delete mode 100644 lib/decorator.py delete mode 100644 lib/exception.py delete mode 100644 lib/history.py delete mode 100644 lib/query_sql.py delete mode 100644 lib/search.py delete mode 100644 lib/template/__init__.py delete mode 100644 lib/template/filters.py delete mode 100644 lib/value.py delete mode 100644 manage.py delete mode 100644 models/__init__.py delete mode 100644 models/attribute.py delete mode 100644 models/ci.py delete mode 100644 models/ci_relation.py delete mode 100644 models/ci_type.py delete mode 100644 models/ci_type_relation.py delete mode 100644 models/ci_value.py delete mode 100644 models/history.py delete mode 100644 models/statis.py delete mode 100644 permissions.py delete mode 100644 requirements/default.txt create mode 100644 setup.cfg delete mode 100644 tasks/__init__.py delete mode 100644 tasks/statis.py delete mode 100644 templates/search.xml delete mode 100644 templates/search_tidy.xml create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/test_cmdb_attribute.py create mode 100644 tests/test_cmdb_ci.py create mode 100644 tests/test_cmdb_ci_realtion.py create mode 100644 tests/test_cmdb_ci_type.py create mode 100644 tests/test_cmdb_ci_type_relation.py create mode 100644 tests/test_cmdb_history.py create mode 100644 tests/test_cmdb_preference.py create mode 100644 tests/test_cmdb_relation_type.py create mode 160000 ui diff --git a/.env b/.env new file mode 100644 index 0000000..c005fda --- /dev/null +++ b/.env @@ -0,0 +1,7 @@ +# Environment variable overrides for local development +FLASK_APP=autoapp.py +FLASK_DEBUG=1 +FLASK_ENV=development +GUNICORN_WORKERS=1 +LOG_LEVEL=debug +SECRET_KEY='YourSecretKey' diff --git a/.gitignore b/.gitignore index f76ea86..e07e230 100755 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,95 @@ *~ -*.pyc .idea -data -logs/* +.vscode +migrates +*/logs/* +config.cfg *.sql -test/* -tools/* -cmdb_agent/* +logs/* *.log +*_packed.js +*_packed.css *.orig *.zip -*.swp -config.cfg -*.tar.gz -core/special.py -lib/special -lib/audit* -templates/*audit* -codeLin* -lib/spec_* +nohup.out +.DS_Store +*.py[cod] + +# C extensions +*.so + +# Packages +*.egg +*.egg-info +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg +#lib +#lib64 +Pipfile.lock + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox +nosetests.xml +.pytest_cache + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Complexity +output/*.html +output/*/index.html + +# Sphinx +docs/_build + +# Virtualenvs +env/ + + +# Configuration +api/settings.py +tests/settings.py + +# Development database +*.db + +# UI +ui/.DS_Store +ui/node_modules +ui/dist + +# local env files +ui/.env.local +ui/.env.*.local + +# Log files +ui/npm-debug.log* +ui/yarn-debug.log* +ui/yarn-error.log* +ui/yarn.lock + +# Editor directories and files +ui/.idea +ui/.vscode +ui/*.suo +ui/*.ntvs* +ui/*.njsproj +ui/*.sln +ui/*.sw* + + diff --git a/LICENSE b/LICENSE index 8cdb845..3098ec8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,340 +1,21 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 +MIT License - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. +Copyright (c) pycook - Preamble +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {description} - Copyright (C) {year} {fullname} - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - {signature of Ty Coon}, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cbd4424 --- /dev/null +++ b/Makefile @@ -0,0 +1,25 @@ +.PHONY: docs test + +help: + @echo " env create a development environment using virtualenv" + @echo " deps install dependencies using pip" + @echo " clean remove unwanted files like .pyc's" + @echo " lint check style with flake8" + @echo " test run all your tests using py.test" + +env: + sudo easy_install pip && \ + pip install pipenv && + make deps + +deps: + pipenv install --dev + +clean: + python manage.py clean + +lint: + flake8 --exclude=env . + +test: +py.test tests \ No newline at end of file diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..7459fd8 --- /dev/null +++ b/Pipfile @@ -0,0 +1,59 @@ +[[source]] +url = "https://mirrors.aliyun.com/pypi/simple" +verify_ssl = true +name = "pypi" + +[packages] +# Flask +Flask = "==1.0.3" +Werkzeug = "==0.15.4" +click = ">=5.0" +# Api +Flask-RESTful = "==0.3.7" +# Database +Flask-SQLAlchemy = "==2.4.0" +SQLAlchemy = "==1.3.5" +PyMySQL = "==0.9.3" +redis = "==3.2.1" +# Migrations +Flask-Migrate = "==2.5.2" +# Deployment +gevent = "==1.4.0" +gunicorn = ">=19.1.1" +supervisor = "==4.0.3" +# Auth +Flask-Login = "==0.4.1" +Flask-Bcrypt = "==0.7.1" +Flask-Cors = ">=3.0.8" +# Caching +Flask-Caching = ">=1.0.0" +# Environment variable parsing +environs = "==4.2.0" +marshmallow = "==2.20.2" +# async tasks +celery = "==4.3.0" +more-itertools = "==5.0.0" +kombu = "==4.4.0" +# other +six = "==1.12.0" +bs4 = ">=0.0.1" +toposort = ">=1.5" +requests = ">=2.22.0" +PyJWT = ">=1.7.1" + +[dev-packages] +# Testing +pytest = "==4.6.5" +WebTest = "==2.0.33" +factory-boy = "==2.12.*" +pdbpp = "==0.10.0" +# Lint and code style +flake8 = "==3.7.7" +flake8-blind-except = "==0.1.1" +flake8-debugger = "==3.1.0" +flake8-docstrings = "==1.3.0" +flake8-isort = "==2.7.0" +isort = "==4.3.21" +pep8-naming = "==0.8.2" +pydocstyle = "==3.0.0" + diff --git a/README.md b/README.md index ced09e7..61a4dbb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,54 @@ -## cmdb +

CMDB

+
+尽可能实现比较通用的运维资产数据的配置和管理 +
+ +
+ +[![License](https://img.shields.io/badge/License-mit-brightgreen)](https://github.com/pycook/cmdb/blob/master/LICENSE) +[![UI](https://img.shields.io/badge/UI-Ant%20Design%20Pro%20Vue-brightgreen)](https://github.com/sendya/ant-design-pro-vue) +[![API](https://img.shields.io/badge/API-Flask-brightgreen)](https://github.com/pallets/flask) + +
+ + + +- 在线预览: [CMDB](url "http://39.100.252.148:8000") + - username: admin + - password: admin + +Overview +---- +![基础资源视图](ui/public/cmdb01.jpeg) + +![模型配置](ui/public/cmdb02.jpeg) + +环境和依赖 +---- +- 存储: mysql, redis +- python版本: python2.7, >=python3.6 + + +安装 +---- +- 创建数据库cmdb + +- 拉取代码 +```bash +git clone https://github.com/pycook/cmdb.git +cd cmdb +cp api/settings.py.example api/settings.py +``` +设置api/settings.py里的database + +- 安装库 + - 后端: ```pipenv run pipenv install``` + - 前端: ```cd ui && yarn install && cd ..``` + +- 创建数据库表 ```flask run flask db-setup``` + +- 启动服务 + - 后端: ```pipenv run flask run``` + - 前端: ```cd ui && yarn run serve``` + - 浏览器打开: [http://127.0.0.1:8000](http://127.0.0.1:8000) -### cmdb即配置管理数据库 -### 该部分为API,Portal即将单独开源 \ No newline at end of file diff --git a/__init__.py b/__init__.py deleted file mode 100644 index 94f505e..0000000 --- a/__init__.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import logging -from logging.handlers import SMTPHandler -from logging.handlers import TimedRotatingFileHandler - -from flask import Flask -from flask import request -from flask import g -from flask.ext.babel import Babel -from flask.ext.principal import identity_loaded -from flask.ext.principal import Principal - -import core -from extensions import db -from extensions import mail -from extensions import cache -from extensions import celery -from extensions import rd -from models.account import User -from lib.template import filters - - -APP_NAME = "CMDB-API" - -MODULES = ( - (core.attribute, "/api/v0.1/attributes"), - (core.citype, "/api/v0.1/citypes"), - (core.cityperelation, "/api/v0.1/cityperelations"), - (core.cirelation, "/api/v0.1/cirelations"), - (core.ci, "/api/v0.1/ci"), - (core.history, "/api/v0.1/history"), - (core.account, "/api/v0.1/accounts"), - (core.special, ""), -) - - -def make_app(config=None, modules=None): - if not modules: - modules = MODULES - app = Flask(APP_NAME) - app.config.from_pyfile(config) - configure_extensions(app) - configure_i18n(app) - configure_identity(app) - configure_blueprints(app, modules) - configure_logging(app) - configure_template_filters(app) - return app - - -def configure_extensions(app): - db.app = app - db.init_app(app) - mail.init_app(app) - cache.init_app(app) - celery.init_app(app) - rd.init_app(app) - - -def configure_i18n(app): - babel = Babel(app) - - @babel.localeselector - def get_locale(): - accept_languages = app.config.get('ACCEPT_LANGUAGES', ['en', 'zh']) - return request.accept_languages.best_match(accept_languages) - - -def configure_modules(app, modules): - for module, url_prefix in modules: - app.register_module(module, url_prefix=url_prefix) - - -def configure_blueprints(app, modules): - for module, url_prefix in modules: - app.register_blueprint(module, url_prefix=url_prefix) - - -def configure_identity(app): - principal = Principal(app) - @identity_loaded.connect_via(app) - def on_identity_loaded(sender, identity): - g.user = User.query.from_identity(identity) - - -def configure_logging(app): - hostname = os.uname()[1] - mail_handler = SMTPHandler( - app.config['MAIL_SERVER'], - app.config['DEFAULT_MAIL_SENDER'], - app.config['ADMINS'], - '[%s] CMDB API error' % hostname, - ( - app.config['MAIL_USERNAME'], - app.config['MAIL_PASSWORD'], - ) - ) - mail_formater = logging.Formatter( - "%(asctime)s %(levelname)s %(pathname)s %(lineno)d\n%(message)s") - mail_handler.setFormatter(mail_formater) - mail_handler.setLevel(logging.ERROR) - if not app.debug: - app.logger.addHandler(mail_handler) - formatter = logging.Formatter( - "%(asctime)s %(levelname)s %(pathname)s %(lineno)d - %(message)s") - log_file = app.config['LOG_PATH'] - file_handler = TimedRotatingFileHandler( - log_file, when='d', interval=1, backupCount=7) - file_handler.setLevel(getattr(logging, app.config['LOG_LEVEL'])) - file_handler.setFormatter(formatter) - app.logger.addHandler(file_handler) - app.logger.setLevel(getattr(logging, app.config['LOG_LEVEL'])) - - -def configure_template_filters(app): - for name in dir(filters): - if callable(getattr(filters, name)): - app.add_template_filter(getattr(filters, name)) diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000..380474e --- /dev/null +++ b/api/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- diff --git a/api/app.py b/api/app.py new file mode 100644 index 0000000..a63f3bf --- /dev/null +++ b/api/app.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- +"""The app module, containing the app factory function.""" +import os +import sys +import logging +from logging.handlers import RotatingFileHandler +from inspect import getmembers + +from flask import Flask +from flask import make_response, jsonify +from flask.blueprints import Blueprint +from flask.cli import click + +import api.views +from api.models.account import User +from api.flask_cas import CAS +from api.extensions import ( + bcrypt, + cors, + cache, + db, + login_manager, + migrate, + celery, + rd, +) + +HERE = os.path.abspath(os.path.dirname(__file__)) +PROJECT_ROOT = os.path.join(HERE, os.pardir) +API_PACKAGE = "api" + + +@login_manager.user_loader +def load_user(user_id): + """Load user by ID.""" + return User.get_by_id(int(user_id)) + + +class ReverseProxy(object): + """Wrap the application in this middleware and configure the + front-end server to add these headers, to let you quietly bind + this to a URL other than / and to an HTTP scheme that is + different than what is used locally. + + In nginx: + location /myprefix { + proxy_pass http://192.168.0.1:5001; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Scheme $scheme; + proxy_set_header X-Script-Name /myprefix; + } + + :param app: the WSGI application + """ + + def __init__(self, app): + self.app = app + + def __call__(self, environ, start_response): + script_name = environ.get('HTTP_X_SCRIPT_NAME', '') + if script_name: + environ['SCRIPT_NAME'] = script_name + path_info = environ['PATH_INFO'] + if path_info.startswith(script_name): + environ['PATH_INFO'] = path_info[len(script_name):] + + scheme = environ.get('HTTP_X_SCHEME', '') + if scheme: + environ['wsgi.url_scheme'] = scheme + return self.app(environ, start_response) + + +def create_app(config_object="{0}.settings".format(API_PACKAGE)): + """Create application factory, as explained here: http://flask.pocoo.org/docs/patterns/appfactories/. + + :param config_object: The configuration object to use. + """ + app = Flask(__name__.split(".")[0]) + app.config.from_object(config_object) + register_extensions(app) + register_blueprints(app) + register_error_handlers(app) + register_shell_context(app) + register_commands(app) + configure_logger(app) + CAS(app) + app.wsgi_app = ReverseProxy(app.wsgi_app) + return app + + +def register_extensions(app): + """Register Flask extensions.""" + bcrypt.init_app(app) + cache.init_app(app) + db.init_app(app) + cors.init_app(app) + login_manager.init_app(app) + migrate.init_app(app, db) + rd.init_app(app) + celery.conf.update(app.config) + + +def register_blueprints(app): + for item in getmembers(api.views): + if item[0].startswith("blueprint") and isinstance(item[1], Blueprint): + app.register_blueprint(item[1]) + + +def register_error_handlers(app): + """Register error handlers.""" + + def render_error(error): + """Render error template.""" + import traceback + app.logger.error(traceback.format_exc()) + error_code = getattr(error, "code", 500) + return make_response(jsonify(message=str(error)), error_code) + + for errcode in app.config.get("ERROR_CODES") or [400, 401, 403, 404, 405, 500, 502]: + app.errorhandler(errcode)(render_error) + app.handle_exception = render_error + + +def register_shell_context(app): + """Register shell context objects.""" + + def shell_context(): + """Shell context objects.""" + return {"db": db, "User": User} + + app.shell_context_processor(shell_context) + + +def register_commands(app): + """Register Click commands.""" + for root, _, files in os.walk(os.path.join(HERE, "commands")): + for filename in files: + if not filename.startswith("_") and filename.endswith("py"): + module_path = os.path.join(API_PACKAGE, root[root.index("commands"):]) + if module_path not in sys.path: + sys.path.insert(1, module_path) + command = __import__(os.path.splitext(filename)[0]) + func_list = [o[0] for o in getmembers(command) if isinstance(o[1], click.core.Command)] + for func_name in func_list: + app.cli.add_command(getattr(command, func_name)) + + +def configure_logger(app): + """Configure loggers.""" + handler = logging.StreamHandler(sys.stdout) + formatter = logging.Formatter( + "%(asctime)s %(levelname)s %(pathname)s %(lineno)d - %(message)s") + + if app.debug: + handler.setFormatter(formatter) + app.logger.addHandler(handler) + + log_file = app.config['LOG_PATH'] + file_handler = RotatingFileHandler(log_file, + maxBytes=2 ** 30, + backupCount=7) + file_handler.setLevel(getattr(logging, app.config['LOG_LEVEL'])) + file_handler.setFormatter(formatter) + app.logger.addHandler(file_handler) + app.logger.setLevel(getattr(logging, app.config['LOG_LEVEL'])) diff --git a/lib/__init__.py b/api/commands/__init__.py similarity index 63% rename from lib/__init__.py rename to api/commands/__init__.py index ef612ed..3b26f17 100644 --- a/lib/__init__.py +++ b/api/commands/__init__.py @@ -1,4 +1 @@ # -*- coding:utf-8 -*- - - -__all__ = [] \ No newline at end of file diff --git a/api/commands/common.py b/api/commands/common.py new file mode 100644 index 0000000..1abe98b --- /dev/null +++ b/api/commands/common.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- +"""Click commands.""" +import os +from glob import glob +from subprocess import call + +import click +from flask import current_app +from flask.cli import with_appcontext +from werkzeug.exceptions import MethodNotAllowed, NotFound + +from api.extensions import db + +HERE = os.path.abspath(os.path.dirname(__file__)) +PROJECT_ROOT = os.path.join(HERE, os.pardir, os.pardir) +TEST_PATH = os.path.join(PROJECT_ROOT, "tests") + + +@click.command() +def test(): + """Run the tests.""" + import pytest + + rv = pytest.main([TEST_PATH, "--verbose"]) + exit(rv) + + +@click.command() +@click.option( + "-f", + "--fix-imports", + default=True, + is_flag=True, + help="Fix imports using isort, before linting", +) +@click.option( + "-c", + "--check", + default=False, + is_flag=True, + help="Don't make any changes to files, just confirm they are formatted correctly", +) +def lint(fix_imports, check): + """Lint and check code style with black, flake8 and isort.""" + skip = ["node_modules", "requirements", "migrations"] + root_files = glob("*.py") + root_directories = [ + name for name in next(os.walk("."))[1] if not name.startswith(".") + ] + files_and_directories = [ + arg for arg in root_files + root_directories if arg not in skip + ] + + def execute_tool(description, *args): + """Execute a checking tool with its arguments.""" + command_line = list(args) + files_and_directories + click.echo("{}: {}".format(description, " ".join(command_line))) + rv = call(command_line) + if rv != 0: + exit(rv) + + isort_args = ["-rc"] + black_args = [] + if check: + isort_args.append("-c") + black_args.append("--check") + if fix_imports: + execute_tool("Fixing import order", "isort", *isort_args) + execute_tool("Formatting style", "black", *black_args) + execute_tool("Checking code style", "flake8") + + +@click.command() +def clean(): + """Remove *.pyc and *.pyo files recursively starting at current directory. + + Borrowed from Flask-Script, converted to use Click. + """ + for dirpath, dirnames, filenames in os.walk("."): + for filename in filenames: + if filename.endswith(".pyc") or filename.endswith(".pyo"): + full_pathname = os.path.join(dirpath, filename) + click.echo("Removing {}".format(full_pathname)) + os.remove(full_pathname) + + +@click.command() +@click.option("--url", default=None, help="Url to test (ex. /static/image.png)") +@click.option( + "--order", default="rule", help="Property on Rule to order by (default: rule)" +) +@with_appcontext +def urls(url, order): + """Display all of the url matching routes for the project. + + Borrowed from Flask-Script, converted to use Click. + """ + rows = [] + column_headers = ("Rule", "Endpoint", "Arguments") + + if url: + try: + rule, arguments = current_app.url_map.bind("localhost").match( + url, return_rule=True + ) + rows.append((rule.rule, rule.endpoint, arguments)) + column_length = 3 + except (NotFound, MethodNotAllowed) as e: + rows.append(("<{}>".format(e), None, None)) + column_length = 1 + else: + rules = sorted( + current_app.url_map.iter_rules(), key=lambda rule: getattr(rule, order) + ) + for rule in rules: + rows.append((rule.rule, rule.endpoint, None)) + column_length = 2 + + str_template = "" + table_width = 0 + + if column_length >= 1: + max_rule_length = max(len(r[0]) for r in rows) + max_rule_length = max_rule_length if max_rule_length > 4 else 4 + str_template += "{:" + str(max_rule_length) + "}" + table_width += max_rule_length + + if column_length >= 2: + max_endpoint_length = max(len(str(r[1])) for r in rows) + max_endpoint_length = max_endpoint_length if max_endpoint_length > 8 else 8 + str_template += " {:" + str(max_endpoint_length) + "}" + table_width += 2 + max_endpoint_length + + if column_length >= 3: + max_arguments_length = max(len(str(r[2])) for r in rows) + max_arguments_length = max_arguments_length if max_arguments_length > 9 else 9 + str_template += " {:" + str(max_arguments_length) + "}" + table_width += 2 + max_arguments_length + + click.echo(str_template.format(*column_headers[:column_length])) + click.echo("-" * table_width) + + for row in rows: + click.echo(str_template.format(*row[:column_length])) + + +@click.command() +@with_appcontext +def db_setup(): + """create tables + """ + db.create_all() diff --git a/api/extensions.py b/api/extensions.py new file mode 100644 index 0000000..02706db --- /dev/null +++ b/api/extensions.py @@ -0,0 +1,21 @@ +# -*- coding:utf-8 -*- + + +from flask_bcrypt import Bcrypt +from flask_caching import Cache +from flask_login import LoginManager +from flask_migrate import Migrate +from flask_sqlalchemy import SQLAlchemy +from flask_cors import CORS +from celery import Celery + +from api.lib.utils import RedisHandler + +bcrypt = Bcrypt() +login_manager = LoginManager() +db = SQLAlchemy() +migrate = Migrate() +cache = Cache() +celery = Celery() +cors = CORS(supports_credentials=True) +rd = RedisHandler(prefix="CMDB_CI") # TODO diff --git a/api/flask_cas/__init__.py b/api/flask_cas/__init__.py new file mode 100644 index 0000000..dc31cf5 --- /dev/null +++ b/api/flask_cas/__init__.py @@ -0,0 +1,78 @@ +# -*- coding:utf-8 -*- + +""" +flask_cas.__init__ +""" + +import flask +from flask import current_app + +# Find the stack on which we want to store the database connection. +# Starting with Flask 0.9, the _app_ctx_stack is the correct one, +# before that we need to use the _request_ctx_stack. +try: + from flask import _app_ctx_stack as stack +except ImportError: + from flask import _request_ctx_stack as stack + +from api.flask_cas import routing + + +class CAS(object): + """ + Required Configs: + + |Key | + |----------------| + |CAS_SERVER | + |CAS_AFTER_LOGIN | + + Optional Configs: + + |Key | Default | + |-------------------------|----------------| + |CAS_TOKEN_SESSION_KEY | _CAS_TOKEN | + |CAS_USERNAME_SESSION_KEY | CAS_USERNAME | + |CAS_LOGIN_ROUTE | '/cas' | + |CAS_LOGOUT_ROUTE | '/cas/logout' | + |CAS_VALIDATE_ROUTE | '/cas/validate'| + """ + + def __init__(self, app=None, url_prefix=None): + self._app = app + if app is not None: + self.init_app(app, url_prefix) + + def init_app(self, app, url_prefix=None): + # Configuration defaults + app.config.setdefault('CAS_TOKEN_SESSION_KEY', '_CAS_TOKEN') + app.config.setdefault('CAS_USERNAME_SESSION_KEY', 'CAS_USERNAME') + app.config.setdefault('CAS_LOGIN_ROUTE', '/login') + app.config.setdefault('CAS_LOGOUT_ROUTE', '/logout') + app.config.setdefault('CAS_VALIDATE_ROUTE', '/serviceValidate') + # Register Blueprint + app.register_blueprint(routing.blueprint, url_prefix=url_prefix) + + # Use the newstyle teardown_appcontext if it's available, + # otherwise fall back to the request context + if hasattr(app, 'teardown_appcontext'): + app.teardown_appcontext(self.teardown) + else: + app.teardown_request(self.teardown) + + def teardown(self, exception): + ctx = stack.top + + @property + def app(self): + return self._app or current_app + + @property + def username(self): + return flask.session.get( + self.app.config['CAS_USERNAME_SESSION_KEY'], None) + + @property + def token(self): + return flask.session.get( + self.app.config['CAS_TOKEN_SESSION_KEY'], None) \ No newline at end of file diff --git a/api/flask_cas/cas_urls.py b/api/flask_cas/cas_urls.py new file mode 100644 index 0000000..34e15d3 --- /dev/null +++ b/api/flask_cas/cas_urls.py @@ -0,0 +1,122 @@ +# -*- coding:utf-8 -*- + +""" +flask_cas.cas_urls + +Functions for creating urls to access CAS. +""" +from six.moves.urllib.parse import quote +from six.moves.urllib.parse import urlencode +from six.moves.urllib.parse import urljoin + + +def create_url(base, path=None, *query): + """ Create a url. + + Creates a url by combining base, path, and the query's list of + key/value pairs. Escaping is handled automatically. Any + key/value pair with a value that is None is ignored. + + Keyword arguments: + base -- The left most part of the url (ex. http://localhost:5000). + path -- The path after the base (ex. /foo/bar). + query -- A list of key value pairs (ex. [('key', 'value')]). + + Example usage: + >>> create_url( + ... 'http://localhost:5000', + ... 'foo/bar', + ... ('key1', 'value'), + ... ('key2', None), # Will not include None + ... ('url', 'http://example.com'), + ... ) + 'http://localhost:5000/foo/bar?key1=value&url=http%3A%2F%2Fexample.com' + """ + url = base + # Add the path to the url if it's not None. + if path is not None: + url = urljoin(url, quote(path)) + # Remove key/value pairs with None values. + query = filter(lambda pair: pair[1] is not None, query) + # Add the query string to the url + url = urljoin(url, '?{0}'.format(urlencode(list(query)))) + return url + + +def create_cas_login_url(cas_url, cas_route, service, + renew=None, gateway=None): + """ Create a CAS login URL . + + Keyword arguments: + cas_url -- The url to the CAS (ex. http://sso.pdx.edu) + cas_route -- The route where the CAS lives on server (ex. /cas) + service -- (ex. http://localhost:5000/login) + renew -- "true" or "false" + gateway -- "true" or "false" + + Example usage: + >>> create_cas_login_url( + ... 'http://sso.pdx.edu', + ... '/cas', + ... 'http://localhost:5000', + ... ) + 'http://sso.pdx.edu/cas?service=http%3A%2F%2Flocalhost%3A5000' + """ + return create_url( + cas_url, + cas_route, + ('service', service), + ('renew', renew), + ('gateway', gateway), + ) + + +def create_cas_logout_url(cas_url, cas_route, url=None): + """ Create a CAS logout URL. + + Keyword arguments: + cas_url -- The url to the CAS (ex. http://sso.pdx.edu) + cas_route -- The route where the CAS lives on server (ex. /cas/logout) + url -- (ex. http://localhost:5000/login) + + Example usage: + >>> create_cas_logout_url( + ... 'http://sso.pdx.edu', + ... '/cas/logout', + ... 'http://localhost:5000', + ... ) + 'http://sso.pdx.edu/cas/logout?url=http%3A%2F%2Flocalhost%3A5000' + """ + return create_url( + cas_url, + cas_route, + ('service', url), + ) + + +def create_cas_validate_url(cas_url, cas_route, service, ticket, + renew=None): + """ Create a CAS validate URL. + + Keyword arguments: + cas_url -- The url to the CAS (ex. http://sso.pdx.edu) + cas_route -- The route where the CAS lives on server (ex. /cas/validate) + service -- (ex. http://localhost:5000/login) + ticket -- (ex. 'ST-58274-x839euFek492ou832Eena7ee-cas') + renew -- "true" or "false" + + Example usage: + >>> create_cas_validate_url( + ... 'http://sso.pdx.edu', + ... '/cas/validate', + ... 'http://localhost:5000/login', + ... 'ST-58274-x839euFek492ou832Eena7ee-cas' + ... ) + """ + return create_url( + cas_url, + cas_route, + ('service', service), + ('ticket', ticket), + ('renew', renew), + ) \ No newline at end of file diff --git a/api/flask_cas/routing.py b/api/flask_cas/routing.py new file mode 100644 index 0000000..e726f32 --- /dev/null +++ b/api/flask_cas/routing.py @@ -0,0 +1,164 @@ +# -*- coding:utf-8 -*- + +import json + +import bs4 +from six.moves.urllib_request import urlopen + +from flask import Blueprint +from flask_login import login_user, logout_user +from flask import current_app, session, request, url_for, redirect + +from .cas_urls import create_cas_login_url +from .cas_urls import create_cas_logout_url +from .cas_urls import create_cas_validate_url + +from api.models.account import UserCache + +blueprint = Blueprint('cas', __name__) + + +@blueprint.route('/api/sso/login') +def login(): + """ + This route has two purposes. First, it is used by the user + to login. Second, it is used by the CAS to respond with the + `ticket` after the user logs in successfully. + + When the user accesses this url, they are redirected to the CAS + to login. If the login was successful, the CAS will respond to this + route with the ticket in the url. The ticket is then validated. + If validation was successful the logged in username is saved in + the user's session under the key `CAS_USERNAME_SESSION_KEY`. + """ + + cas_token_session_key = current_app.config['CAS_TOKEN_SESSION_KEY'] + if request.values.get("next"): + session["next"] = request.values.get("next") + + _service = url_for('cas.login', _external=True, next=session["next"]) \ + if session.get("next") else url_for('cas.login', _external=True) + redirect_url = create_cas_login_url( + current_app.config['CAS_SERVER'], + current_app.config['CAS_LOGIN_ROUTE'], + _service) + + if 'ticket' in request.args: + session[cas_token_session_key] = request.args.get('ticket') + + if request.args.get('ticket'): + + if validate(request.args['ticket']): + redirect_url = session.get("next") or \ + current_app.config.get("CAS_AFTER_LOGIN") + username = session.get("CAS_USERNAME") + user = UserCache.get(username) + login_user(user) + + session.permanent = True + + else: + del session[cas_token_session_key] + redirect_url = create_cas_login_url( + current_app.config['CAS_SERVER'], + current_app.config['CAS_LOGIN_ROUTE'], + url_for('cas.login', _external=True), + renew=True) + current_app.logger.info("redirect to: {0}".format(redirect_url)) + return redirect(redirect_url) + + +@blueprint.route('/api/sso/logout') +def logout(): + """ + When the user accesses this route they are logged out. + """ + + cas_username_session_key = current_app.config['CAS_USERNAME_SESSION_KEY'] + cas_token_session_key = current_app.config['CAS_TOKEN_SESSION_KEY'] + + cas_username_session_key in session and session.pop(cas_username_session_key) + "acl" in session and session.pop("acl") + "uid" in session and session.pop("uid") + cas_token_session_key in session and session.pop(cas_token_session_key) + "next" in session and session.pop("next") + + redirect_url = create_cas_logout_url( + current_app.config['CAS_SERVER'], + current_app.config['CAS_LOGOUT_ROUTE'], + url_for('cas.login', _external=True, next=request.referrer)) + + logout_user() + + current_app.logger.debug('Redirecting to: {0}'.format(redirect_url)) + + return redirect(redirect_url) + + +def validate(ticket): + """ + Will attempt to validate the ticket. If validation fails, then False + is returned. If validation is successful, then True is returned + and the validated username is saved in the session under the + key `CAS_USERNAME_SESSION_KEY`. + """ + + cas_username_session_key = current_app.config['CAS_USERNAME_SESSION_KEY'] + + current_app.logger.debug("validating token {0}".format(ticket)) + + cas_validate_url = create_cas_validate_url( + current_app.config['CAS_VALIDATE_SERVER'], + current_app.config['CAS_VALIDATE_ROUTE'], + url_for('cas.login', _external=True), + ticket) + + current_app.logger.debug("Making GET request to {0}".format(cas_validate_url)) + + try: + response = urlopen(cas_validate_url).read() + ticketid = _parse_tag(response, "cas:user") + strs = [s.strip() for s in ticketid.split('|') if s.strip()] + username, is_valid = None, False + if len(strs) == 1: + username = strs[0] + is_valid = True + user_info = json.loads(_parse_tag(response, "cas:other")) + current_app.logger.info(user_info) + except ValueError: + current_app.logger.error("CAS returned unexpected result") + is_valid = False + return is_valid + + if is_valid: + current_app.logger.debug("valid") + session[cas_username_session_key] = username + user = UserCache.get(username) + session["acl"] = dict(uid=user_info.get("uuid"), + avatar=user.avatar if user else user_info.get("avatar"), + userId=user_info.get("id"), + userName=user_info.get("name"), + nickName=user_info.get("nickname"), + parentRoles=user_info.get("parents"), + childRoles=user_info.get("children"), + roleName=user_info.get("role")) + session["uid"] = user_info.get("uuid") + current_app.logger.debug(session) + current_app.logger.debug(request.url) + else: + current_app.logger.debug("invalid") + + return is_valid + + +def _parse_tag(string, tag): + """ + Used for parsing xml. Search string for the first occurence of + ..... and return text (stripped of leading and tailing + whitespace) between tags. Return "" if tag not found. + """ + soup = bs4.BeautifulSoup(string) + + if soup.find(tag) is None: + return '' + return soup.find(tag).string.strip() diff --git a/api/lib/__init__.py b/api/lib/__init__.py new file mode 100644 index 0000000..3b26f17 --- /dev/null +++ b/api/lib/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- diff --git a/api/lib/cmdb/__init__.py b/api/lib/cmdb/__init__.py new file mode 100644 index 0000000..380474e --- /dev/null +++ b/api/lib/cmdb/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- diff --git a/api/lib/cmdb/attribute.py b/api/lib/cmdb/attribute.py new file mode 100644 index 0000000..f36de13 --- /dev/null +++ b/api/lib/cmdb/attribute.py @@ -0,0 +1,150 @@ +# -*- coding:utf-8 -*- + +from flask import current_app +from flask import abort + +from api.extensions import db +from api.models.cmdb import Attribute +from api.models.cmdb import CITypeAttribute +from api.models.cmdb import PreferenceShowAttributes +from api.lib.cmdb.cache import AttributeCache +from api.lib.cmdb.const import type_map +from api.lib.decorator import kwargs_required + + +class AttributeManager(object): + """ + CI attributes manager + """ + + def __init__(self): + pass + + @staticmethod + def get_choice_values(attr_id, value_type): + choice_table = type_map.get("choice").get(value_type) + choice_values = choice_table.get_by(fl=["value"], attr_id=attr_id) + return [choice_value["value"] for choice_value in choice_values] + + @staticmethod + def _add_choice_values(_id, value_type, choice_values): + choice_table = type_map.get("choice").get(value_type) + + db.session.query(choice_table).filter(choice_table.attr_id == _id).delete() + db.session.flush() + choice_values = choice_values + for v in choice_values: + table = choice_table(attr_id=_id, value=v) + db.session.add(table) + db.session.flush() + + def get_attributes(self, name=None): + """ + :param name: + :return: attribute, if name is None, then return all attributes + """ + attrs = Attribute.get_by_like(name=name) if name is not None else Attribute.get_by() + res = list() + for attr in attrs: + attr["is_choice"] and attr.update(dict(choice_value=self.get_choice_values(attr["id"], attr["value_type"]))) + res.append(attr) + return res + + def get_attribute_by_name(self, name): + attr = Attribute.get_by(name=name, first=True) + if attr and attr["is_choice"]: + attr.update(dict(choice_value=self.get_choice_values(attr["id"], attr["value_type"]))) + return attr + + def get_attribute_by_alias(self, alias): + attr = Attribute.get_by(alias=alias, first=True) + if attr and attr["is_choice"]: + attr.update(dict(choice_value=self.get_choice_values(attr["id"], attr["value_type"]))) + return attr + + def get_attribute_by_id(self, _id): + attr = Attribute.get_by_id(_id).to_dict() + if attr and attr["is_choice"]: + attr.update(dict(choice_value=self.get_choice_values(attr["id"], attr["value_type"]))) + return attr + + def get_attribute(self, key): + attr = AttributeCache.get(key).to_dict() + if attr and attr["is_choice"]: + attr.update(dict(choice_value=self.get_choice_values(attr["id"], attr["value_type"]))) + return attr + + @classmethod + @kwargs_required("name") + def add(cls, **kwargs): + choice_value = kwargs.pop("choice_value", []) + kwargs.pop("is_choice", None) + is_choice = True if choice_value else False + name = kwargs.pop("name") + alias = kwargs.pop("alias", "") + alias = name if not alias else alias + Attribute.get_by(name=name, first=True) and abort(400, "attribute {0} is already existed".format(name)) + + attr = Attribute.create(flush=True, + name=name, + alias=alias, + is_choice=is_choice, + **kwargs) + + if choice_value: + cls._add_choice_values(attr.id, attr.value_type, choice_value) + + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("add attribute error, {0}".format(str(e))) + return abort(400, "add attribute <{0}> failed".format(name)) + + AttributeCache.clean(attr) + + return attr.id + + def update(self, _id, **kwargs): + attr = Attribute.get_by_id(_id) or abort(404, "Attribute <{0}> does not exist".format(_id)) + + choice_value = kwargs.pop("choice_value", False) + is_choice = True if choice_value else False + + attr.update(flush=True, **kwargs) + + if is_choice: + self._add_choice_values(attr.id, attr.value_type, choice_value) + + try: + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.error("update attribute error, {0}".format(str(e))) + return abort(400, "update attribute <{0}> failed".format(_id)) + + AttributeCache.clean(attr) + + return attr.id + + @staticmethod + def delete(_id): + attr = Attribute.get_by_id(_id) or abort(404, "Attribute <{0}> does not exist".format(_id)) + name = attr.name + + if attr.is_choice: + choice_table = type_map["choice"].get(attr.value_type) + db.session.query(choice_table).filter(choice_table.attr_id == _id).delete() # FIXME: session conflict + db.session.flush() + + AttributeCache.clean(attr) + + attr.soft_delete() + + for i in CITypeAttribute.get_by(attr_id=_id, to_dict=False): + i.soft_delete() + + for i in PreferenceShowAttributes.get_by(attr_id=_id, to_dict=False): + i.soft_delete() + + return name diff --git a/api/lib/cmdb/cache.py b/api/lib/cmdb/cache.py new file mode 100644 index 0000000..08f25b9 --- /dev/null +++ b/api/lib/cmdb/cache.py @@ -0,0 +1,138 @@ +# -*- coding:utf-8 -*- + +import six +if six.PY2: + import sys + reload(sys) + sys.setdefaultencoding("utf-8") + +from api.extensions import cache +from api.models.cmdb import Attribute +from api.models.cmdb import CIType +from api.models.cmdb import CITypeAttribute +from api.models.cmdb import RelationType + + +class AttributeCache(object): + @classmethod + def get(cls, key): + if key is None: + return + attr = cache.get('Field::Name::{0}'.format(key)) \ + or cache.get('Field::ID::{0}'.format(key)) \ + or cache.get('Field::Alias::{0}'.format(key)) + + if attr is None: + attr = Attribute.get_by(name=key, first=True, to_dict=False) \ + or Attribute.get_by_id(key) \ + or Attribute.get_by(alias=key, first=True, to_dict=False) + if attr is not None: + cls.set(attr) + return attr + + @classmethod + def set(cls, attr): + cache.set('Field::ID::{0}'.format(attr.id), attr) + cache.set('Field::Name::{0}'.format(attr.name), attr) + cache.set('Field::Alias::{0}'.format(attr.alias), attr) + + @classmethod + def clean(cls, attr): + cache.delete('Field::ID::{0}'.format(attr.id)) + cache.delete('Field::Name::{0}'.format(attr.name)) + cache.delete('Field::Alias::{0}'.format(attr.alias)) + + +class CITypeCache(object): + @classmethod + def get(cls, key): + if key is None: + return + ct = cache.get("CIType::ID::{0}".format(key)) or \ + cache.get("CIType::Name::{0}".format(key)) or \ + cache.get("CIType::Alias::{0}".format(key)) + if ct is None: + ct = CIType.get_by(name=key, first=True, to_dict=False) or \ + CIType.get_by_id(key) or \ + CIType.get_by(alias=key, first=True, to_dict=False) + if ct is not None: + cls.set(ct) + return ct + + @classmethod + def set(cls, ct): + cache.set("CIType::Name::{0}".format(ct.name), ct) + cache.set("CIType::ID::{0}".format(ct.id), ct) + cache.set("CIType::Alias::{0}".format(ct.alias), ct) + + @classmethod + def clean(cls, key): + ct = cls.get(key) + if ct is not None: + cache.delete("CIType::Name::{0}".format(ct.name)) + cache.delete("CIType::ID::{0}".format(ct.id)) + cache.delete("CIType::Alias::{0}".format(ct.alias)) + + +class RelationTypeCache(object): + @classmethod + def get(cls, key): + if key is None: + return + ct = cache.get("RelationType::ID::{0}".format(key)) or \ + cache.get("RelationType::Name::{0}".format(key)) + if ct is None: + ct = RelationType.get_by(name=key, first=True, to_dict=False) or RelationType.get_by_id(key) + if ct is not None: + cls.set(ct) + return ct + + @classmethod + def set(cls, ct): + cache.set("RelationType::Name::{0}".format(ct.name), ct) + cache.set("RelationType::ID::{0}".format(ct.id), ct) + + @classmethod + def clean(cls, key): + ct = cls.get(key) + if ct is not None: + cache.delete("RelationType::Name::{0}".format(ct.name)) + cache.delete("RelationType::ID::{0}".format(ct.id)) + + +class CITypeAttributeCache(object): + """ + key is type_id or type_name + """ + + @classmethod + def get(cls, key): + if key is None: + return + + attrs = cache.get("CITypeAttribute::Name::{0}".format(key)) \ + or cache.get("CITypeAttribute::ID::{0}".format(key)) + if not attrs: + attrs = CITypeAttribute.get_by(type_id=key, to_dict=False) + if not attrs: + ci_type = CIType.get_by(name=key, first=True, to_dict=False) + if ci_type is not None: + attrs = CITypeAttribute.get_by(type_id=ci_type.id, to_dict=False) + if attrs is not None: + cls.set(key, attrs) + return attrs + + @classmethod + def set(cls, key, values): + ci_type = CITypeCache.get(key) + if ci_type is not None: + cache.set("CITypeAttribute::ID::{0}".format(ci_type.id), values) + cache.set("CITypeAttribute::Name::{0}".format(ci_type.name), values) + + @classmethod + def clean(cls, key): + ci_type = CITypeCache.get(key) + attrs = cls.get(key) + if attrs is not None and ci_type: + cache.delete("CITypeAttribute::ID::{0}".format(ci_type.id)) + cache.delete("CITypeAttribute::Name::{0}".format(ci_type.name)) diff --git a/api/lib/cmdb/ci.py b/api/lib/cmdb/ci.py new file mode 100644 index 0000000..e7f90c5 --- /dev/null +++ b/api/lib/cmdb/ci.py @@ -0,0 +1,552 @@ +# -*- coding:utf-8 -*- + + +import datetime +import json + +from flask import abort +from flask import current_app +from werkzeug.exceptions import BadRequest + +from api.extensions import db +from api.extensions import rd +from api.lib.cmdb.cache import AttributeCache +from api.lib.cmdb.cache import CITypeCache +from api.lib.cmdb.cache import RelationTypeCache +from api.lib.cmdb.ci_type import CITypeAttributeManager +from api.lib.cmdb.ci_type import CITypeManager +from api.lib.cmdb.const import CMDB_QUEUE +from api.lib.cmdb.const import ExistPolicy +from api.lib.cmdb.const import OperateType +from api.lib.cmdb.const import RetKey +from api.lib.cmdb.const import TableMap +from api.lib.cmdb.const import type_map +from api.lib.cmdb.history import AttributeHistoryManger +from api.lib.cmdb.history import CIRelationHistoryManager +from api.lib.cmdb.query_sql import QUERY_CIS_BY_IDS +from api.lib.cmdb.query_sql import QUERY_CIS_BY_VALUE_TABLE +from api.lib.cmdb.value import AttributeValueManager +from api.lib.decorator import kwargs_required +from api.lib.utils import handle_arg_list +from api.models.cmdb import CI +from api.models.cmdb import CIRelation +from api.models.cmdb import CITypeAttribute +from api.tasks.cmdb import ci_cache +from api.tasks.cmdb import ci_delete + + +class CIManager(object): + """ manage CI interface + """ + + def __init__(self): + pass + + @staticmethod + def get_type_name(ci_id): + ci = CI.get_by_id(ci_id) or abort(404, "CI <{0}> is not existed".format(ci_id)) + return CITypeCache.get(ci.type_id).name + + @staticmethod + def confirm_ci_existed(ci_id): + CI.get_by_id(ci_id) or abort(404, "CI <{0}> is not existed".format(ci_id)) + + @classmethod + def get_ci_by_id(cls, ci_id, ret_key=RetKey.NAME, fields=None, need_children=True): + """ + + :param ci_id: + :param ret_key: name, id, or alias + :param fields: attribute list + :param need_children: + :return: + """ + + ci = CI.get_by_id(ci_id) or abort(404, "CI <{0}> is not existed".format(ci_id)) + + res = dict() + + if need_children: + children = CIRelationManager.get_children(ci_id, ret_key=ret_key) # one floor + res.update(children) + + ci_type = CITypeCache.get(ci.type_id) + res["ci_type"] = ci_type.name + + res.update(cls.get_cis_by_ids([str(ci_id)], fields=fields, ret_key=ret_key)) + + res['_type'] = ci_type.id + res['_id'] = ci_id + + return res + + @staticmethod + def get_ci_by_id_from_db(ci_id, ret_key=RetKey.NAME, fields=None, need_children=True, use_master=False): + """ + + :param ci_id: + :param ret_key: name, id or alias + :param fields: list + :param need_children: + :param use_master: whether to use master db + :return: + """ + + ci = CI.get_by_id(ci_id) or abort(404, "CI <{0}> is not existed".format(ci_id)) + + res = dict() + + if need_children: + children = CIRelationManager.get_children(ci_id, ret_key=ret_key) # one floor + res.update(children) + + ci_type = CITypeCache.get(ci.type_id) + res["ci_type"] = ci_type.name + + fields = CITypeAttributeManager.get_attr_names_by_type_id(ci.type_id) if not fields else fields + + _res = AttributeValueManager().get_attr_values(fields, ci_id, ret_key=ret_key, use_master=use_master) + res.update(_res) + + res['_type'] = ci_type.id + res['_id'] = ci_id + + return res + + def get_ci_by_ids(self, ci_id_list, ret_key=RetKey.NAME, fields=None): + return [self.get_ci_by_id(ci_id, ret_key=ret_key, fields=fields) for ci_id in ci_id_list] + + @classmethod + def get_cis_by_type(cls, type_id, ret_key=RetKey.NAME, fields="", page=1, per_page=None): + cis = db.session.query(CI.id).filter(CI.type_id == type_id).filter(CI.deleted.is_(False)) + numfound = cis.count() + + cis = cis.offset((page - 1) * per_page).limit(per_page) + ci_ids = [str(ci.id) for ci in cis] + res = cls.get_cis_by_ids(ci_ids, ret_key, fields) + + return numfound, page, res + + @staticmethod + def ci_is_exist(unique_key, unique_value): + """ + + :param unique_key: is a attribute + :param unique_value: + :return: + """ + value_table = TableMap(attr_name=unique_key.name).table + unique = value_table.get_by(attr_id=unique_key.id, + value=unique_value, + to_dict=False, + first=True) + if unique: + return CI.get_by_id(unique.ci_id) + + @staticmethod + def _delete_ci_by_id(ci_id): + ci = CI.get_by_id(ci_id) + ci.delete() # TODO: soft delete + + @classmethod + def add(cls, ci_type_name, exist_policy=ExistPolicy.REPLACE, _no_attribute_policy=ExistPolicy.IGNORE, **ci_dict): + """ + + :param ci_type_name: + :param exist_policy: replace or reject or need + :param _no_attribute_policy: ignore or reject + :param ci_dict: + :return: + """ + + ci_type = CITypeManager.check_is_existed(ci_type_name) + + unique_key = AttributeCache.get(ci_type.unique_id) or abort(400, 'illegality unique attribute') + + unique_value = ci_dict.get(unique_key.name) or \ + ci_dict.get(unique_key.alias) or \ + ci_dict.get(unique_key.id) or \ + abort(400, '{0} missing'.format(unique_key.name)) + + existed = cls.ci_is_exist(unique_key, unique_value) + if existed is not None: + if exist_policy == ExistPolicy.REJECT: + return abort(400, 'CI is already existed') + if existed.type_id != ci_type.id: + existed.update(type_id=ci_type.id) + ci = existed + else: + if exist_policy == ExistPolicy.NEED: + return abort(404, 'CI <{0}> does not exist'.format(unique_value)) + ci = CI.create(type_id=ci_type.id) + + value_manager = AttributeValueManager() + for p, v in ci_dict.items(): + try: + value_manager.create_or_update_attr_value(p, v, ci.id, _no_attribute_policy) + except BadRequest as e: + if existed is None: + cls.delete(ci.id) + raise e + + ci_cache.apply_async([ci.id], queue=CMDB_QUEUE) + + return ci.id + + def update(self, ci_id, **ci_dict): + self.confirm_ci_existed(ci_id) + value_manager = AttributeValueManager() + for p, v in ci_dict.items(): + try: + value_manager.create_or_update_attr_value(p, v, ci_id) + except BadRequest as e: + raise e + + ci_cache.apply_async([ci_id], queue=CMDB_QUEUE) + + @staticmethod + def update_unique_value(ci_id, unique_name, unique_value): + CI.get_by_id(ci_id) or abort(404, "CI <{0}> is not found".format(ci_id)) + + AttributeValueManager().create_or_update_attr_value(unique_name, unique_value, ci_id) + + ci_cache.apply_async([ci_id], queue=CMDB_QUEUE) + + @staticmethod + def delete(ci_id): + ci = CI.get_by_id(ci_id) or abort(404, "CI <{0}> is not found".format(ci_id)) + + attrs = CITypeAttribute.get_by(type_id=ci.type_id, to_dict=False) + attr_names = set([AttributeCache.get(attr.attr_id).name for attr in attrs]) + for attr_name in attr_names: + value_table = TableMap(attr_name=attr_name).table + for item in value_table.get_by(ci_id=ci_id, to_dict=False): + item.delete() + + for item in CIRelation.get_by(first_ci_id=ci_id, to_dict=False): + item.delete() + + for item in CIRelation.get_by(second_ci_id=ci_id, to_dict=False): + item.delete() + + ci.delete() # TODO: soft delete + + AttributeHistoryManger.add(ci_id, [(None, OperateType.DELETE, None, None)]) + + ci_delete.apply_async([ci.id], queue=CMDB_QUEUE) + + return ci_id + + @staticmethod + def add_heartbeat(ci_type, unique_value): + ci_type = CITypeManager().check_is_existed(ci_type) + + unique_key = AttributeCache.get(ci_type.unique_id) + value_table = TableMap(attr_name=unique_key.name).table + + v = value_table.get_by(attr_id=unique_key.id, + value=unique_value, + to_dict=False, + first=True) \ + or abort(404, "not found") + + ci = CI.get_by_id(v.ci_id) or abort(404, "CI <{0}> is not found".format(v.ci_id)) + + ci.update(heartbeat=datetime.datetime.now()) + + @classmethod + @kwargs_required("type_id", "page") + def get_heartbeat(cls, **kwargs): + query = db.session.query(CI.id, CI.heartbeat).filter(CI.deleted.is_(False)) + + expire = datetime.datetime.now() - datetime.timedelta(minutes=72) + type_ids = handle_arg_list(kwargs["type_id"]) + + query = query.filter(CI.type_id.in_(type_ids)) + + page = kwargs.get("page") + agent_status = kwargs.get("agent_status") + if agent_status == -1: + query = query.filter(CI.heartbeat.is_(None)) + elif agent_status == 0: + query = query.filter(CI.heartbeat <= expire) + elif agent_status == 1: + query = query.filter(CI.heartbeat > expire) + + numfound = query.count() + per_page_count = current_app.config.get("DEFAULT_PAGE_COUNT") + cis = query.offset((page - 1) * per_page_count).limit(per_page_count).all() + ci_ids = [ci.id for ci in cis] + heartbeat_dict = {} + for ci in cis: + if agent_status is not None: + heartbeat_dict[ci.id] = agent_status + else: + if ci.heartbeat is None: + heartbeat_dict[ci.id] = -1 + elif ci.heartbeat <= expire: + heartbeat_dict[ci.id] = 0 + else: + heartbeat_dict[ci.id] = 1 + current_app.logger.debug(heartbeat_dict) + ci_ids = list(map(str, ci_ids)) + res = cls.get_cis_by_ids(ci_ids, fields=["hostname", "private_ip"]) + result = [(i.get("hostname"), i.get("private_ip")[0], i.get("ci_type"), + heartbeat_dict.get(i.get("_id"))) for i in res + if i.get("private_ip")] + return numfound, result + + @staticmethod + def _get_cis_from_cache(ci_ids, ret_key=RetKey.NAME, fields=None): + res = rd.get(ci_ids) + if res is not None and None not in res and ret_key == RetKey.NAME: + res = list(map(json.loads, res)) + if not fields: + return res + else: + _res = [] + for d in res: + _d = dict() + _d["_id"], _d["_type"] = d.get("_id"), d.get("_type") + _d["ci_type"] = d.get("ci_type") + for field in fields: + _d[field] = d.get(field) + _res.append(_d) + return _res + + @staticmethod + def _get_cis_from_db(ci_ids, ret_key=RetKey.NAME, fields=None, value_tables=None): + if not fields: + filter_fields_sql = "" + else: + _fields = list() + for field in fields: + attr = AttributeCache.get(field) + if attr is not None: + _fields.append(str(attr.id)) + filter_fields_sql = "WHERE A.attr_id in ({0})".format(",".join(_fields)) + + ci_ids = ",".join(ci_ids) + if value_tables is None: + value_tables = type_map["table_name"].values() + + value_sql = " UNION ".join([QUERY_CIS_BY_VALUE_TABLE.format(value_table, ci_ids) + for value_table in value_tables]) + query_sql = QUERY_CIS_BY_IDS.format(filter_fields_sql, value_sql) + # current_app.logger.debug(query_sql) + cis = db.session.execute(query_sql).fetchall() + ci_set = set() + res = list() + ci_dict = dict() + for ci_id, type_id, attr_id, attr_name, attr_alias, value, value_type, is_list in cis: + if ci_id not in ci_set: + ci_dict = dict() + ci_type = CITypeCache.get(type_id) + ci_dict["_id"] = ci_id + ci_dict["_type"] = type_id + ci_dict["ci_type"] = ci_type.name + ci_dict["ci_type_alias"] = ci_type.alias + ci_set.add(ci_id) + res.append(ci_dict) + + if ret_key == RetKey.NAME: + attr_key = attr_name + elif ret_key == RetKey.ALIAS: + attr_key = attr_alias + elif ret_key == RetKey.ID: + attr_key = attr_id + else: + return abort(400, "invalid ret key") + + value = type_map["serialize2"][value_type](value) + if is_list: + ci_dict.setdefault(attr_key, []).append(value) + else: + ci_dict[attr_key] = value + + return res + + @classmethod + def get_cis_by_ids(cls, ci_ids, ret_key=RetKey.NAME, fields=None, value_tables=None): + """ + + :param ci_ids: list of CI instance ID, eg. ['1', '2'] + :param ret_key: name, id or alias + :param fields: + :param value_tables: + :return: + """ + + if not ci_ids: + return [] + + fields = [] if fields is None or not isinstance(fields, list) else fields + + ci_id_tuple = tuple(map(int, ci_ids)) + res = cls._get_cis_from_cache(ci_id_tuple, ret_key, fields) + if res is not None: + return res + + current_app.logger.warning("cache not hit...............") + return cls._get_cis_from_db(ci_ids, ret_key, fields, value_tables) + + +class CIRelationManager(object): + """ + Manage relation between CIs + """ + + def __init__(self): + pass + + @staticmethod + def _get_default_relation_type(): + return RelationTypeCache.get("contain").id # FIXME + + @classmethod + def get_children(cls, ci_id, ret_key=RetKey.NAME): + second_cis = CIRelation.get_by(first_ci_id=ci_id, to_dict=False) + second_ci_ids = (second_ci.second_ci_id for second_ci in second_cis) + ci_type2ci_ids = dict() + for ci_id in second_ci_ids: + type_id = CI.get_by_id(ci_id).type_id + ci_type2ci_ids.setdefault(type_id, []).append(ci_id) + + res = {} + for type_id in ci_type2ci_ids: + ci_type = CITypeCache.get(type_id) + children = CIManager.get_cis_by_ids(list(map(str, ci_type2ci_ids[type_id])), ret_key=ret_key) + res[ci_type.name] = children + return res + + def get_second_cis(self, first_ci_id, relation_type_id=None, page=1, per_page=None, **kwargs): + second_cis = db.session.query(CI.id).filter(CI.deleted.is_(False)).join( + CIRelation, CIRelation.second_ci_id == CI.id).filter( + CIRelation.first_ci_id == first_ci_id) + + if relation_type_id is not None: + second_cis = second_cis.filter(CIRelation.relation_type_id == relation_type_id) + + if kwargs: # TODO: special for devices + second_cis = self._query_wrap_for_device(second_cis, **kwargs) + + numfound = second_cis.count() + if per_page != "all": + second_cis = second_cis.offset((page - 1) * per_page).limit(per_page).all() + ci_ids = [str(son.id) for son in second_cis] + result = CIManager.get_cis_by_ids(ci_ids) + + return numfound, len(ci_ids), result + + @staticmethod + def _sort_handler(sort_by, query_sql): + + if sort_by.startswith("+"): + sort_type = "asc" + sort_by = sort_by[1:] + elif sort_by.startswith("-"): + sort_type = "desc" + sort_by = sort_by[1:] + else: + sort_type = "asc" + attr = AttributeCache.get(sort_by) + if attr is None: + return query_sql + + attr_id = attr.id + value_table = TableMap(attr_name=sort_by).table + + ci_table = query_sql.subquery() + query_sql = db.session.query(ci_table.c.id, value_table.value).join( + value_table, value_table.ci_id == ci_table.c.id).filter( + value_table.attr_id == attr_id).filter(ci_table.deleted.is_(False)).order_by( + getattr(value_table.value, sort_type)()) + + return query_sql + + def _query_wrap_for_device(self, query_sql, **kwargs): + _type = kwargs.pop("_type", False) or kwargs.pop("type", False) or kwargs.pop("ci_type", False) + if _type: + ci_type = CITypeCache.get(_type) + if ci_type is None: + return + query_sql = query_sql.filter(CI.type_id == ci_type.id) + + for k, v in kwargs.items(): + attr = AttributeCache.get(k) + if attr is None: + continue + + value_table = TableMap(attr_name=k).table + ci_table = query_sql.subquery() + query_sql = db.session.query(ci_table.c.id).join( + value_table, value_table.ci_id == ci_table.c.id).filter( + value_table.attr_id == attr.id).filter(ci_table.deleted.is_(False)).filter( + value_table.value.ilike(v.replace("*", "%"))) + + # current_app.logger.debug(query_sql) + sort_by = kwargs.pop("sort", "") + if sort_by: + query_sql = self._sort_handler(sort_by, query_sql) + + return query_sql + + @classmethod + def get_first_cis(cls, second_ci, relation_type_id=None, page=1, per_page=None): + first_cis = db.session.query(CIRelation.first_ci_id).filter( + CIRelation.second_ci_id == second_ci).filter(CIRelation.deleted.is_(False)) + if relation_type_id is not None: + first_cis = first_cis.filter(CIRelation.relation_type_id == relation_type_id) + + numfound = first_cis.count() + if per_page != "all": + first_cis = first_cis.offset((page - 1) * per_page).limit(per_page).all() + + first_ci_ids = [str(first_ci.first_ci_id) for first_ci in first_cis] + result = CIManager.get_cis_by_ids(first_ci_ids) + + return numfound, len(first_ci_ids), result + + @classmethod + def add(cls, first_ci_id, second_ci_id, more=None, relation_type_id=None): + + relation_type_id = relation_type_id or cls._get_default_relation_type() + + CIManager.confirm_ci_existed(first_ci_id) + CIManager.confirm_ci_existed(second_ci_id) + + existed = CIRelation.get_by(first_ci_id=first_ci_id, + second_ci_id=second_ci_id, + to_dict=False, + first=True) + if existed is not None: + if existed.relation_type_id != relation_type_id: + existed.update(relation_type_id=relation_type_id) + CIRelationHistoryManager().add(existed, OperateType.UPDATE) + else: + existed = CIRelation.create(first_ci_id=first_ci_id, + second_ci_id=second_ci_id, + relation_type_id=relation_type_id) + CIRelationHistoryManager().add(existed, OperateType.ADD) + if more is not None: + existed.upadte(more=more) + + return existed.id + + @staticmethod + def delete(cr_id): + cr = CIRelation.get_by_id(cr_id) or abort(404, "CIRelation <{0}> is not existed".format(cr_id)) + cr.soft_delete() + + his_manager = CIRelationHistoryManager() + his_manager.add(cr, operate_type=OperateType.DELETE) + + return cr_id + + @classmethod + def delete_2(cls, first_ci_id, second_ci_id): + cr = CIRelation.get_by(first_ci_id=first_ci_id, + second_ci_id=second_ci_id, + to_dict=False, + first=True) + return cls.delete(cr.cr_id) diff --git a/api/lib/cmdb/ci_type.py b/api/lib/cmdb/ci_type.py new file mode 100644 index 0000000..c4b2b23 --- /dev/null +++ b/api/lib/cmdb/ci_type.py @@ -0,0 +1,392 @@ +# -*- coding:utf-8 -*- + + +from flask import current_app +from flask import abort + +from api.models.cmdb import CITypeAttribute +from api.models.cmdb import CIType +from api.models.cmdb import CITypeGroup +from api.models.cmdb import CITypeGroupItem +from api.models.cmdb import CITypeRelation +from api.models.cmdb import CITypeAttributeGroup +from api.models.cmdb import CITypeAttributeGroupItem +from api.lib.cmdb.cache import AttributeCache +from api.lib.cmdb.cache import CITypeAttributeCache +from api.lib.cmdb.cache import CITypeCache +from api.lib.cmdb.attribute import AttributeManager +from api.lib.decorator import kwargs_required + + +class CITypeManager(object): + """ + manage CIType + """ + + def __init__(self): + pass + + @staticmethod + def get_name_by_id(type_id): + return CITypeCache.get(type_id).name + + @staticmethod + def check_is_existed(key): + return CITypeCache.get(key) or abort(404, "CIType <{0}> is not existed".format(key)) + + @staticmethod + def get_ci_types(type_name=None): + ci_types = CIType.get_by() if type_name is None else CIType.get_by_like(name=type_name) + res = list() + for type_dict in ci_types: + type_dict["unique_key"] = AttributeCache.get(type_dict["unique_id"]).name + res.append(type_dict) + return res + + @staticmethod + def query(_type): + ci_type = CITypeCache.get(_type) or abort(404, "CIType <{0}> is not found".format(_type)) + return ci_type.to_dict() + + @classmethod + @kwargs_required("name") + def add(cls, **kwargs): + unique_key = kwargs.pop("unique_key", None) + unique_key = AttributeCache.get(unique_key) or abort(404, "Unique key is not defined") + + CIType.get_by(name=kwargs['name'], first=True) and \ + abort(404, "CIType <{0}> is already existed".format(kwargs.get("name"))) + + kwargs["alias"] = kwargs["name"] if not kwargs.get("alias") else kwargs["alias"] + + kwargs["unique_id"] = unique_key.id + ci_type = CIType.create(**kwargs) + + CITypeAttributeManager.add(ci_type.id, [unique_key.id], is_required=True) + + CITypeCache.clean(ci_type.name) + + return ci_type.id + + @classmethod + def update(cls, type_id, **kwargs): + + ci_type = cls.check_is_existed(type_id) + + unique_key = kwargs.pop("unique_key", None) + unique_key = AttributeCache.get(unique_key) + if unique_key is not None: + kwargs["unique_id"] = unique_key.id + type_attr = CITypeAttribute.get_by(type_id=type_id, + attr_id=unique_key.id, + first=True, + to_dict=False) + if type_attr is None: + CITypeAttributeManager.add(type_id, [unique_key.id], is_required=True) + + ci_type.update(**kwargs) + + CITypeCache.clean(type_id) + + return type_id + + @classmethod + def set_enabled(cls, type_id, enabled=True): + ci_type = cls.check_is_existed(type_id) + ci_type.update(enabled=enabled) + return type_id + + @classmethod + def delete(cls, type_id): + ci_type = cls.check_is_existed(type_id) + ci_type.soft_delete() + + CITypeCache.clean(type_id) + + +class CITypeGroupManager(object): + @staticmethod + def get(need_other=None): + groups = CITypeGroup.get_by() + group_types = set() + for group in groups: + for t in sorted(CITypeGroupItem.get_by(group_id=group['id']), key=lambda x: x['order']): + group.setdefault("ci_types", []).append(CITypeCache.get(t['type_id']).to_dict()) + group_types.add(t["type_id"]) + + if need_other: + ci_types = CITypeManager.get_ci_types() + other_types = dict(ci_types=[ci_type for ci_type in ci_types if ci_type["id"] not in group_types]) + groups.append(other_types) + + return groups + + @staticmethod + def add(name): + CITypeGroup.get_by(name=name, first=True) and abort(400, "Group {0} does exist".format(name)) + return CITypeGroup.create(name=name) + + @staticmethod + def update(gid, name, type_ids): + """ + update all + :param gid: + :param name: + :param type_ids: + :return: + """ + existed = CITypeGroup.get_by_id(gid) or abort(404, "Group <{0}> does not exist".format(gid)) + if name is not None: + existed.update(name=name) + + for idx, type_id in enumerate(type_ids): + + item = CITypeGroupItem.get_by(group_id=gid, type_id=type_id, first=True, to_dict=False) + if item is not None: + item.update(order=idx) + else: + CITypeGroupItem.create(group_id=gid, type_id=type_id, order=idx) + + @staticmethod + def delete(gid): + existed = CITypeGroup.get_by_id(gid) or abort(404, "Group <{0}> does not exist".format(gid)) + + items = CITypeGroupItem.get_by(group_id=gid, to_dict=False) + for item in items: + item.soft_delete() + + existed.soft_delete() + + +class CITypeAttributeManager(object): + """ + manage CIType's attributes, include query, add, update, delete + """ + + def __init__(self): + pass + + @staticmethod + def get_attr_names_by_type_id(type_id): + return [AttributeCache.get(attr.attr_id).name for attr in CITypeAttributeCache.get(type_id)] + + @staticmethod + def get_attributes_by_type_id(type_id): + attrs = CITypeAttributeCache.get(type_id) + result = list() + for attr in sorted(attrs, key=lambda x: (x.order, x.id)): + attr_dict = AttributeManager().get_attribute(attr.attr_id) + attr_dict["is_required"] = attr.is_required + attr_dict["order"] = attr.order + attr_dict["default_show"] = attr.default_show + result.append(attr_dict) + return result + + @staticmethod + def _check(type_id, attr_ids): + CITypeManager.check_is_existed(type_id) + + if not attr_ids or not isinstance(attr_ids, list): + return abort(400, "Attributes are required") + + for attr_id in attr_ids: + AttributeCache.get(attr_id) or abort(404, "Attribute <{0}> is not existed".format(attr_id)) + + @classmethod + def add(cls, type_id, attr_ids=None, **kwargs): + """ + add attributes to CIType + :param type_id: + :param attr_ids: list + :param kwargs: + :return: + """ + cls._check(type_id, attr_ids) + + for attr_id in attr_ids: + existed = CITypeAttribute.get_by(type_id=type_id, + attr_id=attr_id, + first=True, + to_dict=False) + if existed is not None: + continue + + current_app.logger.debug(attr_id) + CITypeAttribute.create(type_id=type_id, attr_id=attr_id, **kwargs) + + CITypeAttributeCache.clean(type_id) + + @classmethod + def update(cls, type_id, attributes): + """ + update attributes to CIType + :param type_id: + :param attributes: list + :return: + """ + cls._check(type_id, [i.get('attr_id') for i in attributes]) + + for attr in attributes: + existed = CITypeAttribute.get_by(type_id=type_id, + attr_id=attr.get("attr_id"), + first=True, + to_dict=False) + if existed is None: + continue + + existed.update(**attr) + + CITypeAttributeCache.clean(type_id) + + @classmethod + def delete(cls, type_id, attr_ids=None): + """ + delete attributes from CIType + :param type_id: + :param attr_ids: list + :return: + """ + cls._check(type_id, attr_ids) + + for attr_id in attr_ids: + existed = CITypeAttribute.get_by(type_id=type_id, + attr_id=attr_id, + first=True, + to_dict=False) + if existed is not None: + existed.soft_delete() + + CITypeAttributeCache.clean(type_id) + + +class CITypeRelationManager(object): + """ + manage relation between CITypes + """ + + def __init__(self): + pass + + @staticmethod + def _wrap_relation_type_dict(type_id, relation_inst): + ci_type_dict = CITypeCache.get(type_id).to_dict() + ci_type_dict["ctr_id"] = relation_inst.id + ci_type_dict["attributes"] = CITypeAttributeManager.get_attributes_by_type_id(ci_type_dict["id"]) + ci_type_dict["relation_type"] = relation_inst.relation_type.name + return ci_type_dict + + @classmethod + def get_children(cls, parent_id): + children = CITypeRelation.get_by(parent_id=parent_id, to_dict=False) + + return [cls._wrap_relation_type_dict(child.child_id, child) for child in children] + + @classmethod + def get_parents(cls, child_id): + parents = CITypeRelation.get_by(child_id=child_id, to_dict=False) + + return [cls._wrap_relation_type_dict(parent.parent_id, parent) for parent in parents] + + @staticmethod + def _get(parent_id, child_id): + return CITypeRelation.get_by(parent_id=parent_id, + child_id=child_id, + to_dict=False, + first=True) + + @classmethod + def add(cls, parent, child, relation_type_id): + p = CITypeManager.check_is_existed(parent) + c = CITypeManager.check_is_existed(child) + + existed = cls._get(p.id, c.id) + if existed is not None: + existed.update(relation_type_id=relation_type_id) + else: + existed = CITypeRelation.create(parent_id=p.id, + child_id=c.id, + relation_type_id=relation_type_id) + return existed.id + + @staticmethod + def delete(_id): + ctr = CITypeRelation.get_by_id(_id) or abort(404, "Type relation <{0}> is not found".format(_id)) + ctr.soft_delete() + + @classmethod + def delete_2(cls, parent, child): + ctr = cls._get(parent, child) + return cls.delete(ctr.id) + + +class CITypeAttributeGroupManager(object): + @staticmethod + def get_by_type_id(type_id, need_other=None): + groups = CITypeAttributeGroup.get_by(type_id=type_id) + groups = sorted(groups, key=lambda x: x["order"]) + grouped = list() + for group in groups: + items = CITypeAttributeGroupItem.get_by(group_id=group["id"], to_dict=False) + items = sorted(items, key=lambda x: x.order) + group["attributes"] = [AttributeCache.get(i.attr_id).to_dict() for i in items] + grouped.extend([i.attr_id for i in items]) + + if need_other is not None: + grouped = set(grouped) + attributes = CITypeAttributeManager.get_attributes_by_type_id(type_id) + other_attributes = [attr for attr in attributes if attr["id"] not in grouped] + groups.append(dict(attributes=other_attributes)) + + return groups + + @staticmethod + def create_or_update(type_id, name, attr_order, group_order=0): + """ + create or update + :param type_id: + :param name: + :param group_order: group order + :param attr_order: + :return: + """ + existed = CITypeAttributeGroup.get_by(type_id=type_id, name=name, first=True, to_dict=False) \ + or CITypeAttributeGroup.create(type_id=type_id, name=name, order=group_order) + existed.update(order=group_order) + attr_order = dict(attr_order) + current_app.logger.info(attr_order) + existed_items = CITypeAttributeGroupItem.get_by(group_id=existed.id, to_dict=False) + for item in existed_items: + if item.attr_id not in attr_order: + item.soft_delete() + else: + item.update(order=attr_order[item.attr_id]) + + existed_items = {item.attr_id: 1 for item in existed_items} + for attr_id, order in attr_order.items(): + if attr_id not in existed_items: + CITypeAttributeGroupItem.create(group_id=existed.id, attr_id=attr_id, order=order) + + return existed + + @classmethod + def update(cls, group_id, name, attr_order, group_order=0): + group = CITypeAttributeGroup.get_by_id(group_id) or abort(404, "Group <{0}> does not exist".format(group_id)) + other = CITypeAttributeGroup.get_by(type_id=group.type_id, name=name, first=True, to_dict=False) + if other is not None and other.id != group.id: + return abort(400, "Group <{0}> duplicate".format(name)) + if name is not None: + group.update(name=name) + + cls.create_or_update(group.type_id, name, attr_order, group_order) + + @staticmethod + def delete(group_id): + group = CITypeAttributeGroup.get_by_id(group_id) \ + or abort(404, "AttributeGroup <{0}> does not exist".format(group_id)) + group.soft_delete() + + items = CITypeAttributeGroupItem.get_by(group_id=group_id, to_dict=False) + for item in items: + item.soft_delete() + + return group_id diff --git a/api/lib/cmdb/const.py b/api/lib/cmdb/const.py new file mode 100644 index 0000000..e5bfb55 --- /dev/null +++ b/api/lib/cmdb/const.py @@ -0,0 +1,148 @@ +# -*- coding:utf-8 -*- + +import datetime + +import six +from markupsafe import escape + +from api.models.cmdb import Attribute +from api.models.cmdb import TextChoice +from api.models.cmdb import FloatChoice +from api.models.cmdb import IntegerChoice +from api.models.cmdb import CIValueText +from api.models.cmdb import CIValueInteger +from api.models.cmdb import CIValueFloat +from api.models.cmdb import CIValueDateTime +from api.models.cmdb import CIIndexValueDateTime +from api.models.cmdb import CIIndexValueFloat +from api.models.cmdb import CIIndexValueInteger +from api.models.cmdb import CIIndexValueText +from api.lib.cmdb.cache import AttributeCache + + +def string2int(x): + return int(float(x)) + + +def str2datetime(x): + try: + return datetime.datetime.strptime(x, "%Y-%m-%d") + except ValueError: + pass + + return datetime.datetime.strptime(x, "%Y-%m-%d %H:%M:%S") + + +type_map = { + 'deserialize': { + Attribute.INT: string2int, + Attribute.FLOAT: float, + Attribute.TEXT: escape, + Attribute.TIME: escape, + Attribute.DATETIME: str2datetime, + Attribute.DATE: str2datetime, + }, + 'serialize': { + Attribute.INT: int, + Attribute.FLOAT: float, + Attribute.TEXT: str, + Attribute.TIME: str, + Attribute.DATE: lambda x: x.strftime("%Y%m%d"), + Attribute.DATETIME: lambda x: x.strftime("%Y%m%d %H:%M:%S"), + }, + 'serialize2': { + Attribute.INT: int, + Attribute.FLOAT: float, + Attribute.TEXT: lambda x: x.decode() if not isinstance(x, six.string_types) else x, + Attribute.TIME: lambda x: x.decode() if not isinstance(x, six.string_types) else x, + Attribute.DATE: lambda x: x.decode() if not isinstance(x, six.string_types) else x, + Attribute.DATETIME: lambda x: x.decode() if not isinstance(x, six.string_types) else x, + }, + 'choice': { + Attribute.INT: IntegerChoice, + Attribute.FLOAT: FloatChoice, + Attribute.TEXT: TextChoice, + }, + 'table': { + Attribute.INT: CIValueInteger, + Attribute.TEXT: CIValueText, + Attribute.DATETIME: CIValueDateTime, + Attribute.DATE: CIValueDateTime, + Attribute.TIME: CIValueText, + Attribute.FLOAT: CIValueFloat, + 'index_{0}'.format(Attribute.INT): CIIndexValueInteger, + 'index_{0}'.format(Attribute.TEXT): CIIndexValueText, + 'index_{0}'.format(Attribute.DATETIME): CIIndexValueDateTime, + 'index_{0}'.format(Attribute.DATE): CIIndexValueDateTime, + 'index_{0}'.format(Attribute.TIME): CIIndexValueText, + 'index_{0}'.format(Attribute.FLOAT): CIIndexValueFloat, + }, + 'table_name': { + Attribute.INT: 'c_value_integers', + Attribute.TEXT: 'c_value_texts', + Attribute.DATETIME: 'c_value_datetime', + Attribute.DATE: 'c_value_datetime', + Attribute.TIME: 'c_value_texts', + Attribute.FLOAT: 'c_value_floats', + 'index_{0}'.format(Attribute.INT): 'c_value_index_integers', + 'index_{0}'.format(Attribute.TEXT): 'c_value_index_texts', + 'index_{0}'.format(Attribute.DATETIME): 'c_value_index_datetime', + 'index_{0}'.format(Attribute.DATE): 'c_value_index_datetime', + 'index_{0}'.format(Attribute.TIME): 'c_value_index_texts', + 'index_{0}'.format(Attribute.FLOAT): 'c_value_index_floats', + } +} + + +class TableMap(object): + def __init__(self, attr_name=None): + self.attr_name = attr_name + + @property + def table(self): + attr = AttributeCache.get(self.attr_name) + i = "index_{0}".format(attr.value_type) if attr.is_index else attr.value_type + return type_map["table"].get(i) + + @property + def table_name(self): + attr = AttributeCache.get(self.attr_name) + i = "index_{0}".format(attr.value_type) if attr.is_index else attr.value_type + return type_map["table_name"].get(i) + + +class ExistPolicy(object): + REJECT = "reject" + NEED = "need" + IGNORE = "ignore" + REPLACE = "replace" + + +class OperateType(object): + ADD = "0" + DELETE = "1" + UPDATE = "2" + + +class RetKey(object): + ID = "id" + NAME = "name" + ALIAS = "alias" + + +class ResourceType(object): + CI = "CIType" + + +class PermEnum(object): + ADD = "add" + UPDATE = "update" + DELETE = "delete" + READ = "read" + + +class RoleEnum(object): + CONFIG = "admin" + +CMDB_QUEUE = "cmdb_async" +REDIS_PREFIX = "CMDB_CI" diff --git a/api/lib/cmdb/history.py b/api/lib/cmdb/history.py new file mode 100644 index 0000000..2116370 --- /dev/null +++ b/api/lib/cmdb/history.py @@ -0,0 +1,126 @@ +# -*- coding:utf-8 -*- + + +from flask import g +from flask import abort + + +from api.extensions import db +from api.models.cmdb import Attribute +from api.models.cmdb import OperationRecord +from api.models.cmdb import AttributeHistory +from api.models.cmdb import CIRelationHistory +from api.models.account import UserCache +from api.lib.cmdb.cache import AttributeCache +from api.lib.cmdb.cache import RelationTypeCache + + +class AttributeHistoryManger(object): + + @staticmethod + def get_records(start, end, username, page, page_size): + records = db.session.query(OperationRecord).filter(OperationRecord.deleted.is_(False)) + numfound = db.session.query(db.func.count(OperationRecord.id)).filter(OperationRecord.deleted.is_(False)) + if start: + records = records.filter(OperationRecord.created_at >= start) + numfound = numfound.filter(OperationRecord.created_at >= start) + if end: + records = records.filter(OperationRecord.created_at <= end) + numfound = records.filter(OperationRecord.created_at <= end) + if username: + user = UserCache.get(username) + if user: + records = records.filter(OperationRecord.uid == user.uid) + else: + return abort(404, "User <{0}> is not found".format(username)) + + records = records.order_by(-OperationRecord.id).offset(page_size * (page - 1)).limit(page_size).all() + total = len(records) + numfound = numfound.first()[0] + res = [] + for record in records: + _res = record.to_dict() + _res["user"] = UserCache.get(_res.get("uid")).nickname or UserCache.get(_res.get("uid")).username + + attr_history = AttributeHistory.get_by(record_id=_res.get("id"), to_dict=False) + _res["attr_history"] = [AttributeCache.get(h.attr_id).attr_alias for h in attr_history] + + rel_history = CIRelationHistory.get_by(record_id=_res.get("id"), to_dict=False) + rel_statis = {} + for rel in rel_history: + if rel.operate_type not in rel_statis: + rel_statis[rel.operate_type] = 1 + else: + rel_statis[rel.operate_type] += 1 + _res["rel_history"] = rel_statis + res.append(_res) + + return numfound, total, res + + @staticmethod + def get_by_ci_id(ci_id): + res = db.session.query(AttributeHistory, Attribute, OperationRecord).join( + Attribute, Attribute.id == AttributeHistory.attr_id).join( + OperationRecord, OperationRecord.id == AttributeHistory.record_id).filter( + AttributeHistory.ci_id == ci_id).order_by(OperationRecord.id.desc()) + return [dict(attr_name=i.Attribute.name, + attr_alias=i.Attribute.alias, + operate_type=i.AttributeHistory.operate_type, + username=UserCache.get(i.OperationRecord.uid).nickname, + old=i.AttributeHistory.old, + new=i.AttributeHistory.new, + created_at=i.OperationRecord.created_at.strftime('%Y-%m-%d %H:%M:%S'), + record_id=i.OperationRecord.id, + hid=i.AttributeHistory.id + ) for i in res] + + @staticmethod + def get_record_detail(record_id): + from api.lib.cmdb.ci import CIManager + + record = OperationRecord.get_by_id(record_id) or abort(404, "Record <{0}> is not found".format(record_id)) + + username = UserCache.get(record.uid).nickname or UserCache.get(record.uid).username + timestamp = record.created_at.strftime("%Y-%m-%d %H:%M:%S") + attr_history = AttributeHistory.get_By(record_id=record_id, to_dict=False) + rel_history = CIRelationHistory.get_by(record_id=record_id, to_dict=False) + + attr_dict, rel_dict = dict(), {"add": [], "delete": []} + for attr_h in attr_history: + attr_dict[AttributeCache.get(attr_h.attr_id).alias] = dict( + old=attr_h.old, + new=attr_h.new, + operate_type=attr_h.operate_type) + + for rel_h in rel_history: + first = CIManager.get_ci_by_id(rel_h.first_ci_id) + second = CIManager.get_ci_by_id(rel_h.second_ci_id) + rel_dict[rel_h.operate_type].append((first, RelationTypeCache.get(rel_h.relation_type_id).name, second)) + + return username, timestamp, attr_dict, rel_dict + + @staticmethod + def add(ci_id, history_list): + record = OperationRecord.create(uid=g.user.uid) + + for attr_id, operate_type, old, new in history_list or []: + AttributeHistory.create(attr_id=attr_id, + operate_type=operate_type, + old=old, + new=new, + ci_id=ci_id, + record_id=record.id) + + +class CIRelationHistoryManager(object): + + @staticmethod + def add(rel_obj, operate_type=CIRelationHistory.ADD): + record = OperationRecord.create(uid=g.user.uid) + + CIRelationHistory.create(relation_id=rel_obj.id, + record_id=record.id, + operate_type=operate_type, + first_ci_id=rel_obj.first_ci_id, + second_ci_id=rel_obj.second_ci_id, + relation_type_id=rel_obj.relation_type_id) diff --git a/api/lib/cmdb/preference.py b/api/lib/cmdb/preference.py new file mode 100644 index 0000000..0fabe64 --- /dev/null +++ b/api/lib/cmdb/preference.py @@ -0,0 +1,137 @@ +# -*- coding:utf-8 -*- + +import six +import toposort +from flask import g +from flask import abort + +from api.extensions import db +from api.lib.cmdb.cache import AttributeCache +from api.lib.cmdb.cache import CITypeCache +from api.lib.cmdb.cache import CITypeAttributeCache +from api.models.cmdb import PreferenceShowAttributes +from api.models.cmdb import PreferenceTreeView +from api.models.cmdb import PreferenceRelationView +from api.models.cmdb import CITypeAttribute +from api.lib.cmdb.attribute import AttributeManager + + +class PreferenceManager(object): + + @staticmethod + def get_types(instance=False, tree=False): + types = db.session.query(PreferenceShowAttributes.type_id).filter( + PreferenceShowAttributes.uid == g.user.uid).filter( + PreferenceShowAttributes.deleted.is_(False)).group_by(PreferenceShowAttributes.type_id).all() \ + if instance else [] + tree_types = PreferenceTreeView.get_by(uid=g.user.uid, to_dict=False) if tree else [] + type_ids = list(set([i.type_id for i in types + tree_types])) + return [CITypeCache.get(type_id).to_dict() for type_id in type_ids] + + @staticmethod + def get_show_attributes(type_id): + if not isinstance(type_id, six.integer_types): + type_id = CITypeCache.get(type_id).id + + attrs = db.session.query(PreferenceShowAttributes, CITypeAttribute.order).join( + CITypeAttribute, CITypeAttribute.attr_id == PreferenceShowAttributes.attr_id).filter( + PreferenceShowAttributes.uid == g.user.uid).filter( + PreferenceShowAttributes.type_id == type_id).filter( + PreferenceShowAttributes.deleted.is_(False)).filter(CITypeAttribute.deleted.is_(False)).filter( + CITypeAttribute.type_id == type_id).order_by( + CITypeAttribute.order).all() + result = [i.PreferenceShowAttributes.attr.to_dict() for i in attrs] + is_subscribed = True + if not attrs: + attrs = db.session.query(CITypeAttribute).filter( + CITypeAttribute.type_id == type_id).filter( + CITypeAttribute.deleted.is_(False)).filter( + CITypeAttribute.default_show.is_(True)).order_by(CITypeAttribute.order) + result = [i.attr.to_dict() for i in attrs] + is_subscribed = False + + for i in result: + if i["is_choice"]: + i.update(dict(choice_value=AttributeManager.get_choice_values(i["id"], i["value_type"]))) + + return is_subscribed, result + + @classmethod + def create_or_update_show_attributes(cls, type_id, attr_order): + existed_all = PreferenceShowAttributes.get_by(type_id=type_id, uid=g.user.uid, to_dict=False) + for _attr, order in attr_order: + attr = AttributeCache.get(_attr) or abort(404, "Attribute <{0}> does not exist".format(_attr)) + existed = PreferenceShowAttributes.get_by(type_id=type_id, + uid=g.user.uid, + attr_id=attr.id, + first=True, + to_dict=False) + if existed is None: + PreferenceShowAttributes.create(type_id=type_id, + uid=g.user.uid, + attr_id=attr.id, + order=order) + else: + existed.update(order=order) + + attr_dict = {int(i): j for i, j in attr_order} + for i in existed_all: + if i.attr_id not in attr_dict: + i.soft_delete() + + @staticmethod + def get_tree_view(): + res = PreferenceTreeView.get_by(uid=g.user.uid, to_dict=True) + for item in res: + if item["levels"]: + item.update(CITypeCache.get(item['type_id']).to_dict()) + item.update(dict(levels=[AttributeCache.get(l).to_dict() + for l in item["levels"].split(",") if AttributeCache.get(l)])) + + return res + + @staticmethod + def create_or_update_tree_view(type_id, levels): + attrs = CITypeAttributeCache.get(type_id) + for idx, i in enumerate(levels): + for attr in attrs: + attr = AttributeCache.get(attr.attr_id) + if i == attr.id or i == attr.name or i == attr.alias: + levels[idx] = str(attr.id) + levels = ",".join(levels) + + existed = PreferenceTreeView.get_by(uid=g.user.uid, type_id=type_id, to_dict=False, first=True) + if existed is not None: + if not levels: + existed.soft_delete() + return existed + return existed.update(levels=levels) + elif levels: + return PreferenceTreeView.create(levels=levels, type_id=type_id, uid=g.user.uid) + + @staticmethod + def get_relation_view(): + views = PreferenceRelationView.get_by(to_dict=True) + result = dict() + for view in views: + result.setdefault(view['name'], []).append(view) + + for view_name in result: + result[view_name] = toposort.toposort_flatten({i['child_id']: {i['parent_id']} for i in result[view_name]}) + + return result + + @staticmethod + def create_or_update_relation_view(name, parent_id, child_id): + existed = PreferenceRelationView.get_by(name=name, parent_id=parent_id, child_id=child_id, + to_dict=False, first=True) + if existed is None: + return PreferenceRelationView.create(name=name, parent_id=parent_id, child_id=child_id) + + return existed + + @staticmethod + def delete_relation_view(name): + for existed in PreferenceRelationView.get_by(name=name, to_dict=False): + existed.soft_delete() + return name diff --git a/api/lib/cmdb/query_sql.py b/api/lib/cmdb/query_sql.py new file mode 100644 index 0000000..c84fd64 --- /dev/null +++ b/api/lib/cmdb/query_sql.py @@ -0,0 +1,63 @@ +# -*- coding:utf-8 -*- + + +QUERY_CIS_BY_VALUE_TABLE = """ + SELECT attr.name AS attr_name, + attr.alias AS attr_alias, + attr.value_type, + attr.is_list, + c_cis.type_id, + {0}.ci_id, + {0}.attr_id, + {0}.value + FROM {0} + INNER JOIN c_cis ON {0}.ci_id=c_cis.id + AND {0}.`ci_id` IN ({1}) + INNER JOIN c_attributes as attr ON attr.id = {0}.attr_id +""" + +# {2}: value_table +QUERY_CIS_BY_IDS = """ + SELECT A.ci_id, + A.type_id, + A.attr_id, + A.attr_name, + A.attr_alias, + A.value, + A.value_type, + A.is_list + FROM + ({1}) AS A {0} + ORDER BY A.ci_id; +""" + +FACET_QUERY1 = """ + SELECT {0}.value, + count({0}.ci_id) + FROM {0} + INNER JOIN c_attributes AS attr ON attr.id={0}.attr_id + WHERE attr.name="{1}" + GROUP BY {0}.ci_id; +""" + +FACET_QUERY = """ + SELECT {0}.value, + count({0}.ci_id) + FROM {0} + INNER JOIN ({1}) AS F ON F.ci_id={0}.ci_id + WHERE {0}.attr_id={2:d} + GROUP BY {0}.value +""" + +QUERY_CI_BY_ATTR_NAME = """ + SELECT {0}.ci_id + FROM {0} + WHERE {0}.attr_id={1:d} + AND {0}.value {2} +""" + +QUERY_CI_BY_TYPE = """ + SELECT c_cis.id AS ci_id + FROM c_cis + WHERE c_cis.type_id in ({0}) +""" diff --git a/api/lib/cmdb/relation_type.py b/api/lib/cmdb/relation_type.py new file mode 100644 index 0000000..e932510 --- /dev/null +++ b/api/lib/cmdb/relation_type.py @@ -0,0 +1,37 @@ +# -*- coding:utf-8 -*- + + +from flask import abort + +from api.models.cmdb import RelationType + + +class RelationTypeManager(object): + @staticmethod + def get_all(): + return RelationType.get_by(to_dict=False) + + @classmethod + def get_names(cls): + return [i.name for i in cls.get_all()] + + @classmethod + def get_pairs(cls): + return [(i.id, i.name) for i in cls.get_all()] + + @staticmethod + def add(name): + RelationType.get_by(name=name, first=True, to_dict=False) and abort(400, "It's already existed") + return RelationType.create(name=name) + + @staticmethod + def update(rel_id, name): + existed = RelationType.get_by_id(rel_id) or abort(404, "RelationType <{0}> does not exist".format(rel_id)) + + return existed.update(name=name) + + @staticmethod + def delete(rel_id): + existed = RelationType.get_by_id(rel_id) or abort(404, "RelationType <{0}> does not exist".format(rel_id)) + + existed.soft_delete() diff --git a/api/lib/cmdb/search.py b/api/lib/cmdb/search.py new file mode 100644 index 0000000..95de15d --- /dev/null +++ b/api/lib/cmdb/search.py @@ -0,0 +1,356 @@ +# -*- coding:utf-8 -*- + + +import time + +from flask import current_app + +from api.extensions import db +from api.lib.utils import handle_arg_list +from api.lib.cmdb.cache import AttributeCache +from api.lib.cmdb.cache import CITypeCache +from api.lib.cmdb.ci import CIManager +from api.lib.cmdb.const import RetKey +from api.lib.cmdb.const import TableMap +from api.lib.cmdb.query_sql import FACET_QUERY +from api.lib.cmdb.query_sql import QUERY_CI_BY_ATTR_NAME +from api.lib.cmdb.query_sql import QUERY_CI_BY_TYPE +from api.models.cmdb import Attribute +from api.models.cmdb import CI + + +class SearchError(Exception): + def __init__(self, v): + self.v = v + + def __str__(self): + return self.v + + +class Search(object): + def __init__(self, query=None, fl=None, facet_field=None, page=1, ret_key=RetKey.NAME, count=1, sort=None): + self.orig_query = query + self.fl = fl + self.facet_field = facet_field + self.page = page + self.ret_key = ret_key + self.count = count + self.sort = sort + self.query_sql = "" + self.type_id_list = [] + self.only_type_query = False + + @staticmethod + def _operator_proc(key): + operator = "&" + if key.startswith("+"): + key = key[1:].strip() + elif key.startswith("-"): + operator = "|" + key = key[1:].strip() + elif key.startswith("~"): + operator = "~" + key = key[1:].strip() + + return operator, key + + def _attr_name_proc(self, key): + operator, key = self._operator_proc(key) + + if key in ('ci_type', 'type', '_type'): + return '_type', Attribute.TEXT, operator, None + + if key in ('id', 'ci_id', '_id'): + return '_id', Attribute.TEXT, operator, None + + attr = AttributeCache.get(key) + if attr: + return attr.name, attr.value_type, operator, attr + else: + raise SearchError("{0} is not existed".format(key)) + + def _type_query_handler(self, v): + new_v = v[1:-1].split(";") if v.startswith("(") and v.endswith(")") else [v] + for _v in new_v: + ci_type = CITypeCache.get(_v) + if ci_type is not None: + self.type_id_list.append(str(ci_type.id)) + + if self.type_id_list: + type_ids = ",".join(self.type_id_list) + _query_sql = QUERY_CI_BY_TYPE.format(type_ids) + if self.only_type_query: + return _query_sql + else: + return "" + return "" + + @staticmethod + def _in_query_handler(attr, v): + new_v = v[1:-1].split(";") + table_name = TableMap(attr_name=attr.name).table_name + in_query = " OR {0}.value ".format(table_name).join(['LIKE "{0}"'.format(_v.replace("*", "%")) for _v in new_v]) + _query_sql = QUERY_CI_BY_ATTR_NAME.format(table_name, attr.id, in_query) + return _query_sql + + @staticmethod + def _range_query_handler(attr, v): + start, end = [x.strip() for x in v[1:-1].split("_TO_")] + table_name = TableMap(attr_name=attr.name).table_name + range_query = "BETWEEN '{0}' AND '{1}'".format(start.replace("*", "%"), end.replace("*", "%")) + _query_sql = QUERY_CI_BY_ATTR_NAME.format(table_name, attr.id, range_query) + return _query_sql + + @staticmethod + def _comparison_query_handler(attr, v): + table_name = TableMap(attr_name=attr.name).table_name + if v.startswith(">=") or v.startswith("<="): + comparison_query = "{0} '{1}'".format(v[:2], v[2:].replace("*", "%")) + else: + comparison_query = "{0} '{1}'".format(v[0], v[1:].replace("*", "%")) + _query_sql = QUERY_CI_BY_ATTR_NAME.format(table_name, attr.id, comparison_query) + return _query_sql + + @staticmethod + def __sort_by(field): + field = field or "" + sort_type = "ASC" + if field.startswith("+"): + field = field[1:] + elif field.startswith("-"): + field = field[1:] + sort_type = "DESC" + return field, sort_type + + def __sort_by_id(self, sort_type, query_sql): + ret_sql = "SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id FROM ({0}) AS B {1}" + + if self.only_type_query: + return ret_sql.format(query_sql, "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( + (self.page - 1) * self.count, sort_type, self.count)) + + elif self.type_id_list: + self.query_sql = "SELECT B.ci_id FROM ({0}) AS B {1}".format( + query_sql, + "INNER JOIN c_cis on c_cis.id=B.ci_id WHERE c_cis.type_id in ({0}) ".format( + ",".join(self.type_id_list))) + + return ret_sql.format( + query_sql, + "INNER JOIN c_cis on c_cis.id=B.ci_id WHERE c_cis.type_id in ({3}) " + "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( + (self.page - 1) * self.count, sort_type, self.count, ",".join(self.type_id_list))) + + else: + self.query_sql = "SELECT B.ci_id FROM ({0}) AS B {1}".format( + query_sql, + "INNER JOIN c_cis on c_cis.id=B.ci_id ") + + return ret_sql.format( + query_sql, + "INNER JOIN c_cis on c_cis.id=B.ci_id " + "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format((self.page - 1) * self.count, sort_type, self.count)) + + def __sort_by_field(self, field, sort_type, query_sql): + attr = AttributeCache.get(field) + attr_id = attr.id + + table_name = TableMap(attr_name=attr.name).table_name + _v_query_sql = """SELECT {0}.ci_id, {1}.value + FROM ({2}) AS {0} INNER JOIN {1} ON {1}.ci_id = {0}.ci_id + WHERE {1}.attr_id = {3}""".format("ALIAS", table_name, query_sql, attr_id) + new_table = _v_query_sql + + if self.only_type_query or not self.type_id_list: + return "SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id, C.value " \ + "FROM ({0}) AS C " \ + "ORDER BY C.value {2} " \ + "LIMIT {1:d}, {3};".format(new_table, (self.page - 1) * self.count, sort_type, self.count) + + elif self.type_id_list: + self.query_sql = """SELECT C.ci_id + FROM ({0}) AS C + INNER JOIN cis on c_cis.id=C.ci_id + WHERE cis.type_id in ({1})""".format(new_table, ",".join(self.type_id_list)) + + return """SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id, C.value + FROM ({0}) AS C + INNER JOIN cis on c_cis.id=C.ci_id + WHERE cis.type_id in ({4}) + ORDER BY C.value {2} + LIMIT {1:d}, {3};""".format(new_table, + (self.page - 1) * self.count, + sort_type, self.count, + ",".join(self.type_id_list)) + + def _sort_query_handler(self, field, query_sql): + + field, sort_type = self.__sort_by(field) + + if field in ("_id", "ci_id") or not field: + return self.__sort_by_id(sort_type, query_sql) + else: + return self.__sort_by_field(field, sort_type, query_sql) + + @staticmethod + def _wrap_sql(operator, alias, _query_sql, query_sql): + if operator == "&": + query_sql = """SELECT * FROM ({0}) as {1} + INNER JOIN ({2}) as {3} USING(ci_id)""".format(query_sql, alias, _query_sql, alias + "A") + + elif operator == "|": + query_sql = "SELECT * FROM ({0}) as {1} UNION ALL ({2})".format(query_sql, alias, _query_sql) + + elif operator == "~": + query_sql = """SELECT * FROM ({0}) as {1} LEFT JOIN ({2}) as {3} USING(ci_id) + WHERE {3}.ci_id is NULL""".format(query_sql, alias, _query_sql, alias + "A") + + return query_sql + + def _execute_sql(self, query_sql): + v_query_sql = self._sort_query_handler(self.sort, query_sql) + + start = time.time() + execute = db.session.execute + current_app.logger.debug(v_query_sql) + res = execute(v_query_sql).fetchall() + end_time = time.time() + current_app.logger.debug("query ci ids time is: {0}".format(end_time - start)) + + numfound = execute("SELECT FOUND_ROWS();").fetchall()[0][0] + current_app.logger.debug("statistics ci ids time is: {0}".format(time.time() - end_time)) + + return numfound, res + + def __confirm_type_first(self, queries): + for q in queries: + if q.startswith("_type"): + queries.remove(q) + queries.insert(0, q) + if len(queries) == 1 or queries[1].startswith("-") or queries[1].startswith("~"): + self.only_type_query = True + return queries + + def __query_build_by_field(self, queries): + query_sql, alias, operator = "", "A", "&" + is_first, only_type_query_special = True, True + + for q in queries: + _query_sql = "" + if ":" in q: + k = q.split(":")[0].strip() + v = ":".join(q.split(":")[1:]).strip() + current_app.logger.debug(v) + field, field_type, operator, attr = self._attr_name_proc(k) + if field == "_type": + _query_sql = self._type_query_handler(v) + current_app.logger.debug(_query_sql) + elif field == "_id": # exclude all others + ci = CI.get_by_id(v) + if ci is not None: + return 1, [str(v)] + elif field: + if attr is None: + raise SearchError("{0} is not found".format(field)) + + # in query + if v.startswith("(") and v.endswith(")"): + _query_sql = self._in_query_handler(attr, v) + # range query + elif v.startswith("[") and v.endswith("]") and "_TO_" in v: + _query_sql = self._range_query_handler(attr, v) + # comparison query + elif v.startswith(">=") or v.startswith("<=") or v.startswith(">") or v.startswith("<"): + _query_sql = self._comparison_query_handler(attr, v) + else: + table_name = TableMap(attr_name=attr.name).table_name + _query_sql = QUERY_CI_BY_ATTR_NAME.format( + table_name, attr.id, 'LIKE "{0}"'.format(v.replace("*", "%"))) + else: + raise SearchError("argument q format invalid: {0}".format(q)) + elif q: + raise SearchError("argument q format invalid: {0}".format(q)) + + if is_first and _query_sql and not self.only_type_query: + query_sql = "SELECT * FROM ({0}) AS {1}".format(_query_sql, alias) + is_first = False + alias += "A" + elif self.only_type_query and only_type_query_special: + is_first = False + only_type_query_special = False + query_sql = _query_sql + elif _query_sql: + query_sql = self._wrap_sql(operator, alias, _query_sql, query_sql) + alias += "AA" + return None, query_sql + + def _query_build_raw(self): + + queries = handle_arg_list(self.orig_query) + queries = self.__confirm_type_first(queries) + current_app.logger.debug(queries) + + ret, query_sql = self.__query_build_by_field(queries) + if ret is not None: + return ret, query_sql + + s = time.time() + if query_sql: + self.query_sql = query_sql + current_app.logger.debug(query_sql) + numfound, res = self._execute_sql(query_sql) + current_app.logger.info("query ci ids is: {0}".format(time.time() - s)) + return numfound, [_res[0] for _res in res] + + return 0, [] + + def _facet_build(self): + facet = {} + for f in self.facet_field: + k, field_type, _, attr = self._attr_name_proc(f) + if k: + table_name = TableMap(attr_name=k).table_name + query_sql = FACET_QUERY.format(table_name, self.query_sql, attr.id) + current_app.logger.debug(query_sql) + result = db.session.execute(query_sql).fetchall() + facet[k] = result + + facet_result = dict() + for k, v in facet.items(): + if not k.startswith('_'): + a = getattr(AttributeCache.get(k), self.ret_key) + facet_result[a] = [(f[0], f[1], a) for f in v] + + return facet_result + + def _fl_build(self): + _fl = list() + for f in self.fl: + k, _, _, _ = self._attr_name_proc(f) + if k: + _fl.append(k) + + return _fl + + def search(self): + numfound, ci_ids = self._query_build_raw() + ci_ids = list(map(str, ci_ids)) + + _fl = self._fl_build() + + if self.facet_field and numfound: + facet = self._facet_build() + else: + facet = dict() + + response, counter = [], {} + if ci_ids: + response = CIManager.get_cis_by_ids(ci_ids, ret_key=self.ret_key, fields=_fl) + for res in response: + ci_type = res.get("ci_type") + if ci_type not in counter.keys(): + counter[ci_type] = 0 + counter[ci_type] += 1 + total = len(response) + + return response, counter, total, self.page, numfound, facet diff --git a/api/lib/cmdb/value.py b/api/lib/cmdb/value.py new file mode 100644 index 0000000..951b29e --- /dev/null +++ b/api/lib/cmdb/value.py @@ -0,0 +1,138 @@ +# -*- coding:utf-8 -*- + + +import markupsafe + +from flask import abort + +from api.extensions import db +from api.lib.utils import handle_arg_list +from api.lib.cmdb.cache import AttributeCache +from api.lib.cmdb.attribute import AttributeManager +from api.lib.cmdb.const import type_map +from api.lib.cmdb.const import TableMap +from api.lib.cmdb.const import ExistPolicy +from api.lib.cmdb.const import OperateType +from api.lib.cmdb.history import AttributeHistoryManger + + +class AttributeValueManager(object): + """ + manage CI attribute values + """ + + def __init__(self): + pass + + @staticmethod + def _get_attr(key): + """ + :param key: id, name or alias + :return: attribute instance + """ + return AttributeCache.get(key) + + def get_attr_values(self, fields, ci_id, ret_key="name", unique_key=None, use_master=False): + """ + + :param fields: + :param ci_id: + :param ret_key: It can be name or alias + :param unique_key: primary attribute + :param use_master: Only for master-slave read-write separation + :return: + """ + res = dict() + for field in fields: + attr = self._get_attr(field) + if not attr: + continue + value_table = TableMap(attr_name=attr.name).table + rs = value_table.get_by(ci_id=ci_id, + attr_id=attr.id, + use_master=use_master, + to_dict=False) + field_name = getattr(attr, ret_key) + + if attr.is_list: + res[field_name] = [type_map["serialize"][attr.value_type](i.value) for i in rs] + else: + res[field_name] = type_map["serialize"][attr.value_type](rs[0].value) if rs else None + + if unique_key is not None and attr.id == unique_key.id and rs: + res['unique'] = unique_key.name + + return res + + @staticmethod + def __deserialize_value(value_type, value): + if not value: + return value + deserialize = type_map["deserialize"][value_type] + try: + v = deserialize(value) + if isinstance(v, markupsafe.Markup): + v = str(v) + return v + except ValueError: + return abort(400, "attribute value <{0}> is invalid".format(value)) + + @staticmethod + def __check_is_choice(attr_id, value_type, value): + choice_values = AttributeManager.get_choice_values(attr_id, value_type) + if value not in choice_values: + return abort(400, "{0} does not existed in choice values".format(value)) + + @staticmethod + def __check_is_unique(value_table, attr_id, ci_id, value): + db.session.query(value_table.attr_id).filter( + value_table.attr_id == attr_id).filter(value_table.deleted.is_(False)).filter( + value_table.value == value).filter(value_table.ci_id != ci_id).first() \ + and abort(400, "attribute <{0}> value {1} must be unique".format(attr_id, value)) + + def _validate(self, attr, value, value_table, ci_id): + v = self.__deserialize_value(attr.value_type, value) + + attr.is_choice and value and self.__check_is_choice(attr.id, attr.value_type, v) + attr.is_unique and self.__check_is_unique(value_table, attr.id, ci_id, v) + + return v + + @staticmethod + def _write_change(ci_id, attr_id, operate_type, old, new): + AttributeHistoryManger.add(ci_id, [(attr_id, operate_type, old, new)]) + + def create_or_update_attr_value(self, key, value, ci_id, _no_attribute_policy=ExistPolicy.IGNORE): + """ + add or update attribute value, then write history + :param key: id, name or alias + :param value: + :param ci_id: + :param _no_attribute_policy: ignore or reject + :return: + """ + attr = self._get_attr(key) + if attr is None: + if _no_attribute_policy == ExistPolicy.IGNORE: + return + if _no_attribute_policy == ExistPolicy.REJECT: + return abort(400, 'attribute {0} does not exist'.format(key)) + + value_table = TableMap(attr_name=attr.name).table + existed_attr = value_table.get_by(attr_id=attr.id, + ci_id=ci_id, + first=True, + to_dict=False) + existed_value = existed_attr and existed_attr.value + operate_type = OperateType.ADD if existed_attr is None else OperateType.UPDATE + + value_list = handle_arg_list(value) if attr.is_list else [value] + + for v in value_list: + v = self._validate(attr, v, value_table, ci_id) + if operate_type == OperateType.ADD: + value_table.create(ci_id=ci_id, attr_id=attr.id, value=v) + self._write_change(ci_id, attr.id, operate_type, None, v) + elif existed_attr.value != v: + existed_attr.update(value=v) + self._write_change(ci_id, attr.id, operate_type, existed_value, v) diff --git a/api/lib/database.py b/api/lib/database.py new file mode 100644 index 0000000..2ac9867 --- /dev/null +++ b/api/lib/database.py @@ -0,0 +1,121 @@ +# -*- coding:utf-8 -*- + +import datetime + +import six + +from api.extensions import db +from api.lib.exception import CommitException + + +class FormatMixin(object): + def to_dict(self): + return dict([(k.name, getattr(self, k.name)) for k in getattr(self, "__table__").columns]) + + @classmethod + def get_columns(cls): + return {k.name: 1 for k in getattr(cls, "__mapper__").c.values()} + + +class CRUDMixin(FormatMixin): + + @classmethod + def create(cls, flush=False, **kwargs): + return cls(**kwargs).save(flush=flush) + + def update(self, flush=False, **kwargs): + kwargs.pop("id", None) + for attr, value in six.iteritems(kwargs): + if value is not None: + setattr(self, attr, value) + if flush: + return self.save(flush=flush) + return self.save() + + def save(self, commit=True, flush=False): + db.session.add(self) + try: + if flush: + db.session.flush() + elif commit: + db.session.commit() + except Exception as e: + db.session.rollback() + raise CommitException(str(e)) + + return self + + def delete(self, flush=False): + db.session.delete(self) + try: + if flush: + return db.session.flush() + return db.session.commit() + except Exception as e: + db.session.rollback() + raise CommitException(str(e)) + + def soft_delete(self, flush=False): + setattr(self, "deleted", True) + setattr(self, "deleted_at", datetime.datetime.now()) + self.save(flush=flush) + + @classmethod + def get_by_id(cls, _id): + if any((isinstance(_id, six.string_types) and _id.isdigit(), + isinstance(_id, (int, float))), ): + return getattr(cls, "query").get(int(_id)) or None + + @classmethod + def get_by(cls, first=False, to_dict=True, fl=None, exclude=None, deleted=False, use_master=False, **kwargs): + db_session = db.session if not use_master else db.session().using_bind("master") + fl = fl.strip().split(",") if fl and isinstance(fl, six.string_types) else (fl or []) + exclude = exclude.strip().split(",") if exclude and isinstance(exclude, six.string_types) else (exclude or []) + + keys = cls.get_columns() + fl = [k for k in fl if k in keys] + fl = [k for k in keys if k not in exclude and not k.isupper()] if exclude else fl + fl = list(filter(lambda x: "." not in x, fl)) + + if hasattr(cls, "deleted") and deleted is not None: + kwargs["deleted"] = deleted + + if fl: + query = db_session.query(*[getattr(cls, k) for k in fl]) + query = query.filter_by(**kwargs) + result = [{k: getattr(i, k) for k in fl} for i in query] + else: + result = [i.to_dict() if to_dict else i for i in getattr(cls, 'query').filter_by(**kwargs)] + + return result[0] if first and result else (None if first else result) + + @classmethod + def get_by_like(cls, to_dict=True, **kwargs): + query = db.session.query(cls) + for k, v in kwargs.items(): + query = query.filter(getattr(cls, k).ilike('%{0}%'.format(v))) + return [i.to_dict() if to_dict else i for i in query] + + +class SoftDeleteMixin(object): + deleted_at = db.Column(db.DateTime) + deleted = db.Column(db.Boolean, index=True, default=False) + + +class TimestampMixin(object): + created_at = db.Column(db.DateTime, default=lambda: datetime.datetime.now()) + updated_at = db.Column(db.DateTime, onupdate=lambda: datetime.datetime.now()) + + +class SurrogatePK(object): + __table_args__ = {"extend_existing": True} + + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + + +class Model(SoftDeleteMixin, TimestampMixin, CRUDMixin, db.Model, SurrogatePK): + __abstract__ = True + + +class CRUDModel(db.Model, CRUDMixin): + __abstract__ = True diff --git a/api/lib/decorator.py b/api/lib/decorator.py new file mode 100644 index 0000000..d4c6342 --- /dev/null +++ b/api/lib/decorator.py @@ -0,0 +1,35 @@ +# -*- coding:utf-8 -*- + + +from functools import wraps + +from flask import abort +from flask import request + + +def kwargs_required(*required_args): + def decorate(func): + @wraps(func) + def wrapper(*args, **kwargs): + for arg in required_args: + if arg not in kwargs: + return abort(400, "Argument <{0}> is required".format(arg)) + return func(*args, **kwargs) + + return wrapper + + return decorate + + +def args_required(*required_args): + def decorate(func): + @wraps(func) + def wrapper(*args, **kwargs): + for arg in required_args: + if arg not in request.values: + return abort(400, "Argument <{0}> is required".format(arg)) + return func(*args, **kwargs) + + return wrapper + + return decorate diff --git a/api/lib/exception.py b/api/lib/exception.py new file mode 100644 index 0000000..0a68289 --- /dev/null +++ b/api/lib/exception.py @@ -0,0 +1,5 @@ +# -*- coding:utf-8 -*- + + +class CommitException(Exception): + pass diff --git a/api/lib/http_cli.py b/api/lib/http_cli.py new file mode 100644 index 0000000..6c59777 --- /dev/null +++ b/api/lib/http_cli.py @@ -0,0 +1,48 @@ +# -*- coding:utf-8 -*- + + +import hashlib + +import requests +from future.moves.urllib.parse import urlparse +from flask import abort +from flask import g +from flask import current_app + + +def build_api_key(path, params): + g.user is not None or abort(403, u"您得登陆才能进行该操作") + key = g.user.key + secret = g.user.secret + values = "".join([str(params[k]) for k in sorted(params.keys()) + if params[k] is not None]) if params.keys() else "" + _secret = "".join([path, secret, values]).encode("utf-8") + params["_secret"] = hashlib.sha1(_secret).hexdigest() + params["_key"] = key + return params + + +def api_request(url, method="get", params=None, ret_key=None): + params = params or {} + resp = None + try: + method = method.lower() + params = build_api_key(urlparse(url).path, params) + if method == "get": + resp = getattr(requests, method)(url, params=params) + else: + resp = getattr(requests, method)(url, data=params) + if resp.status_code != 200: + return abort(resp.status_code, resp.json().get("message")) + resp = resp.json() + if ret_key is not None: + return resp.get(ret_key) + return resp + except Exception as e: + code = e.code if hasattr(e, "code") else None + if isinstance(code, int) and resp is not None: + return abort(code, resp.json().get("message")) + current_app.logger.warning(url) + current_app.logger.warning(params) + current_app.logger.error(str(e)) + return abort(500, "server unknown error") diff --git a/api/lib/mail.py b/api/lib/mail.py new file mode 100644 index 0000000..0fbf25d --- /dev/null +++ b/api/lib/mail.py @@ -0,0 +1,49 @@ +# -*- coding:utf-8 -*- + + +from flask import current_app + +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from email.header import Header +from email.mime.image import MIMEImage +import smtplib +import time +from email import Utils + + +def send_mail(sender, receiver, subject, content, ctype="html", pics=()): + """subject and body are unicode objects""" + if not sender: + sender = current_app.config.get("DEFAULT_MAIL_SENDER") + smtpserver = current_app.config.get("MAIL_SERVER") + if ctype == "html": + msg = MIMEText(content, 'html', 'utf-8') + else: + msg = MIMEText(content, 'plain', 'utf-8') + + if len(pics) != 0: + msgRoot = MIMEMultipart('related') + msgText = MIMEText(content, 'html', 'utf-8') + msgRoot.attach(msgText) + i = 1 + for pic in pics: + fp = open(pic, "rb") + image = MIMEImage(fp.read()) + fp.close() + image.add_header('Content-ID', '' % i) + msgRoot.attach(image) + i += 1 + msg = msgRoot + + msg['Subject'] = Header(subject, 'utf-8') + msg['From'] = sender + msg['To'] = ';'.join(receiver) + msg['Message-ID'] = Utils.make_msgid() + msg['date'] = time.strftime('%a, %d %b %Y %H:%M:%S %z') + + smtp = smtplib.SMTP() + smtp.connect(smtpserver, 25) + # smtp.login(username, password) + smtp.sendmail(sender, receiver, msg.as_string()) + smtp.quit() diff --git a/api/lib/perm/__init__.py b/api/lib/perm/__init__.py new file mode 100644 index 0000000..380474e --- /dev/null +++ b/api/lib/perm/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- diff --git a/api/lib/perm/acl.py b/api/lib/perm/acl.py new file mode 100644 index 0000000..7902b04 --- /dev/null +++ b/api/lib/perm/acl.py @@ -0,0 +1,139 @@ +# -*- coding:utf-8 -*- + +import functools + +import six + +from flask import current_app, g, request +from flask import session, abort + +from api.extensions import cache + + +def get_access_token(): + return + + +class AccessTokenCache(object): + @classmethod + def get(cls): + if cache.get("AccessToken") is not None: + return cache.get("AccessToken") + + res = get_access_token() or "" + + cache.set("AccessToken", res, timeout=60 * 60) + return res + + @classmethod + def clean(cls): + cache.clear("AccessToken") + + +class ACLManager(object): + def __init__(self): + self.access_token = AccessTokenCache.get() + self.acl_session = dict(uid=session.get("uid"), + token=self.access_token) + + self.user_info = session["acl"] if "acl" in session else {} + + def add_resource(self, name, resource_type_name=None): + pass + + def grant_resource_to_role(self, name, role, resource_type_name=None): + pass + + def del_resource(self, name, resource_type_name=None): + pass + + def get_user_info(self, username): + return dict() + + def get_resources(self, resource_type_name=None): + if "acl" not in session: + abort(405) + return [] + + def has_permission(self, resource_name, resource_type, perm): + if "acl" not in session: + abort(405) + return True + + +def validate_permission(resources, resource_type, perm): + if not resources: + return + + if current_app.config.get("USE_ACL"): + if g.user.username == "worker": + return + + resources = [resources] if isinstance(resources, six.string_types) else resources + for resource in resources: + if not ACLManager().has_permission(resource, resource_type, perm): + return abort(403, "has no permission") + + +def can_access_resources(resource_type): + def decorator_can_access_resources(func): + @functools.wraps(func) + def wrapper_can_access_resources(*args, **kwargs): + if current_app.config.get("USE_ACL"): + res = ACLManager().get_resources(resource_type) + result = {i.get("name"): i.get("permissions") for i in res} + if hasattr(g, "resources"): + g.resources.update({resource_type: result}) + else: + g.resources = {resource_type: result} + return func(*args, **kwargs) + return wrapper_can_access_resources + return decorator_can_access_resources + + +def has_perm(resources, resource_type, perm): + def decorator_has_perm(func): + @functools.wraps(func) + def wrapper_has_perm(*args, **kwargs): + if not resources: + return + + if current_app.config.get("USE_ACL"): + validate_permission(resources, resource_type, perm) + + return func(*args, **kwargs) + return wrapper_has_perm + return decorator_has_perm + + +def has_perm_from_args(arg_name, resource_type, perm, callback=None): + def decorator_has_perm(func): + @functools.wraps(func) + def wrapper_has_perm(*args, **kwargs): + if not arg_name: + return + resource = request.view_args.get(arg_name) or request.values.get(arg_name) + if callback is not None and resource: + resource = callback(resource) + + if current_app.config.get("USE_ACL") and resource: + validate_permission(resource, resource_type, perm) + + return func(*args, **kwargs) + return wrapper_has_perm + return decorator_has_perm + + +def role_required(role_name): + def decorator_role_required(func): + @functools.wraps(func) + def wrapper_role_required(*args, **kwargs): + if not role_name: + return + + if current_app.config.get("USE_ACL"): + if role_name not in session.get("acl", {}).get("parentRoles", []): + return abort(403, "Role {0} is required".format(role_name)) + return func(*args, **kwargs) + return wrapper_role_required + return decorator_role_required diff --git a/api/lib/perm/auth.py b/api/lib/perm/auth.py new file mode 100644 index 0000000..e1637f4 --- /dev/null +++ b/api/lib/perm/auth.py @@ -0,0 +1,102 @@ +# -*- coding:utf-8 -*- + + +from functools import wraps + +import jwt +from flask import current_app +from flask import request +from flask import session +from flask import g +from flask import abort +from flask_login import login_user + +from api.models.account import User +from api.models.account import UserCache + + +def _auth_with_key(): + key = request.values.get('_key') + secret = request.values.get('_secret') + path = request.path + keys = sorted(request.values.keys()) + req_args = [request.values[k] for k in keys if str(k) not in ("_key", "_secret")] + user, authenticated = User.query.authenticate_with_key(key, secret, req_args, path) + if user and authenticated: + login_user(user) + return True + return False + + +def _auth_with_session(): + if isinstance(getattr(g, 'user', None), User): + login_user(g.user) + return True + if "acl" in session and "userName" in (session["acl"] or {}): + login_user(UserCache.get(session["acl"]["userName"])) + return True + return False + + +def _auth_with_token(): + auth_headers = request.headers.get('Access-Token', '').strip() + if not auth_headers: + return False + + try: + token = auth_headers + data = jwt.decode(token, current_app.config['SECRET_KEY']) + user = User.query.filter_by(email=data['sub']).first() + if not user: + return False + + login_user(user) + return True + except jwt.ExpiredSignatureError: + return False + except (jwt.InvalidTokenError, Exception) as e: + return False + + +def _auth_with_ip_white_list(): + ip = request.remote_addr + key = request.values.get('_key') + secret = request.values.get('_secret') + + if not key and not secret and ip.strip() in current_app.config.get("WHITE_LIST", []): # TODO + user = UserCache.get("worker") + login_user(user) + return True + return False + + +def auth_required(func): + if request.json is not None: + setattr(request, 'values', request.json) + else: + setattr(request, 'values', request.values.to_dict()) + + current_app.logger.debug(request.values) + + @wraps(func) + def wrapper(*args, **kwargs): + + if not getattr(func, 'authenticated', True): + return func(*args, **kwargs) + + if _auth_with_session() or _auth_with_key() or _auth_with_token() or _auth_with_ip_white_list(): + return func(*args, **kwargs) + + abort(401) + + return wrapper + + +def auth_abandoned(func): + setattr(func, "authenticated", False) + + @wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + + return wrapper diff --git a/lib/utils.py b/api/lib/utils.py similarity index 53% rename from lib/utils.py rename to api/lib/utils.py index 944a6d1..dd00fb1 100644 --- a/lib/utils.py +++ b/api/lib/utils.py @@ -1,14 +1,38 @@ -# -*- coding:utf-8 -*- - +# -*- coding:utf-8 -*- +import six import redis - from flask import current_app +def get_page(page): + try: + page = int(page) + except ValueError: + page = 1 + return page if page >= 1 else 1 + + +def get_page_size(page_size): + if page_size == "all": + return page_size + + try: + page_size = int(page_size) + except (ValueError, TypeError): + page_size = current_app.config.get("DEFAULT_PAGE_COUNT") + return page_size if page_size >= 1 else current_app.config.get("DEFAULT_PAGE_COUNT") + + +def handle_arg_list(arg): + return list(filter(lambda x: x != "", arg.strip().split(","))) if isinstance(arg, six.string_types) else arg + + class RedisHandler(object): - def __init__(self, flask_app=None): + def __init__(self, flask_app=None, prefix=None): self.flask_app = flask_app + self.prefix = prefix + self.r = None def init_app(self, app): self.flask_app = app @@ -21,55 +45,30 @@ class RedisHandler(object): db=config.get("REDIS_DB")) self.r = redis.Redis(connection_pool=pool) except Exception as e: + current_app.logger.warning(str(e)) current_app.logger.error("init redis connection failed") - # @classmethod - # def instance(cls): - # if not hasattr(cls, "_instance"): - # cls._instance = cls() - # return cls._instance - - def get(self, ci_ids, key="CMDB_CI"): + def get(self, key_ids): try: - value = self.r.hmget(key, ci_ids) + value = self.r.hmget(self.prefix, key_ids) except Exception as e: current_app.logger.error("get redis error, %s" % str(e)) return return value - def _set(self, ci, key="CMDB_CI"): + def _set(self, obj): try: - self.r.hmset(key, ci) + self.r.hmset(self.prefix, obj) except Exception as e: current_app.logger.error("set redis error, %s" % str(e)) - def add(self, ci): - self._set(ci) + def add(self, obj): + self._set(obj) - def delete(self, ci_id, key="CMDB_CI"): + def delete(self, key_id): try: - ret = self.r.hdel(key, ci_id) + ret = self.r.hdel(self.prefix, key_id) if not ret: - current_app.logger.warn("ci [%d] is not in redis" % ci_id) + current_app.logger.warn("[%d] is not in redis" % key_id) except Exception as e: current_app.logger.error("delete redis key error, %s" % str(e)) - - -def get_page(page): - try: - page = int(page) - except ValueError: - page = 1 - if page < 1: - page = 1 - return page - - -def get_per_page(per_page): - try: - per_page = int(per_page) - except: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - if per_page < 1: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - return per_page \ No newline at end of file diff --git a/api/models/__init__.py b/api/models/__init__.py new file mode 100644 index 0000000..fabbe66 --- /dev/null +++ b/api/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding:utf-8 -*- + + +from .account import User +from .cmdb import * diff --git a/models/account.py b/api/models/account.py similarity index 69% rename from models/account.py rename to api/models/account.py index 0a3b322..807476e 100644 --- a/models/account.py +++ b/api/models/account.py @@ -1,51 +1,24 @@ # -*- coding:utf-8 -*- - -import hashlib import copy +import hashlib from datetime import datetime -from werkzeug.utils import cached_property -from flask.ext.sqlalchemy import BaseQuery -from flask.ext.principal import RoleNeed -from flask.ext.principal import UserNeed -from flask.ext.principal import Permission +import six +from flask import current_app +from flask_sqlalchemy import BaseQuery -from extensions import db -from extensions import cache -from permissions import admin -from models import row2dict +from api.extensions import db +from api.extensions import cache +from api.lib.database import CRUDModel class UserQuery(BaseQuery): - def from_identity(self, identity): - """ - Loads user from flask.ext.principal.Identity instance and - assigns permissions from user. - - A "user" instance is monkey patched to the identity instance. - - If no user found then None is returned. - """ - - try: - _id = identity.id - if _id: - _id = int(_id) - user = self.get(_id) - except ValueError: - user = None - except Exception: - user = None - if user: - identity.provides.update(user.provides) - identity.user = user - return user - def authenticate(self, login, password): user = self.filter(db.or_(User.username == login, User.email == login)).first() if user: + current_app.logger.info(user) authenticated = user.check_password(password) else: authenticated = False @@ -60,7 +33,7 @@ class UserQuery(BaseQuery): authenticated = True else: authenticated = False - return row2dict(user), authenticated + return user, authenticated def search(self, key): query = self.filter(db.or_(User.email == key, @@ -80,16 +53,14 @@ class UserQuery(BaseQuery): user = self.filter(User.uid == uid).first() return copy.deepcopy(user) - def is_exits(self, username): - user = self.filter(User.username == username).first() - return user is not None - -class User(db.Model): +class User(CRUDModel): __tablename__ = 'users' + __bind_key__ = "user" query_class = UserQuery ADMIN = 1 + OP = 2 uid = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(32), unique=True) @@ -98,21 +69,15 @@ class User(db.Model): catalog = db.Column(db.String(64)) email = db.Column(db.String(100), unique=True, nullable=False) mobile = db.Column(db.String(14), unique=True) - _password = db.Column("password", db.String(80), nullable=False) + _password = db.Column("password", db.String(80)) key = db.Column(db.String(32), nullable=False) secret = db.Column(db.String(32), nullable=False) date_joined = db.Column(db.DateTime, default=datetime.utcnow) last_login = db.Column(db.DateTime, default=datetime.utcnow) block = db.Column(db.Boolean, default=False) has_logined = db.Column(db.Boolean, default=False) - - class Permissions(object): - def __init__(self, obj): - self.obj = obj - - @cached_property - def is_admin(self): - return Permission(UserNeed(self.obj.id)) & admin + wx_id = db.Column(db.String(32)) + avatar = db.Column(db.String(128)) def __init__(self, *args, **kwargs): super(User, self).__init__(*args, **kwargs) @@ -120,31 +85,31 @@ class User(db.Model): def __str__(self): return self.username - @cached_property - def permissions(self): - return self.Permissions(self) + def is_active(self): + return not self.block + + def get_id(self): + return self.uid + + @staticmethod + def is_authenticated(): + return True def _get_password(self): return self._password def _set_password(self, password): - self._password = password + self._password = hashlib.md5(password).hexdigest() - password = db.synonym("_password", descriptor=property( - _get_password, _set_password)) + password = db.synonym("_password", + descriptor=property(_get_password, + _set_password)) def check_password(self, password): + if self.password is None: + return False return self.password == password - @cached_property - def provides(self): - needs = [RoleNeed('authenticated'), UserNeed(self.uid)] - for r in self.rolenames: - needs.append(RoleNeed(r)) - if self.is_admin: - needs.append(RoleNeed('admin')) - return needs - @property def roles(self): urs = db.session.query(UserRole.rid).filter( @@ -153,23 +118,28 @@ class User(db.Model): @property def rolenames(self): - return [db.session.query(Role.role_name).filter( - Role.rid == rid).first().role_name for rid in self.roles] + roles = list() + for rid in self.roles: + role = db.session.query(Role).filter(Role.rid == rid).first() + roles.append(role.role_name) + return roles @property def is_admin(self): return self.ADMIN in self.roles -class Role(db.Model): +class Role(CRUDModel): __tablename__ = 'roles' + __bind_key__ = "user" rid = db.Column(db.Integer, primary_key=True, autoincrement=True) role_name = db.Column(db.String(64), nullable=False, unique=True) -class UserRole(db.Model): +class UserRole(CRUDModel): __tablename__ = 'users_roles' + __bind_key__ = "user" uid = db.Column(db.Integer, db.ForeignKey('users.uid'), primary_key=True) rid = db.Column(db.Integer, db.ForeignKey('roles.rid'), primary_key=True) @@ -211,7 +181,7 @@ class RoleCache(object): if not role: role = db.session.query(Role).filter(Role.rid == rid).first() cls.set(role) - elif isinstance(rid, basestring): + elif isinstance(rid, six.string_types): role = cache.get("Role::role_name::%s" % rid) if not role: role = db.session.query(Role).filter( @@ -227,4 +197,4 @@ class RoleCache(object): @classmethod def clean(cls, role): cache.delete("Role::rid::%s" % role.rid, role) - cache.delete("Role::role_name::%s" % role.role_name, role) \ No newline at end of file + cache.delete("Role::role_name::%s" % role.role_name, role) diff --git a/api/models/cmdb.py b/api/models/cmdb.py new file mode 100644 index 0000000..37251c5 --- /dev/null +++ b/api/models/cmdb.py @@ -0,0 +1,325 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from api.lib.database import Model +from api.extensions import db + + +# template + +class RelationType(Model): + __tablename__ = "c_relation_types" + + name = db.Column(db.String(16), index=True) + + +class CITypeGroup(Model): + __tablename__ = "c_ci_type_groups" + + name = db.Column(db.String(32)) + + +class CITypeGroupItem(Model): + __tablename__ = "c_ci_type_group_items" + + group_id = db.Column(db.Integer, db.ForeignKey("c_ci_type_groups.id"), nullable=False) + type_id = db.Column(db.Integer, db.ForeignKey("c_ci_types.id"), nullable=False) + order = db.Column(db.SmallInteger, default=0) + + +class CIType(Model): + __tablename__ = "c_ci_types" + + name = db.Column(db.String(32)) + alias = db.Column(db.String(32)) + unique_id = db.Column(db.Integer, db.ForeignKey("c_attributes.id"), nullable=False) + enabled = db.Column(db.Boolean, default=True, nullable=False) + is_attached = db.Column(db.Boolean, default=False, nullable=False) + icon_url = db.Column(db.String(256)) + order = db.Column(db.SmallInteger, default=0, nullable=False) + + unique_key = db.relationship("Attribute", backref="c_ci_types.unique_id") + + +class CITypeRelation(Model): + __tablename__ = "c_ci_type_relations" + + parent_id = db.Column(db.Integer, db.ForeignKey("c_ci_types.id"), nullable=False) + child_id = db.Column(db.Integer, db.ForeignKey("c_ci_types.id"), nullable=False) + relation_type_id = db.Column(db.Integer, db.ForeignKey("c_relation_types.id"), nullable=False) + + parent = db.relationship("CIType", primaryjoin="CIType.id==CITypeRelation.parent_id") + child = db.relationship("CIType", primaryjoin="CIType.id==CITypeRelation.child_id") + relation_type = db.relationship("RelationType", backref="c_ci_type_relations.relation_type_id") + + +class Attribute(Model): + __tablename__ = "c_attributes" + + INT = "0" + FLOAT = "1" + TEXT = "2" + DATETIME = "3" + DATE = "4" + TIME = "5" + + name = db.Column(db.String(32), nullable=False) + alias = db.Column(db.String(32), nullable=False) + value_type = db.Column(db.Enum(INT, FLOAT, TEXT, DATETIME, DATE, TIME), default=TEXT, nullable=False) + + is_choice = db.Column(db.Boolean, default=False) + is_list = db.Column(db.Boolean, default=False) + is_unique = db.Column(db.Boolean, default=False) + is_index = db.Column(db.Boolean, default=False) + is_link = db.Column(db.Boolean, default=False) + is_password = db.Column(db.Boolean, default=False) + is_sortable = db.Column(db.Boolean, default=False) + + +class CITypeAttribute(Model): + __tablename__ = "c_ci_type_attributes" + + type_id = db.Column(db.Integer, db.ForeignKey("c_ci_types.id"), nullable=False) + attr_id = db.Column(db.Integer, db.ForeignKey("c_attributes.id"), nullable=False) + order = db.Column(db.Integer, default=0) + is_required = db.Column(db.Boolean, default=False) + default_show = db.Column(db.Boolean, default=True) + + attr = db.relationship("Attribute", backref="c_ci_type_attributes.attr_id") + + +class CITypeAttributeGroup(Model): + __tablename__ = "c_ci_type_attribute_groups" + + name = db.Column(db.String(64)) + type_id = db.Column(db.Integer, db.ForeignKey("c_ci_types.id"), nullable=False) + order = db.Column(db.SmallInteger, default=0) + + +class CITypeAttributeGroupItem(Model): + __tablename__ = "c_ci_type_attribute_group_items" + + group_id = db.Column(db.Integer, db.ForeignKey("c_ci_type_attribute_groups.id"), nullable=False) + attr_id = db.Column(db.Integer, db.ForeignKey("c_attributes.id"), nullable=False) + order = db.Column(db.SmallInteger, default=0) + + +# instance + +class CI(Model): + __tablename__ = "c_cis" + + REVIEW = "0" + VALIDATE = "1" + + type_id = db.Column(db.Integer, db.ForeignKey("c_ci_types.id"), nullable=False) + status = db.Column(db.Enum(REVIEW, VALIDATE, name="status")) + heartbeat = db.Column(db.DateTime, default=lambda: datetime.datetime.now()) + + ci_type = db.relationship("CIType", backref="c_cis.type_id") + + +class CIRelation(Model): + __tablename__ = "c_ci_relations" + + first_ci_id = db.Column(db.Integer, db.ForeignKey("c_cis.id"), nullable=False) + second_ci_id = db.Column(db.Integer, db.ForeignKey("c_cis.id"), nullable=False) + relation_type_id = db.Column(db.Integer, db.ForeignKey("c_relation_types.id"), nullable=False) + more = db.Column(db.Integer, db.ForeignKey("c_cis.id")) + + first_ci = db.relationship("CI", primaryjoin="CI.id==CIRelation.first_ci_id") + second_ci = db.relationship("CI", primaryjoin="CI.id==CIRelation.second_ci_id") + relation_type = db.relationship("RelationType", backref="c_ci_relations.relation_type_id") + + +class IntegerChoice(Model): + __tablename__ = 'c_choice_integers' + + attr_id = db.Column(db.Integer, db.ForeignKey('c_attributes.id'), nullable=False) + value = db.Column(db.Integer, nullable=False) + + attr = db.relationship("Attribute", backref="c_choice_integers.attr_id") + + +class FloatChoice(Model): + __tablename__ = 'c_choice_floats' + + attr_id = db.Column(db.Integer, db.ForeignKey('c_attributes.id'), nullable=False) + value = db.Column(db.Float, nullable=False) + + attr = db.relationship("Attribute", backref="c_choice_floats.attr_id") + + +class TextChoice(Model): + __tablename__ = 'c_choice_texts' + + attr_id = db.Column(db.Integer, db.ForeignKey('c_attributes.id'), nullable=False) + value = db.Column(db.Text, nullable=False) + + attr = db.relationship("Attribute", backref="c_choice_texts.attr_id") + + +class CIIndexValueInteger(Model): + __tablename__ = "c_value_index_integers" + + ci_id = db.Column(db.Integer, db.ForeignKey('c_cis.id'), nullable=False) + attr_id = db.Column(db.Integer, db.ForeignKey('c_attributes.id'), nullable=False) + value = db.Column(db.Integer, nullable=False) + + ci = db.relationship("CI", backref="c_value_index_integers.ci_id") + attr = db.relationship("Attribute", backref="c_value_index_integers.attr_id") + + __table_args__ = (db.Index("integer_attr_value_index", "attr_id", "value"), ) + + +class CIIndexValueFloat(Model): + __tablename__ = "c_value_index_floats" + + ci_id = db.Column(db.Integer, db.ForeignKey('c_cis.id'), nullable=False) + attr_id = db.Column(db.Integer, db.ForeignKey('c_attributes.id'), nullable=False) + value = db.Column(db.Float, nullable=False) + + ci = db.relationship("CI", backref="c_value_index_floats.ci_id") + attr = db.relationship("Attribute", backref="c_value_index_floats.attr_id") + + __table_args__ = (db.Index("float_attr_value_index", "attr_id", "value"), ) + + +class CIIndexValueText(Model): + __tablename__ = "c_value_index_texts" + + ci_id = db.Column(db.Integer, db.ForeignKey('c_cis.id'), nullable=False) + attr_id = db.Column(db.Integer, db.ForeignKey('c_attributes.id'), nullable=False) + value = db.Column(db.String(128), nullable=False) + + ci = db.relationship("CI", backref="c_value_index_texts.ci_id") + attr = db.relationship("Attribute", backref="c_value_index_texts.attr_id") + + __table_args__ = (db.Index("text_attr_value_index", "attr_id", "value"), ) + + +class CIIndexValueDateTime(Model): + __tablename__ = "c_value_index_datetime" + + ci_id = db.Column(db.Integer, db.ForeignKey('c_cis.id'), nullable=False) + attr_id = db.Column(db.Integer, db.ForeignKey('c_attributes.id'), nullable=False) + value = db.Column(db.DateTime, nullable=False) + + ci = db.relationship("CI", backref="c_value_index_datetime.ci_id") + attr = db.relationship("Attribute", backref="c_value_index_datetime.attr_id") + + __table_args__ = (db.Index("datetime_attr_value_index", "attr_id", "value"), ) + + +class CIValueInteger(Model): + __tablename__ = "c_value_integers" + + ci_id = db.Column(db.Integer, db.ForeignKey('c_cis.id'), nullable=False) + attr_id = db.Column(db.Integer, db.ForeignKey('c_attributes.id'), nullable=False) + value = db.Column(db.Integer, nullable=False) + + ci = db.relationship("CI", backref="c_value_integers.ci_id") + attr = db.relationship("Attribute", backref="c_value_integers.attr_id") + + +class CIValueFloat(Model): + __tablename__ = "c_value_floats" + + ci_id = db.Column(db.Integer, db.ForeignKey('c_cis.id'), nullable=False) + attr_id = db.Column(db.Integer, db.ForeignKey('c_attributes.id'), nullable=False) + value = db.Column(db.Float, nullable=False) + + ci = db.relationship("CI", backref="c_value_floats.ci_id") + attr = db.relationship("Attribute", backref="c_value_floats.attr_id") + + +class CIValueText(Model): + __tablename__ = "c_value_texts" + + ci_id = db.Column(db.Integer, db.ForeignKey('c_cis.id'), nullable=False) + attr_id = db.Column(db.Integer, db.ForeignKey('c_attributes.id'), nullable=False) + value = db.Column(db.Text, nullable=False) + + ci = db.relationship("CI", backref="c_value_texts.ci_id") + attr = db.relationship("Attribute", backref="c_value_texts.attr_id") + + +class CIValueDateTime(Model): + __tablename__ = "c_value_datetime" + + ci_id = db.Column(db.Integer, db.ForeignKey('c_cis.id'), nullable=False) + attr_id = db.Column(db.Integer, db.ForeignKey('c_attributes.id'), nullable=False) + value = db.Column(db.DateTime, nullable=False) + + ci = db.relationship("CI", backref="c_value_datetime.ci_id") + attr = db.relationship("Attribute", backref="c_value_datetime.attr_id") + + +# history +class OperationRecord(Model): + __tablename__ = "c_records" + + uid = db.Column(db.Integer, index=True, nullable=False) + origin = db.Column(db.String(32)) + ticket_id = db.Column(db.String(32)) + reason = db.Column(db.Text) + + +class AttributeHistory(Model): + __tablename__ = "c_attribute_histories" + + ADD = "0" + DELETE = "1" + UPDATE = "2" + + operate_type = db.Column(db.Enum(ADD, DELETE, UPDATE, name="operate_type")) + record_id = db.Column(db.Integer, db.ForeignKey("c_records.id"), nullable=False) + ci_id = db.Column(db.Integer, index=True, nullable=False) + attr_id = db.Column(db.Integer, index=True) + old = db.Column(db.Text) + new = db.Column(db.Text) + + +class CIRelationHistory(Model): + __tablename__ = "c_relation_histories" + + ADD = "0" + DELETE = "1" + + operate_type = db.Column(db.Enum(ADD, DELETE, name="operate_type")) + record_id = db.Column(db.Integer, db.ForeignKey("c_records.id"), nullable=False) + first_ci_id = db.Column(db.Integer) + second_ci_id = db.Column(db.Integer) + relation_type_id = db.Column(db.Integer, db.ForeignKey("c_relation_types.id")) + relation_id = db.Column(db.Integer, nullable=False) + + +# preference +class PreferenceShowAttributes(Model): + __tablename__ = "c_preference_show_attributes" + + uid = db.Column(db.Integer, index=True, nullable=False) + type_id = db.Column(db.Integer, db.ForeignKey("c_ci_types.id"), nullable=False) + attr_id = db.Column(db.Integer, db.ForeignKey("c_attributes.id")) + order = db.Column(db.SmallInteger, default=0) + + ci_type = db.relationship("CIType", backref="c_preference_show_attributes.type_id") + attr = db.relationship("Attribute", backref="c_preference_show_attributes.attr_id") + + +class PreferenceTreeView(Model): + __tablename__ = "c_preference_tree_views" + + uid = db.Column(db.Integer, index=True, nullable=False) + type_id = db.Column(db.Integer, db.ForeignKey("c_ci_types.id"), nullable=False) + levels = db.Column(db.Text) # TODO: JSON + + +class PreferenceRelationView(Model): + __tablename__ = "c_preference_relation_views" + + name = db.Column(db.String(8), index=True, nullable=False) + parent_id = db.Column(db.Integer, db.ForeignKey("c_ci_types.id"), nullable=False) + child_id = db.Column(db.Integer, db.ForeignKey("c_ci_types.id"), nullable=False) diff --git a/api/resource.py b/api/resource.py new file mode 100644 index 0000000..a496e0b --- /dev/null +++ b/api/resource.py @@ -0,0 +1,45 @@ +# -*- coding:utf-8 -*- + +import os +import sys +from inspect import getmembers, isclass + +import six +from flask import jsonify +from flask_restful import Resource + +from api.lib.perm.auth import auth_required + + +class APIView(Resource): + method_decorators = [auth_required] + + def __init__(self): + super(APIView, self).__init__() + + @staticmethod + def jsonify(*args, **kwargs): + return jsonify(*args, **kwargs) + + +API_PACKAGE = "api" + + +def register_resources(resource_path, rest_api): + for root, _, files in os.walk(os.path.join(resource_path)): + for filename in files: + if not filename.startswith("_") and filename.endswith("py"): + module_path = os.path.join(API_PACKAGE, root[root.index("views"):]) + if module_path not in sys.path: + sys.path.insert(1, module_path) + view = __import__(os.path.splitext(filename)[0]) + resource_list = [o[0] for o in getmembers(view) if isclass(o[1]) and issubclass(o[1], Resource)] + resource_list = [i for i in resource_list if i != "APIView"] + for resource_cls_name in resource_list: + resource_cls = getattr(view, resource_cls_name) + if not hasattr(resource_cls, "url_prefix"): + resource_cls.url_prefix = ("",) + if isinstance(resource_cls.url_prefix, six.string_types): + resource_cls.url_prefix = (resource_cls.url_prefix,) + + rest_api.add_resource(resource_cls, *resource_cls.url_prefix) diff --git a/api/settings.py.example b/api/settings.py.example new file mode 100644 index 0000000..c9315fe --- /dev/null +++ b/api/settings.py.example @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +"""Application configuration. + +Most configuration is set via environment variables. + +For local development, use a .env file to set +environment variables. +""" +from environs import Env + +env = Env() +env.read_env() + +ENV = env.str("FLASK_ENV", default="production") +DEBUG = ENV == "development" +SECRET_KEY = env.str("SECRET_KEY") +BCRYPT_LOG_ROUNDS = env.int("BCRYPT_LOG_ROUNDS", default=13) +DEBUG_TB_ENABLED = DEBUG +DEBUG_TB_INTERCEPT_REDIRECTS = False + + +ERROR_CODES = [400, 401, 403, 404, 405, 500, 502] + +# # database +SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{user}:{password}@127.0.0.1:3306/{db}?charset=utf8' +SQLALCHEMY_BINDS = { + "user": 'mysql+pymysql://{user}:{password}@127.0.0.1:3306/{db}?charset=utf8' +} +SQLALCHEMY_ECHO = False +SQLALCHEMY_TRACK_MODIFICATIONS = False +SQLALCHEMY_ENGINE_OPTIONS = { + 'pool_recycle': 300, +} + +# # cache +CACHE_TYPE = "redis" +CACHE_REDIS_HOST = "127.0.0.1" +CACHE_REDIS_PORT = 6379 +CACHE_KEY_PREFIX = "CMDB::" +CACHE_DEFAULT_TIMEOUT = 3000 + +# # log +LOG_PATH = './logs/app.log' +LOG_LEVEL = 'DEBUG' + + +# # mail +MAIL_SERVER = '' +MAIL_PORT = 25 +MAIL_USE_TLS = False +MAIL_USE_SSL = False +MAIL_DEBUG = True +MAIL_USERNAME = '' +MAIL_PASSWORD = '' +DEFAULT_MAIL_SENDER = '' + +# # queue +CELERY_RESULT_BACKEND = "redis://127.0.0.1:6379/2" +BROKER_URL = 'redis://127.0.0.1:6379/2' +BROKER_VHOST = '/' + + +# # SSO +CAS_SERVER = "http://sso.xxx.com" +CAS_VALIDATE_SERVER = "http://sso.xxx.com" +CAS_LOGIN_ROUTE = "/cas/login" +CAS_LOGOUT_ROUTE = "/cas/logout" +CAS_VALIDATE_ROUTE = "/cas/serviceValidate" +CAS_AFTER_LOGIN = "/" +DEFAULT_SERVICE = "http://127.0.0.1:8000" + +# # pagination +DEFAULT_PAGE_COUNT = 50 + +# # permission +WHITE_LIST = ["127.0.0.1"] +USE_ACL = False diff --git a/api/tasks/__init__.py b/api/tasks/__init__.py new file mode 100644 index 0000000..3b26f17 --- /dev/null +++ b/api/tasks/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- diff --git a/tasks/cmdb.py b/api/tasks/cmdb.py similarity index 51% rename from tasks/cmdb.py rename to api/tasks/cmdb.py index 45a13e1..d48943a 100644 --- a/tasks/cmdb.py +++ b/api/tasks/cmdb.py @@ -6,24 +6,27 @@ import time from flask import current_app -from extensions import celery -from extensions import db -from extensions import rd -import lib.ci +import api.lib.cmdb.ci +from api.extensions import celery +from api.extensions import db +from api.extensions import rd +from api.lib.cmdb.const import CMDB_QUEUE -@celery.task(name="cmdb.ci_cache", queue="cmdb_async") +@celery.task(name="cmdb.ci_cache", queue=CMDB_QUEUE) def ci_cache(ci_id): time.sleep(0.1) db.session.close() - m = lib.ci.CIManager() - ci = m.get_ci_by_id(ci_id, need_children=False, use_master=True) + + m = api.lib.cmdb.ci.CIManager() + ci = m.get_ci_by_id_from_db(ci_id, need_children=False, use_master=False) rd.delete(ci_id) rd.add({ci_id: json.dumps(ci)}) + current_app.logger.info("%d caching.........." % ci_id) -@celery.task(name="cmdb.ci_delete", queue="cmdb_async") +@celery.task(name="cmdb.ci_delete", queue=CMDB_QUEUE) def ci_delete(ci_id): current_app.logger.info(ci_id) rd.delete(ci_id) diff --git a/api/tasks/test.py b/api/tasks/test.py new file mode 100644 index 0000000..a19d362 --- /dev/null +++ b/api/tasks/test.py @@ -0,0 +1,9 @@ +# -*- coding:utf-8 -*- + +from api.extensions import celery +from flask import current_app + + +@celery.task(queue="ticket_web") +def test_task(): + current_app.logger.info("test task.............................") diff --git a/api/views/__init__.py b/api/views/__init__.py new file mode 100644 index 0000000..3db020b --- /dev/null +++ b/api/views/__init__.py @@ -0,0 +1,31 @@ +# -*- coding:utf-8 -*- + +import os + +from flask import Blueprint +from flask_restful import Api + +from api.resource import register_resources +from .permission import GetResourcesView, HasPermissionView, GetUserInfoView +from .account import LoginView, LogoutView + +HERE = os.path.abspath(os.path.dirname(__file__)) + +# account +blueprint_account = Blueprint('account_api', __name__, url_prefix='/api') +account_rest = Api(blueprint_account) +account_rest.add_resource(LoginView, LoginView.url_prefix) +account_rest.add_resource(LogoutView, LogoutView.url_prefix) + +# permission +blueprint_perm_v01 = Blueprint('permission_api', __name__, url_prefix='/api/v1/perms') +perm_rest = Api(blueprint_perm_v01) +perm_rest.add_resource(GetResourcesView, GetResourcesView.url_prefix) +perm_rest.add_resource(HasPermissionView, HasPermissionView.url_prefix) +perm_rest.add_resource(GetUserInfoView, GetUserInfoView.url_prefix) + + +# cmdb +blueprint_cmdb_v01 = Blueprint('cmdb_api_v01', __name__, url_prefix='/api/v0.1') +rest = Api(blueprint_cmdb_v01) +register_resources(os.path.join(HERE, "cmdb"), rest) diff --git a/api/views/account.py b/api/views/account.py new file mode 100644 index 0000000..4b1d9dc --- /dev/null +++ b/api/views/account.py @@ -0,0 +1,47 @@ +# -*- coding:utf-8 -*- + +import datetime + +import jwt +from flask import request +from flask import current_app +from flask import abort +from flask_login import login_user, logout_user + +from api.resource import APIView +from api.lib.decorator import args_required +from api.lib.perm.auth import auth_abandoned +from api.models.account import User + + +class LoginView(APIView): + url_prefix = "/login" + + @args_required("username") + @args_required("password") + @auth_abandoned + def post(self): + username = request.values.get("username") or request.values.get("email") + password = request.values.get("password") + user, authenticated = User.query.authenticate(username, password) + if not authenticated: + return abort(401, "invalid username or password") + + login_user(user) + + token = jwt.encode({ + 'sub': user.email, + 'iat': datetime.datetime.now(), + 'exp': datetime.datetime.now() + datetime.timedelta(minutes=24 * 60 * 7)}, + current_app.config['SECRET_KEY']) + + return self.jsonify(token=token.decode()) + + +class LogoutView(APIView): + url_prefix = "/logout" + + @auth_abandoned + def post(self): + logout_user() + self.jsonify(code=200) diff --git a/api/views/cmdb/__init__.py b/api/views/cmdb/__init__.py new file mode 100644 index 0000000..3b26f17 --- /dev/null +++ b/api/views/cmdb/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- diff --git a/api/views/cmdb/attribute.py b/api/views/cmdb/attribute.py new file mode 100644 index 0000000..0ce947b --- /dev/null +++ b/api/views/cmdb/attribute.py @@ -0,0 +1,65 @@ +# -*- coding:utf-8 -*- + + +from flask import request +from flask import abort +from flask import current_app + +from api.resource import APIView +from api.lib.perm.acl import role_required +from api.lib.cmdb.const import RoleEnum +from api.lib.cmdb.attribute import AttributeManager +from api.lib.decorator import args_required +from api.lib.utils import handle_arg_list + + +class AttributeSearchView(APIView): + url_prefix = ("/attributes/s", "/attributes/search") + + def get(self): + q = request.values.get("q") + attrs = AttributeManager().get_attributes(name=q) + count = len(attrs) + return self.jsonify(numfound=count, attributes=attrs) + + +class AttributeView(APIView): + url_prefix = ("/attributes", "/attributes/", "/attributes/") + + def get(self, attr_name=None, attr_id=None): + attr_manager = AttributeManager() + attr_dict = None + if attr_name is not None: + attr_dict = attr_manager.get_attribute_by_name(attr_name) + if attr_dict is None: + attr_dict = attr_manager.get_attribute_by_alias(attr_name) + elif attr_id is not None: + attr_dict = attr_manager.get_attribute_by_id(attr_id) + if attr_dict is not None: + return self.jsonify(attribute=attr_dict) + abort(404, "Attribute is not found") + + @role_required(RoleEnum.CONFIG) + @args_required("name") + def post(self): + choice_value = handle_arg_list(request.values.get("choice_value")) + params = request.values + params["choice_value"] = choice_value + current_app.logger.debug(params) + + attr_id = AttributeManager.add(**params) + return self.jsonify(attr_id=attr_id) + + @role_required(RoleEnum.CONFIG) + def put(self, attr_id): + choice_value = handle_arg_list(request.values.get("choice_value")) + params = request.values + params["choice_value"] = choice_value + current_app.logger.debug(params) + AttributeManager().update(attr_id, **params) + return self.jsonify(attr_id=attr_id) + + @role_required(RoleEnum.CONFIG) + def delete(self, attr_id): + attr_name = AttributeManager.delete(attr_id) + return self. jsonify(message="attribute {0} deleted".format(attr_name)) diff --git a/api/views/cmdb/ci.py b/api/views/cmdb/ci.py new file mode 100644 index 0000000..0f6bd16 --- /dev/null +++ b/api/views/cmdb/ci.py @@ -0,0 +1,218 @@ +# -*- coding:utf-8 -*- + +import time + +import six +from flask import abort +from flask import current_app +from flask import request + +from api.lib.perm.acl import has_perm_from_args +from api.lib.cmdb.const import ResourceType, PermEnum +from api.lib.cmdb.cache import CITypeCache +from api.lib.cmdb.ci import CIManager +from api.lib.cmdb.const import ExistPolicy +from api.lib.cmdb.const import RetKey +from api.lib.cmdb.search import Search +from api.lib.cmdb.search import SearchError +from api.lib.perm.auth import auth_abandoned +from api.lib.utils import get_page +from api.lib.utils import get_page_size +from api.lib.utils import handle_arg_list +from api.models.cmdb import CI +from api.resource import APIView + + +class CIsByTypeView(APIView): + url_prefix = "/ci/type/" + + def get(self, type_id): + fields = handle_arg_list(request.values.get("fields", "")) + + ret_key = request.values.get("ret_key", RetKey.NAME) + if ret_key not in (RetKey.NAME, RetKey.ALIAS, RetKey.ID): + ret_key = RetKey.NAME + + page = get_page(request.values.get("page", 1)) + count = get_page_size(request.values.get("count")) + + manager = CIManager() + res = manager.get_cis_by_type(type_id, + ret_key=ret_key, + fields=fields, + page=page, + per_page=count) + + return self.jsonify(type_id=type_id, + numfound=res[0], + total=len(res[2]), + page=res[1], + cis=res[2]) + + +class CIView(APIView): + url_prefix = ("/ci/", "/ci") + + def get(self, ci_id): + fields = handle_arg_list(request.values.get("fields", "")) + + ret_key = request.values.get("ret_key", RetKey.NAME) + if ret_key not in (RetKey.NAME, RetKey.ALIAS, RetKey.ID): + ret_key = RetKey.NAME + + manager = CIManager() + ci = manager.get_ci_by_id_from_db(ci_id, ret_key=ret_key, fields=fields) + return self.jsonify(ci_id=ci_id, ci=ci) + + @staticmethod + def _wrap_ci_dict(): + ci_dict = dict() + for k, v in request.values.items(): + if k != "ci_type" and not k.startswith("_"): + ci_dict[k] = v.strip() if isinstance(v, six.string_types) else v + return ci_dict + + @has_perm_from_args("ci_type", ResourceType.CI, PermEnum.ADD) + def post(self): + ci_type = request.values.get("ci_type") + _no_attribute_policy = request.values.get("_no_attribute_policy", ExistPolicy.IGNORE) + + ci_dict = self._wrap_ci_dict() + + manager = CIManager() + current_app.logger.debug(ci_dict) + ci_id = manager.add(ci_type, + exist_policy=ExistPolicy.REJECT, + _no_attribute_policy=_no_attribute_policy, **ci_dict) + return self.jsonify(ci_id=ci_id) + + @has_perm_from_args("ci_id", ResourceType.CI, PermEnum.UPDATE, CIManager.get_type_name) + def put(self, ci_id=None): + args = request.values + ci_type = args.get("ci_type") + _no_attribute_policy = args.get("_no_attribute_policy", ExistPolicy.IGNORE) + + ci_dict = self._wrap_ci_dict() + manager = CIManager() + if ci_id is not None: + manager.update(ci_id, **ci_dict) + else: + ci_id = manager.add(ci_type, + exist_policy=ExistPolicy.REPLACE, + _no_attribute_policy=_no_attribute_policy, + **ci_dict) + return self.jsonify(ci_id=ci_id) + + @has_perm_from_args("ci_id", ResourceType.CI, PermEnum.DELETE, CIManager.get_type_name) + def delete(self, ci_id): + manager = CIManager() + manager.delete(ci_id) + return self.jsonify(message="ok") + + +class CIDetailView(APIView): + url_prefix = "/ci//detail" + + def get(self, ci_id): + _ci = CI.get_by_id(ci_id).to_dict() + return self.jsonify(**_ci) + + +class CISearchView(APIView): + url_prefix = ("/ci/s", "/ci/search") + + @auth_abandoned + def get(self): + """@params: q: query statement + fl: filter by column + count: the number of ci + ret_key: id, name, alias + facet: statistic + """ + + page = get_page(request.values.get("page", 1)) + count = get_page_size(request.values.get("count")) + + query = request.values.get('q', "") + fl = handle_arg_list(request.values.get('fl', "")) + ret_key = request.values.get('ret_key', RetKey.NAME) + if ret_key not in (RetKey.NAME, RetKey.ALIAS, RetKey.ID): + ret_key = RetKey.NAME + facet = handle_arg_list(request.values.get("facet", "")) + fl = list(filter(lambda x: x != "", fl)) + facet = list(filter(lambda x: x != "", facet)) + sort = request.values.get("sort") + + start = time.time() + s = Search(query, fl, facet, page, ret_key, count, sort) + try: + response, counter, total, page, numfound, facet = s.search() + except SearchError as e: + return abort(400, str(e)) + except Exception as e: + current_app.logger.error(str(e)) + return abort(500, "search unknown error") + current_app.logger.debug("search time is :{0}".format(time.time() - start)) + return self.jsonify(numfound=numfound, + total=total, + page=page, + facet=facet, + counter=counter, + result=response) + + +class CIUnique(APIView): + url_prefix = "/ci//unique" + + @has_perm_from_args("ci_id", ResourceType.CI, PermEnum.UPDATE, CIManager.get_type_name) + def put(self, ci_id): + params = request.values + unique_name = params.keys()[0] + unique_value = params.values()[0] + + CIManager.update_unique_value(ci_id, unique_name, unique_value) + + return self.jsonify(ci_id=ci_id) + + +class CIHeartbeatView(APIView): + url_prefix = ("/ci/heartbeat", "/ci/heartbeat//") + + def get(self): + page = get_page(request.values.get("page", 1)) + ci_type = request.values.get("ci_type", "").strip() + try: + type_id = CITypeCache.get(ci_type).type_id + except AttributeError: + return self.jsonify(numfound=0, result=[]) + agent_status = request.values.get("agent_status") + if agent_status: + agent_status = int(agent_status) + + numfound, result = CIManager.get_heartbeat(page, type_id, agent_status=agent_status) + + return self.jsonify(numfound=numfound, result=result) + + def post(self, ci_type, unique): + if not unique or not ci_type: + return self.jsonify(message="error") + + msg, cmd = CIManager().add_heartbeat(ci_type, unique) + + return self.jsonify(message=msg, cmd=cmd) + + +class CIFlushView(APIView): + url_prefix = ("/ci/flush", "/ci//flush") + + @auth_abandoned + def get(self, ci_id=None): + from api.tasks.cmdb import ci_cache + from api.lib.cmdb.const import CMDB_QUEUE + if ci_id is not None: + ci_cache.apply_async([ci_id], queue=CMDB_QUEUE) + else: + cis = CI.get_by(to_dict=False) + for ci in cis: + ci_cache.apply_async([ci.id], queue=CMDB_QUEUE) + return self.jsonify(code=200) diff --git a/api/views/cmdb/ci_relation.py b/api/views/cmdb/ci_relation.py new file mode 100644 index 0000000..86639e3 --- /dev/null +++ b/api/views/cmdb/ci_relation.py @@ -0,0 +1,66 @@ +# -*- coding:utf-8 -*- + + +from flask import request + +from api.lib.cmdb.ci import CIRelationManager +from api.lib.utils import get_page +from api.lib.utils import get_page_size +from api.resource import APIView + + +class GetSecondCIsView(APIView): + url_prefix = "/ci_relations//second_cis" + + def get(self, first_ci_id): + page = get_page(request.values.get("page", 1)) + count = get_page_size(request.values.get("count")) + relation_type = request.values.get("relation_type", "contain") + + manager = CIRelationManager() + numfound, total, second_cis = manager.get_second_cis( + first_ci_id, page=page, per_page=count, relation_type=relation_type) + + return self.jsonify(numfound=numfound, + total=total, + page=page, + second_cis=second_cis) + + +class GetFirstCIsView(APIView): + url_prefix = "/ci_relations//first_cis" + + def get(self, second_ci_id): + page = get_page(request.values.get("page", 1)) + count = get_page_size(request.values.get("count")) + + manager = CIRelationManager() + numfound, total, first_cis = manager.get_first_cis(second_ci_id, per_page=count, page=page) + + return self.jsonify(numfound=numfound, + total=total, + page=page, + first_cis=first_cis) + + +class CIRelationView(APIView): + url_prefix = "/ci_relations//" + + def post(self, first_ci_id, second_ci_id): + manager = CIRelationManager() + res = manager.add(first_ci_id, second_ci_id) + return self.jsonify(cr_id=res) + + def delete(self, first_ci_id, second_ci_id): + manager = CIRelationManager() + manager.delete_2(first_ci_id, second_ci_id) + return self.jsonify(message="CIType Relation is deleted") + + +class DeleteCIRelationView(APIView): + url_prefix = "/ci_relations/" + + def delete(self, cr_id): + manager = CIRelationManager() + manager.delete(cr_id) + return self.jsonify(message="CIType Relation is deleted") diff --git a/api/views/cmdb/ci_type.py b/api/views/cmdb/ci_type.py new file mode 100644 index 0000000..14b6153 --- /dev/null +++ b/api/views/cmdb/ci_type.py @@ -0,0 +1,202 @@ +# -*- coding:utf-8 -*- + + +from flask import abort +from flask import current_app +from flask import request + +from api.resource import APIView +from api.lib.perm.acl import role_required +from api.lib.cmdb.const import RoleEnum +from api.lib.cmdb.cache import AttributeCache +from api.lib.cmdb.cache import CITypeCache +from api.lib.cmdb.ci_type import CITypeAttributeManager +from api.lib.cmdb.ci_type import CITypeManager +from api.lib.cmdb.ci_type import CITypeGroupManager +from api.lib.cmdb.ci_type import CITypeAttributeGroupManager +from api.lib.decorator import args_required +from api.lib.utils import handle_arg_list + + +class CITypeView(APIView): + url_prefix = ("/ci_types", "/ci_types/", "/ci_types/") + + def get(self, type_id=None, type_name=None): + q = request.args.get("type_name") + + if type_id is not None: + ci_types = [CITypeCache.get(type_id).to_dict()] + elif type_name is not None: + ci_types = [CITypeCache.get(type_name).to_dict()] + else: + ci_types = CITypeManager().get_ci_types(q) + count = len(ci_types) + + return self.jsonify(numfound=count, ci_types=ci_types) + + @role_required(RoleEnum.CONFIG) + @args_required("name") + def post(self): + params = request.values + + type_name = params.get("name") + type_alias = params.get("alias") + type_alias = type_name if not type_alias else type_alias + params['alias'] = type_alias + + manager = CITypeManager() + type_id = manager.add(**params) + + return self.jsonify(type_id=type_id) + + @role_required(RoleEnum.CONFIG) + def put(self, type_id): + params = request.values + + manager = CITypeManager() + manager.update(type_id, **params) + return self.jsonify(type_id=type_id) + + @role_required(RoleEnum.CONFIG) + def delete(self, type_id): + CITypeManager.delete(type_id) + return self.jsonify(type_id=type_id) + + +class CITypeGroupView(APIView): + url_prefix = ("/ci_types/groups", "/ci_types/groups/") + + def get(self): + need_other = request.values.get("need_other") + return self.jsonify(CITypeGroupManager.get(need_other)) + + @role_required(RoleEnum.CONFIG) + @args_required("name") + def post(self): + name = request.values.get("name") + group = CITypeGroupManager.add(name) + return self.jsonify(group.to_dict()) + + @role_required(RoleEnum.CONFIG) + def put(self, gid): + name = request.values.get('name') + type_ids = request.values.get('type_ids') + CITypeGroupManager.update(gid, name, type_ids) + return self.jsonify(gid=gid) + + @role_required(RoleEnum.CONFIG) + def delete(self, gid): + CITypeGroupManager.delete(gid) + return self.jsonify(gid=gid) + + +class CITypeQueryView(APIView): + url_prefix = "/ci_types/query" + + @args_required("q") + def get(self): + q = request.args.get("q") + res = CITypeManager.query(q) + return self.jsonify(ci_type=res) + + +class EnableCITypeView(APIView): + url_prefix = "/ci_types//enable" + + @role_required(RoleEnum.CONFIG) + def post(self, type_id): + enable = request.values.get("enable", True) + CITypeManager.set_enabled(type_id, enabled=enable) + return self.jsonify(type_id=type_id, enable=enable) + + +class CITypeAttributeView(APIView): + url_prefix = ("/ci_types//attributes", "/ci_types//attributes") + + def get(self, type_id=None, type_name=None): + t = CITypeCache.get(type_id) or CITypeCache.get(type_name) or abort(404, "CIType does not exist") + type_id = t.id + unique_id = t.unique_id + unique = AttributeCache.get(unique_id).name + return self.jsonify(attributes=CITypeAttributeManager.get_attributes_by_type_id(type_id), + type_id=type_id, + unique_id=unique_id, + unique=unique) + + @role_required(RoleEnum.CONFIG) + @args_required("attr_id") + def post(self, type_id=None): + attr_id_list = handle_arg_list(request.values.get("attr_id")) + params = request.values + params.pop("attr_id", "") + + CITypeAttributeManager.add(type_id, attr_id_list, **params) + return self.jsonify(attributes=attr_id_list) + + @role_required(RoleEnum.CONFIG) + @args_required("attributes") + def put(self, type_id=None): + """ + attributes is list, only support raw data request + :param type_id: + :return: + """ + attributes = request.values.get("attributes") + current_app.logger.debug(attributes) + if not isinstance(attributes, list): + return abort(400, "attributes must be list") + CITypeAttributeManager.update(type_id, attributes) + return self.jsonify(attributes=attributes) + + @role_required(RoleEnum.CONFIG) + @args_required("attr_id") + def delete(self, type_id=None): + """ + Form request: attr_id is a string, separated by commas + Raw data request: attr_id is a list + :param type_id: + :return: + """ + attr_id_list = handle_arg_list(request.values.get("attr_id", "")) + + CITypeAttributeManager.delete(type_id, attr_id_list) + + return self.jsonify(attributes=attr_id_list) + + +class CITypeAttributeGroupView(APIView): + url_prefix = ("/ci_types//attribute_groups", + "/ci_types/attribute_groups/") + + def get(self, type_id): + need_other = request.values.get("need_other") + return self.jsonify(CITypeAttributeGroupManager.get_by_type_id(type_id, need_other)) + + @role_required(RoleEnum.CONFIG) + @args_required("name") + def post(self, type_id): + name = request.values.get("name").strip() + order = request.values.get("order") or 0 + attrs = handle_arg_list(request.values.get("attributes", "")) + orders = list(range(len(attrs))) + + attr_order = list(zip(attrs, orders)) + group = CITypeAttributeGroupManager.create_or_update(type_id, name, attr_order, order) + current_app.logger.warning(group.id) + return self.jsonify(group_id=group.id) + + @role_required(RoleEnum.CONFIG) + def put(self, group_id): + name = request.values.get("name") + order = request.values.get("order") or 0 + attrs = handle_arg_list(request.values.get("attributes", "")) + orders = list(range(len(attrs))) + + attr_order = list(zip(attrs, orders)) + CITypeAttributeGroupManager.update(group_id, name, attr_order, order) + return self.jsonify(group_id=group_id) + + @role_required(RoleEnum.CONFIG) + def delete(self, group_id): + CITypeAttributeGroupManager.delete(group_id) + return self.jsonify(group_id=group_id) diff --git a/api/views/cmdb/ci_type_relation.py b/api/views/cmdb/ci_type_relation.py new file mode 100644 index 0000000..613d1ba --- /dev/null +++ b/api/views/cmdb/ci_type_relation.py @@ -0,0 +1,49 @@ +# -*- coding:utf-8 -*- + + +from flask import request + +from api.lib.perm.acl import role_required +from api.lib.cmdb.const import RoleEnum +from api.lib.cmdb.ci_type import CITypeRelationManager +from api.lib.decorator import args_required +from api.resource import APIView + + +class GetChildrenView(APIView): + url_prefix = "/ci_type_relations//children" + + def get(self, parent_id): + return self.jsonify(children=CITypeRelationManager.get_children(parent_id)) + + +class GetParentsView(APIView): + url_prefix = "/ci_type_relations//parents" + + def get(self, child_id): + return self.jsonify(parents=CITypeRelationManager.get_parents(child_id)) + + +class CITypeRelationView(APIView): + url_prefix = "/ci_type_relations//" + + @role_required(RoleEnum.CONFIG) + @args_required("relation_type_id") + def post(self, parent_id, child_id): + relation_type_id = request.values.get("relation_type_id") + ctr_id = CITypeRelationManager.add(parent_id, child_id, relation_type_id) + return self.jsonify(ctr_id=ctr_id) + + @role_required(RoleEnum.CONFIG) + def delete(self, parent_id, child_id): + CITypeRelationManager.delete_2(parent_id, child_id) + return self.jsonify(code=200, parent_id=parent_id, child_id=child_id) + + +class CITypeRelationDelete2View(APIView): + url_prefix = "/ci_type_relations/" + + @role_required(RoleEnum.CONFIG) + def delete(self, ctr_id): + CITypeRelationManager.delete(ctr_id) + return self.jsonify(code=200, ctr_id=ctr_id) diff --git a/api/views/cmdb/history.py b/api/views/cmdb/history.py new file mode 100644 index 0000000..e0029a5 --- /dev/null +++ b/api/views/cmdb/history.py @@ -0,0 +1,63 @@ +# -*- coding:utf-8 -*- + + +import datetime + +from flask import abort +from flask import request + +from api.lib.cmdb.history import AttributeHistoryManger +from api.lib.utils import get_page +from api.lib.utils import get_page_size +from api.resource import APIView + + +class RecordView(APIView): + url_prefix = "/history/records" + + def get(self): + page = get_page(request.values.get("page", 1)) + page_size = get_page_size(request.values.get("page_size")) + _start = request.values.get("start") + _end = request.values.get("end") + username = request.values.get("username", "") + start, end = None, None + if _start: + try: + start = datetime.datetime.strptime(_start, '%Y-%m-%d %H:%M:%S') + except ValueError: + abort(400, 'incorrect start date time') + if _end: + try: + end = datetime.datetime.strptime(_end, '%Y-%m-%d %H:%M:%S') + except ValueError: + abort(400, 'incorrect end date time') + + numfound, total, res = AttributeHistoryManger.get_records(start, end, username, page, page_size) + + return self.jsonify(numfound=numfound, + records=res, + page=page, + total=total, + start=_start, + end=_end, + username=username) + + +class CIHistoryView(APIView): + url_prefix = "/history/ci/" + + def get(self, ci_id): + result = AttributeHistoryManger.get_by_ci_id(ci_id) + return self.jsonify(result) + + +class RecordDetailView(APIView): + url_prefix = "/history/records/" + + def get(self, record_id): + username, timestamp, attr_dict, rel_dict = AttributeHistoryManger.get_record_detail(record_id) + return self.jsonify(username=username, + timestamp=timestamp, + attr_history=attr_dict, + rel_history=rel_dict) diff --git a/api/views/cmdb/preference.py b/api/views/cmdb/preference.py new file mode 100644 index 0000000..d09437f --- /dev/null +++ b/api/views/cmdb/preference.py @@ -0,0 +1,89 @@ +# -*- coding:utf-8 -*- + + +from flask import request + +from api.resource import APIView +from api.lib.perm.acl import has_perm_from_args +from api.lib.cmdb.const import ResourceType, PermEnum +from api.lib.cmdb.preference import PreferenceManager +from api.lib.cmdb.ci import CIManager +from api.lib.cmdb.ci_type import CITypeManager +from api.lib.decorator import args_required +from api.lib.utils import handle_arg_list + + +class PreferenceShowCITypesView(APIView): + url_prefix = "/preference/ci_types" + + def get(self): + instance = request.values.get("instance") + tree = request.values.get("tree") + return self.jsonify(PreferenceManager.get_types(instance, tree)) + + +class PreferenceShowAttributesView(APIView): + url_prefix = "/preference/ci_types//attributes" + + def get(self, id_or_name): + is_subscribed, attributes = PreferenceManager.get_show_attributes(id_or_name) + return self.jsonify(attributes=attributes, is_subscribed=is_subscribed) + + @has_perm_from_args("id_or_name", ResourceType.CI, PermEnum.READ, CITypeManager.get_name_by_id) + @args_required("attr") + def post(self, id_or_name): + id_or_name = int(id_or_name) + attr_list = handle_arg_list(request.values.get("attr", "")) + orders = list(range(len(attr_list))) + PreferenceManager.create_or_update_show_attributes(id_or_name, list(zip(attr_list, orders))) + return self.jsonify(type_id=id_or_name, + attr_order=list(zip(attr_list, orders))) + + @has_perm_from_args("id_or_name", ResourceType.CI, PermEnum.READ, CITypeManager.get_name_by_id) + def put(self, id_or_name): + self.post(id_or_name) + + +class PreferenceTreeApiView(APIView): + url_prefix = "/preference/tree/view" + + def get(self): + return self.jsonify(PreferenceManager.get_tree_view()) + + @has_perm_from_args("type_id", ResourceType.CI, PermEnum.READ, CITypeManager.get_name_by_id) + @args_required("type_id") + @args_required("levels") + def post(self): + type_id = request.values.get("type_id") + levels = handle_arg_list(request.values.get("levels")) + res = PreferenceManager.create_or_update_tree_view(type_id, levels) + return self.jsonify(res and res.to_dict() or {}) + + def put(self): + self.post() + + +class PreferenceRelationApiView(APIView): + url_prefix = "/preference/relation/view" + + def get(self): + return self.jsonify(PreferenceManager.get_relation_view()) + + @has_perm_from_args("parent_id", ResourceType.CI, PermEnum.READ, CITypeManager.get_name_by_id) + @has_perm_from_args("child_id", ResourceType.CI, PermEnum.READ, CITypeManager.get_name_by_id) + @args_required("name") + def post(self): + name = request.values.get("name") + parent_id = request.values.get("parent_id") + child_id = request.values.get("child_id") + res = PreferenceManager.create_or_update_relation_view(name, parent_id, child_id) + return self.jsonify(res.to_dict()) + + def put(self): + self.post() + + @args_required("name") + def delete(self): + name = request.values.get("name") + PreferenceManager.delete_relation_view(name) + return self.jsonify(name=name) diff --git a/api/views/cmdb/relation_type.py b/api/views/cmdb/relation_type.py new file mode 100644 index 0000000..df96302 --- /dev/null +++ b/api/views/cmdb/relation_type.py @@ -0,0 +1,37 @@ +# -*- coding:utf-8 -*- + + +from flask import request +from flask import abort + +from api.resource import APIView +from api.lib.perm.acl import role_required +from api.lib.cmdb.const import RoleEnum +from api.lib.decorator import args_required +from api.lib.cmdb.relation_type import RelationTypeManager + + +class RelationTypeView(APIView): + url_prefix = ("/relation_types", "/relation_types/") + + def get(self): + return self.jsonify([i.to_dict() for i in RelationTypeManager.get_all()]) + + @role_required(RoleEnum.CONFIG) + @args_required("name") + def post(self): + name = request.values.get("name") or abort(400, "Name cannot be empty") + rel = RelationTypeManager.add(name) + return self.jsonify(rel.to_dict()) + + @role_required(RoleEnum.CONFIG) + @args_required("name") + def put(self, rel_id): + name = request.values.get("name") or abort(400, "Name cannot be empty") + rel = RelationTypeManager.update(rel_id, name) + return self.jsonify(rel.to_dict()) + + @role_required(RoleEnum.CONFIG) + def delete(self, rel_id): + RelationTypeManager.delete(rel_id) + return self.jsonify(rel_id=rel_id) diff --git a/api/views/permission.py b/api/views/permission.py new file mode 100644 index 0000000..70cb5b2 --- /dev/null +++ b/api/views/permission.py @@ -0,0 +1,49 @@ +# -*- coding:utf-8 -*- + +from flask import request +from flask import session +from flask_login import current_user + +from api.lib.decorator import args_required +from api.lib.perm.acl import ACLManager +from api.lib.perm.acl import validate_permission +from api.resource import APIView + + +class HasPermissionView(APIView): + url_prefix = "/validate" + + @args_required("resource") + @args_required("resource_type") + @args_required("perm") + def get(self): + resource = request.values.get("resource") + resource_type = request.values.get("resource_type") + perm = request.values.get("perm") + validate_permission(resource, resource_type, perm) + return self.jsonify(is_valid=True) + + def post(self): + self.get() + + +class GetResourcesView(APIView): + url_prefix = "/resources" + + @args_required("resource_type") + def get(self): + resource_type = request.values.get("resource_type") + res = ACLManager().get_resources(resource_type) + return self.jsonify(res) + + +class GetUserInfoView(APIView): + url_prefix = "/user/info" + + def get(self): + name = session.get("acl", {}).get("nickName") or session.get("CAS_USERNAME") or current_user.nickname + role = dict(permissions=session.get("acl", {}).get("parentRoles", []) or ["admin"]) + avatar = session.get("acl", {}).get("avatar") or current_user.avatar + return self.jsonify(result=dict(name=name, + role=role, + avatar=avatar)) diff --git a/autoapp.py b/autoapp.py new file mode 100644 index 0000000..9ff83cc --- /dev/null +++ b/autoapp.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +"""Create an application instance.""" +from flask import g +from flask_login import current_user + +from api.app import create_app + +app = create_app() + + +@app.before_request +def before_request(): + g.user = current_user diff --git a/celery_worker.py b/celery_worker.py new file mode 100644 index 0000000..5692141 --- /dev/null +++ b/celery_worker.py @@ -0,0 +1,9 @@ +# -*- coding:utf-8 -*- + +from api.app import create_app +from api.extensions import celery + +# celery worker -A celery_worker.celery -l DEBUG -E -Q xxxx + +app = create_app() +app.app_context().push() diff --git a/cmdb_api.md b/cmdb_api.md index c4e237f..540e2c3 100644 --- a/cmdb_api.md +++ b/cmdb_api.md @@ -1,13 +1,12 @@ # CMDB API文档 ## 状态返回码的定义 -* 200: 成功 +* 200:成功 * 400:失败 -* 401:未授权 -* 404:url not found -* 408:超时 -* 410:资源删除 -* 500: 服务器错误 +* 401:未认证 +* 403:no permission +* 404:not found +* 500:服务器未知错误 ## 用户接口 diff --git a/command/__init__.py b/command/__init__.py deleted file mode 100644 index 44d37d3..0000000 --- a/command/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/config-sample.cfg b/config-sample.cfg deleted file mode 100644 index 83f4077..0000000 --- a/config-sample.cfg +++ /dev/null @@ -1,61 +0,0 @@ -# coding: utf-8 -# common - -DEBUG = True -SECRET_KEY = 'dsfdjsf@3213!@JKJWL' -HOST = 'http://127.0.0.1:5000' - -# # database -SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://mysqluser:password@127.0.0.1:3306/cmdb?charset=utf8' - -SQLALCHEMY_ECHO = False -SQLALCHEMY_POOL_SIZE = 10 -SQLALCHEMY_POOL_RECYCLE = 300 - -# # cache -CACHE_TYPE = "redis" -CACHE_REDIS_HOST = "127.0.0.1" -CACHE_REDIS_PORT = 6379 -CACHE_KEY_PREFIX = "CMDB-API" -CACHE_DEFAULT_TIMEOUT = 3000 - - -# # CI cache -REDIS_DB = 0 -REDIS_MAX_CONN = 30 - - -# # queue -CELERY_RESULT_BACKEND = "redis://127.0.0.1//" -BROKER_URL = 'redis://127.0.0.1//' -BROKER_VHOST = '/' - - -# # i18n -ACCEPT_LANGUAGES = ['en', 'zh'] -BABEL_DEFAULT_LOCALE = 'zh' -BABEL_DEFAULT_TIMEZONE = 'Asia/Shanghai' - -# # log -LOG_PATH = './logs/app.log' - -LOG_LEVEL = 'DEBUG' -ADMINS = ('@') - -# # mail -MAIL_SERVER = '' -MAIL_PORT = 25 -MAIL_USE_TLS = False -MAIL_USE_SSL = False -MAIL_DEBUG = True -MAIL_USERNAME = '' -MAIL_PASSWORD = '' -DEFAULT_MAIL_SENDER = '' - - -# # pagination -PER_PAGE_COUNT_RANGE = (10, 25, 50, 100) -DEFAULT_PAGE_COUNT = 25 - - -WHITE_LIST = ["127.0.0.1"] diff --git a/core/__init__.py b/core/__init__.py deleted file mode 100644 index 218d127..0000000 --- a/core/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding:utf-8 -*- - - -from attribute import attribute -from ci_type import citype -from ci_type_relation import cityperelation -from ci_relation import cirelation -from ci import ci -from history import history -from account import account -from special import special diff --git a/core/account.py b/core/account.py deleted file mode 100644 index 1a1ae82..0000000 --- a/core/account.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import Blueprint -from flask import request - -from flask import g -from flask import abort -from flask import jsonify - -from models import row2dict -from lib.account import AccountManager -from lib.auth import auth_with_key - - -account = Blueprint('account', __name__) - - -@account.route("/", methods=["GET"]) -@auth_with_key -def get_user(uid=None): - manager = AccountManager() - user = manager.get_user_by_uid(uid) - if user: - return jsonify(rolenames=user.rolenames, user=row2dict(user)) - else: - return jsonify(user=None) - - -@account.route("", methods=["POST"]) -@auth_with_key -def create_user(): - manager = AccountManager() - params = {} - for k, v in request.values.iteritems(): - params[k] = v - user = manager.create_user(**params) - return jsonify(user=row2dict(user)) - - -@account.route("/", methods=["PUT"]) -@auth_with_key -def update_user(uid=None): - manager = AccountManager() - params = {} - for k, v in request.values.iteritems(): - params[k] = v - ret, res = manager.update_user(uid, **params) - if not ret: - abort(res[0], res[1]) - return jsonify(user=row2dict(res), rolenames=res.rolenames) - - -@account.route("/", methods=["DELETE"]) -@auth_with_key -def delete_user(uid=None): - manager = AccountManager() - ret, res = manager.delete_user(uid) - if not ret: - abort(res[0], res[1]) - return jsonify(uid=uid) - - -@account.route("/validate", methods=["POST"]) -@auth_with_key -def validate(): - username = request.values.get("username") - password = request.values.get("password") - manager = AccountManager() - user, authenticated = manager.validate(username, password) - if user and not authenticated: - return jsonify(code=401, user=row2dict(user), rolenames=user.rolenames) - elif not user: - return jsonify(code=404, message="user is not existed") - return jsonify(code=200, user=row2dict(user), rolenames=user.rolenames) - - -@account.route("/key", methods=["PUT"]) -@auth_with_key -def update_key(): - manager = AccountManager() - ret, res = manager.reset_key(g.user.uid) - if not ret: - abort(res[0], res[1]) - return jsonify(user=row2dict(res), rolenames=res.rolenames) - - -@account.route("/password", methods=["PUT"]) -@auth_with_key -def update_password(): - manager = AccountManager() - old = request.values.get("password") - new = request.values.get("new_password") - confirm = request.values.get("confirm") - ret, res = manager.update_password(g.user.uid, old, new, confirm) - if not ret: - abort(res[0], res[1]) - return jsonify(user=row2dict(res), rolenames=res.rolenames) diff --git a/core/attribute.py b/core/attribute.py deleted file mode 100644 index 1d79a7b..0000000 --- a/core/attribute.py +++ /dev/null @@ -1,152 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import jsonify -from flask import request -from flask import Blueprint -from flask import abort -from flask import current_app - -from lib.attribute import AttributeManager -from lib.ci_type import CITypeAttributeManager -from lib.decorator import argument_required -from lib.exception import InvalidUsageError -from lib.auth import auth_with_key - -attribute = Blueprint("attribute", __name__) - - -@attribute.route("", methods=["GET"]) -def get_attributes(): - q = request.values.get("q") - attrs = AttributeManager().get_attributes(name=q) - count = len(attrs) - return jsonify(numfound=count, attributes=attrs) - - -@attribute.route("/", methods=["GET"]) -@attribute.route("/", methods=["GET"]) -def get_attribute(attr_name=None, attr_id=None): - attr_manager = AttributeManager() - attr_dict = None - if attr_name is not None: - attr_dict = attr_manager.get_attribute_by_name(attr_name) - if attr_dict is None: - attr_dict = attr_manager.get_attribute_by_alias(attr_name) - elif attr_id is not None: - attr_dict = attr_manager.get_attribute_by_id(attr_id) - if attr_dict is not None: - return jsonify(attribute=attr_dict) - abort(404, "attribute not found") - - -@attribute.route("", methods=["POST"]) -@auth_with_key -def create_attribute(): - with argument_required("attr_name"): - attr_name = request.values.get("attr_name") - current_app.logger.info(attr_name) - attr_alias = request.values.get("attr_alias", attr_name) - choice_value = request.values.get("choice_value") - is_multivalue = request.values.get("is_multivalue", False) - is_uniq = request.values.get("is_uniq", False) - is_index = request.values.get("is_index", False) - value_type = request.values.get("value_type", "text") - try: - is_multivalue = int(is_multivalue) - is_uniq = int(is_uniq) - is_index = int(is_index) - except ValueError: - raise InvalidUsageError("argument format is error") - attr_manager = AttributeManager() - kwargs = {"choice_value": choice_value, "is_multivalue": is_multivalue, - "is_uniq": is_uniq, "value_type": value_type, - "is_index": is_index} - ret, res = attr_manager.add(attr_name, attr_alias, **kwargs) - if not ret: - return abort(500, res) - return jsonify(attr_id=res) - - -@attribute.route("/", methods=["PUT"]) -@auth_with_key -def update_attribute(attr_id=None): - with argument_required("attr_name"): - attr_name = request.values.get("attr_name") - attr_alias = request.values.get("attr_alias", attr_name) - choice_value = request.values.get("choice_value") - is_multivalue = request.values.get("is_multivalue", False) - is_uniq = request.values.get("is_uniq", False) - value_type = request.values.get("value_type", "text") - try: - is_multivalue = int(is_multivalue) - is_uniq = int(is_uniq) - except ValueError: - raise InvalidUsageError("argument format is error") - attr_manager = AttributeManager() - kwargs = {"choice_value": choice_value, "is_multivalue": is_multivalue, - "is_uniq": is_uniq, "value_type": value_type} - ret, res = attr_manager.update(attr_id, attr_name, - attr_alias, **kwargs) - if not ret: - return abort(500, res) - return jsonify(attr_id=res) - - -@attribute.route("/", methods=["DELETE"]) -@auth_with_key -def delete_attribute(attr_id=None): - attr_manager = AttributeManager() - res = attr_manager.delete(attr_id) - return jsonify(message="attribute {0} deleted".format(res)) - - -@attribute.route("/citype/", methods=["GET"]) -@attribute.route("/citype/", methods=["GET"]) -def get_attributes_by_type(type_id=None, type_name=None): - manager = CITypeAttributeManager() - from models.attribute import CIAttributeCache - from models.ci_type import CITypeCache - from models.ci_type import CITypeAttributeCache - - t = CITypeCache.get(type_id) - if not t: - t = CITypeCache.get(type_name) - if not t: - return abort(400, "CIType {0} is not existed".format(type_id)) - type_id = t.type_id - uniq_id = t.uniq_id - CITypeAttributeCache.clean(type_id) - unique = CIAttributeCache.get(uniq_id).attr_name - return jsonify(attributes=manager.get_attributes_by_type_id(type_id), - type_id=type_id, uniq_id=uniq_id, unique=unique) - - -@attribute.route("/citype/", methods=["POST"]) -@auth_with_key -def create_attributes_to_citype(type_id=None): - with argument_required("attr_id"): - attr_ids = request.values.get("attr_id", "") - is_required = request.values.get("is_required", False) - attr_id_list = attr_ids.strip().split(",") - if "" in attr_id_list: - attr_id_list.remove("") - attr_id_list = map(int, attr_id_list) - try: - is_required = int(is_required) - except ValueError: - abort(500, "argument format is error") - manager = CITypeAttributeManager() - manager.add(type_id, attr_id_list, is_required=is_required) - return jsonify(attributes=attr_id_list) - - -@attribute.route("/citype/", methods=["DELETE"]) -@auth_with_key -def delete_attribute_in_type(type_id=None): - with argument_required("attr_id"): - attr_ids = request.values.get("attr_id", "") - attr_id_list = attr_ids.strip().split(",") - manager = CITypeAttributeManager() - manager.delete(type_id, attr_id_list) - return jsonify(attributes=attr_id_list) \ No newline at end of file diff --git a/core/ci.py b/core/ci.py deleted file mode 100644 index 3f13eae..0000000 --- a/core/ci.py +++ /dev/null @@ -1,216 +0,0 @@ -# -*- coding:utf-8 -*- - -import sys -reload(sys) -sys.setdefaultencoding("utf-8") -import time -import urllib - -from flask import Blueprint -from flask import request -from flask import jsonify -from flask import current_app -from flask import make_response -from flask import render_template -from flask import abort - -from lib.auth import auth_with_key -from lib.ci import CIManager -from lib.ci import HostNumStatis -from lib.search import Search -from lib.search import SearchError -from lib.utils import get_page -from lib.utils import get_per_page -from models.ci_type import CITypeCache - -ci = Blueprint("ci", __name__) - - -@ci.route("/type/", methods=["GET"]) -def get_cis_by_type(type_id=None): - fields = request.args.get("fields", "").strip().split(",") - fields = filter(lambda x: x != "", fields) - - ret_key = request.args.get("ret_key", "name") - if ret_key not in ('name', 'alias', 'id'): - ret_key = 'name' - - page = get_page(request.values.get("page", 1)) - count = get_per_page(request.values.get("count")) - manager = CIManager() - res = manager.get_cis_by_type(type_id, ret_key=ret_key, - fields=fields, page=page, per_page=count) - return jsonify(type_id=type_id, numfound=res[0], - total=len(res[2]), page=res[1], cis=res[2]) - - -@ci.route("/", methods=['GET']) -def get_ci(ci_id=None): - fields = request.args.get("fields", "").strip().split(",") - fields = filter(lambda x: x != "", fields) - - ret_key = request.args.get("ret_key", "name") - if ret_key not in ('name', 'alias', 'id'): - ret_key = 'name' - - manager = CIManager() - ci = manager.get_ci_by_id(ci_id, ret_key=ret_key, fields=fields) - return jsonify(ci_id=ci_id, ci=ci) - - -@ci.route("/s", methods=["GET"]) -@ci.route("/search", methods=["GET"]) -def search(): - """@params: q: query statement - fl: filter by column - count: the number of ci - ret_key: id, name, alias - facet: statistic - wt: result format - """ - page = get_page(request.values.get("page", 1)) - count = get_per_page(request.values.get("count")) - - query = request.values.get('q', "") - fl = request.values.get('fl', "").split(",") - ret_key = request.values.get('ret_key', "name") - if ret_key not in ('name', 'alias', 'id'): - ret_key = 'name' - facet = request.values.get("facet", "").split(",") - wt = request.values.get('wt', 'json') - fl = filter(lambda x: x != "", fl) - facet = filter(lambda x: x != "", facet) - sort = request.values.get("sort") - - start = time.time() - s = Search(query, fl, facet, page, ret_key, count, sort) - try: - response, counter, total, page, numfound, facet = s.search() - except SearchError, e: - return abort(400, str(e)) - except Exception, e: - current_app.logger.error(str(e)) - return abort(500, "search unknown error") - - if wt == 'xml': - res = make_response( - render_template("search.xml", - counter=counter, - total=total, - result=response, - page=page, - numfound=numfound, - facet=facet)) - res.headers['Content-type'] = 'text/xml' - return res - current_app.logger.debug("search time is :{0}".format( - time.time() - start)) - return jsonify(numfound=numfound, - total=total, - page=page, - facet=facet, - counter=counter, - result=response) - - -@ci.route("", methods=["POST"]) -@auth_with_key -def create_ci(): - ci_type = request.values.get("ci_type") - _no_attribute_policy = request.values.get("_no_attribute_policy", "ignore") - - ci_dict = dict() - for k, v in request.values.iteritems(): - if k != "ci_type" and not k.startswith("_"): - ci_dict[k] = v.strip() - - manager = CIManager() - current_app.logger.debug(ci_dict) - ci_id = manager.add(ci_type, exist_policy="reject", - _no_attribute_policy=_no_attribute_policy, **ci_dict) - return jsonify(ci_id=ci_id) - - -@ci.route("", methods=["PUT"]) -@auth_with_key -def update_ci(): - if request.data: - args = dict() - _args = request.data.split("&") - for arg in _args: - if arg: - args[arg.split("=")[0]] = \ - urllib.unquote(urllib.unquote(arg.split("=")[1])) - else: - args = request.values - - ci_type = args.get("ci_type") - _no_attribute_policy = args.get("_no_attribute_policy", "ignore") - ci_dict = dict() - for k, v in args.items(): - if k != "ci_type" and not k.startswith("_"): - ci_dict[k] = v.strip() - - manager = CIManager() - ci_id = manager.add(ci_type, exist_policy="replace", - _no_attribute_policy=_no_attribute_policy, **ci_dict) - return jsonify(ci_id=ci_id) - - -@ci.route("//unique", methods=["PUT"]) -@auth_with_key -def update_ci_unique(ci_id): - m = CIManager() - m.update_unique_value(ci_id, request.values) - return jsonify(ci_id=ci_id) - - -@ci.route("/", methods=["DELETE"]) -@auth_with_key -def delete_ci(ci_id=None): - manager = CIManager() - manager.delete(ci_id) - return jsonify(message="ok") - - -@ci.route("/heartbeat//", methods=["POST"]) -def add_heartbeat(ci_type, unique): - if not unique or not ci_type: - return jsonify(message="error") - # return jsonify(message="ok") - return jsonify(message=CIManager().add_heartbeat(ci_type, unique)) - - -@ci.route("/heartbeat", methods=["GET"]) -def get_heartbeat(): - page = get_page(request.values.get("page", 1)) - ci_type = request.values.get("ci_type", "").strip() - try: - ci_type = CITypeCache.get(ci_type).type_id - except: - return jsonify(numfound=0, result=[]) - agent_status = request.values.get("agent_status", None) - if agent_status: - agent_status = int(agent_status) - numfound, result = CIManager().get_heartbeat(page, - ci_type, - agent_status=agent_status) - return jsonify(numfound=numfound, result=result) - - -######################### just for frontend ################################### - -@ci.route("/hosts/nums", methods=["GET"]) -def get_hosts_nums(): - ci_type = request.args.get("ci_type", "").strip() - ci_ids = request.args.get("ci_ids", "").strip() - ci_id_list = ci_ids.split(",") - ci_id_list = map(str, filter(lambda x: x != "", ci_id_list)) - res = {} - if ci_type == "bu": - res = HostNumStatis().get_hosts_by_bu(ci_id_list) - elif ci_type == "product": - res = HostNumStatis().get_hosts_by_product(ci_id_list) - elif ci_type == "project": - res = HostNumStatis().get_hosts_by_project(ci_id_list) - return jsonify(hosts=res) \ No newline at end of file diff --git a/core/ci_relation.py b/core/ci_relation.py deleted file mode 100644 index 63233df..0000000 --- a/core/ci_relation.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import Blueprint -from flask import jsonify -from flask import request - -from lib.ci import CIRelationManager -from lib.utils import get_page -from lib.utils import get_per_page -from lib.auth import auth_with_key - - -cirelation = Blueprint("cirelation", __name__) - - -@cirelation.route("/types", methods=["GET"]) -def get_types(): - manager = CIRelationManager() - return jsonify(relation_types=manager.relation_types) - - -@cirelation.route("//second_cis", methods=["GET"]) -def get_second_cis_by_first_ci(first_ci=None): - page = get_page(request.values.get("page", 1)) - count = get_per_page(request.values.get("count")) - relation_type = request.values.get("relation_type", "contain") - manager = CIRelationManager() - numfound, total, second_cis = manager.get_second_cis( - first_ci, page=page, per_page=count, relation_type=relation_type) - return jsonify(numfound=numfound, total=total, - page=page, second_cis=second_cis) - - -@cirelation.route("//first_cis", methods=["GET"]) -def get_first_cis_by_second_ci(second_ci=None): - page = get_page(request.values.get("page", 1)) - count = get_per_page(request.values.get("count")) - relation_type = request.values.get("relation_type", "contain") - - manager = CIRelationManager() - numfound, total, first_cis = manager.get_first_cis( - second_ci, per_page=count, page=page, relation_type=relation_type) - return jsonify(numfound=numfound, total=total, - page=page, first_cis=first_cis) - - -@cirelation.route("//", methods=["POST"]) -@auth_with_key -def create_ci_relation(first_ci=None, second_ci=None): - relation_type = request.values.get("relation_type", "contain") - manager = CIRelationManager() - res = manager.add(first_ci, second_ci, relation_type=relation_type) - return jsonify(cr_id=res) - - -@cirelation.route("/", methods=["DELETE"]) -@auth_with_key -def delete_ci_relation(cr_id=None): - manager = CIRelationManager() - manager.delete(cr_id) - return jsonify(message="CIType Relation is deleted") - - -@cirelation.route("//", methods=["DELETE"]) -@auth_with_key -def delete_ci_relation_2(first_ci, second_ci): - manager = CIRelationManager() - manager.delete_2(first_ci, second_ci) - return jsonify(message="CIType Relation is deleted") \ No newline at end of file diff --git a/core/ci_type.py b/core/ci_type.py deleted file mode 100644 index 18aa23c..0000000 --- a/core/ci_type.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import Blueprint -from flask import jsonify -from flask import request -from flask import abort - -from lib.ci_type import CITypeManager -from lib.decorator import argument_required -from lib.auth import auth_with_key - - -citype = Blueprint("citype", __name__) - - -@citype.route("", methods=["GET"]) -def get_citypes(): - type_name = request.args.get("type_name") - manager = CITypeManager() - citypes = manager.get_citypes(type_name) - count = len(citypes) - return jsonify(numfound=count, citypes=citypes) - - -@citype.route("/query", methods=["GET"]) -def query(): - with argument_required("type"): - _type = request.args.get("type") - manager = CITypeManager() - res = manager.query(_type) - return jsonify(citype=res) - - -@citype.route("", methods=["POST"]) -@auth_with_key -def create_citype(): - with argument_required("type_name"): - type_name = request.values.get("type_name") - type_alias = request.values.get("type_alias") - if type_alias is None: - type_alias = type_name - _id = request.values.get("_id") - unique = request.values.get("unique") - enabled = request.values.get("enabled", True) - icon_url = request.values.get("icon_url", "") - manager = CITypeManager() - ret, res = manager.add(type_name, type_alias, _id=_id, - unique=unique, enabled=enabled, - icon_url=icon_url) - if ret: - return jsonify(type_id=res) - abort(500, res) - - -@citype.route("/", methods=["PUT"]) -@auth_with_key -def update_citype(type_id=None): - type_name = request.values.get("type_name") - type_alias = request.values.get("type_alias") - _id = request.values.get("_id") - unique = request.values.get("unique") - icon_url = request.values.get("icon_url") - enabled = request.values.get("enabled") - enabled = False if enabled in (0, "0") else True \ - if enabled is not None else None - manager = CITypeManager() - ret, res = manager.update(type_id, type_name, type_alias, _id=_id, - unique=unique, icon_url=icon_url, - enabled=enabled) - if ret: - return jsonify(type_id=type_id) - abort(500, res) - - -@citype.route("/", methods=["DELETE"]) -@auth_with_key -def delete_citype(type_id=None): - manager = CITypeManager() - res = manager.delete(type_id) - return jsonify(message=res) - - -@citype.route("/enable/", methods=["GET", "POST"]) -def enable(type_id=None): - enable = request.values.get("enable", True) - manager = CITypeManager() - manager.set_enabled(type_id, enabled=enable) - return jsonify(type_id=type_id) diff --git a/core/ci_type_relation.py b/core/ci_type_relation.py deleted file mode 100644 index 36d72ca..0000000 --- a/core/ci_type_relation.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import Blueprint -from flask import jsonify -from flask import request - -from lib.ci_type import CITypeRelationManager -from lib.auth import auth_with_key - - -cityperelation = Blueprint("cityperelation", __name__) - - -@cityperelation.route("/types", methods=["GET"]) -def get_types(): - manager = CITypeRelationManager() - return jsonify(relation_types=manager.relation_types) - - -@cityperelation.route("//children", methods=["GET"]) -def get_children_by_parent(parent=None): - manager = CITypeRelationManager() - return jsonify(children=manager.get_children(parent)) - - -@cityperelation.route("//parents", methods=["GET"]) -def get_parents_by_child(child=None): - manager = CITypeRelationManager() - return jsonify(parents=manager.get_parents(child)) - - -@cityperelation.route("//", methods=["POST"]) -@auth_with_key -def create_citype_realtions(parent=None, child=None): - relation_type = request.values.get("relation_type", "contain") - manager = CITypeRelationManager() - res = manager.add(parent, child, relation_type=relation_type) - return jsonify(ctr_id=res) - - -@cityperelation.route("/", methods=["DELETE"]) -@auth_with_key -def delete_citype_relation(ctr_id=None): - manager = CITypeRelationManager() - manager.delete(ctr_id) - return jsonify(message="CIType Relation is deleted") - - -@cityperelation.route("//", methods=["DELETE"]) -@auth_with_key -def delete_citype_relation_2(parent=None, child=None): - manager = CITypeRelationManager() - manager.delete_2(parent, child) - return jsonify(message="CIType Relation is deleted") diff --git a/core/history.py b/core/history.py deleted file mode 100644 index 5eee828..0000000 --- a/core/history.py +++ /dev/null @@ -1,116 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from flask import jsonify -from flask import current_app -from flask import Blueprint -from flask import request -from flask import abort - -from models.history import OperationRecord -from models.history import CIRelationHistory -from models.history import CIAttributeHistory -from models.attribute import CIAttributeCache -from extensions import db -from models import row2dict -from models.account import UserCache -from lib.ci import CIManager -from lib.utils import get_page - -history = Blueprint("history", __name__) - - -@history.route("/record", methods=["GET"]) -def get_record(): - page = get_page(request.values.get("page", 1)) - _start = request.values.get("start") - _end = request.values.get("end") - username = request.values.get("username", "") - per_page_cnt = current_app.config.get("DEFAULT_PAGE_COUNT") - start, end = None, None - if _start: - try: - start = datetime.datetime.strptime(_start, '%Y-%m-%d %H:%M:%S') - except ValueError: - abort(400, 'incorrect start date time') - if _end: - try: - end = datetime.datetime.strptime(_end, '%Y-%m-%d %H:%M:%S') - except ValueError: - abort(400, 'incorrect end date time') - records = db.session.query(OperationRecord) - numfound = db.session.query(db.func.count(OperationRecord.record_id)) - if start: - records = records.filter(OperationRecord.timestamp >= start) - numfound = numfound.filter(OperationRecord.timestamp >= start) - if end: - records = records.filter(OperationRecord.timestamp <= end) - numfound = records.filter(OperationRecord.timestamp <= end) - if username: - user = UserCache.get(username) - if user: - records = records.filter(OperationRecord.uid == user.uid) - else: - return jsonify(numfound=0, records=[], - page=1, total=0, start=_start, - end=_end, username=username) - records = records.order_by(-OperationRecord.record_id).offset( - per_page_cnt * (page - 1)).limit(per_page_cnt).all() - total = len(records) - numfound = numfound.first()[0] - res = [] - for record in records: - _res = row2dict(record) - _res["user"] = UserCache.get(_res.get("uid")).nickname \ - if UserCache.get(_res.get("uid")).nickname \ - else UserCache.get(_res.get("uid")).username - attr_history = db.session.query(CIAttributeHistory.attr_id).filter( - CIAttributeHistory.record_id == _res.get("record_id")).all() - _res["attr_history"] = [CIAttributeCache.get(h.attr_id).attr_alias - for h in attr_history] - rel_history = db.session.query(CIRelationHistory.operate_type).filter( - CIRelationHistory.record_id == _res.get("record_id")).all() - rel_statis = {} - for rel in rel_history: - if rel.operate_type not in rel_statis: - rel_statis[rel.operate_type] = 1 - else: - rel_statis[rel.res.operate_type] += 1 - _res["rel_history"] = rel_statis - res.append(_res) - - return jsonify(numfound=numfound, records=res, page=page, total=total, - start=_start, end=_end, username=username) - - -@history.route("/", methods=["GET"]) -def get_detail_by_record(record_id=None): - record = db.session.query(OperationRecord).filter( - OperationRecord.record_id == record_id).first() - if record is None: - abort(404, "record is not found") - username = UserCache.get(record.uid).nickname \ - if UserCache.get(record.uid).nickname \ - else UserCache.get(record.uid).username - timestamp = record.timestamp.strftime("%Y-%m-%d %H:%M:%S") - attr_history = db.session.query(CIAttributeHistory).filter( - CIAttributeHistory.record_id == record_id).all() - rel_history = db.session.query(CIRelationHistory).filter( - CIRelationHistory.record_id == record_id).all() - attr_dict, rel_dict = dict(), {"add": [], "delete": []} - for attr_h in attr_history: - attr_dict[CIAttributeCache.get(attr_h.attr_id).attr_alias] = { - "old": attr_h.old, "new": attr_h.new, - "operate_type": attr_h.operate_type} - manager = CIManager() - for rel_h in rel_history: - _, first = manager.get_ci_by_id(rel_h.first_ci_id) - _, second = manager.get_ci_by_id(rel_h.second_ci_id) - rel_dict[rel_h.operate_type].append( - (first, rel_h.relation_type, second)) - - return jsonify(username=username, timestamp=timestamp, - attr_history=attr_dict, - rel_history=rel_dict) diff --git a/core/statis.py b/core/statis.py deleted file mode 100644 index 20b5061..0000000 --- a/core/statis.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import Blueprint - - -statis = Blueprint("statis", __name__) - - -@statis.route("") -def statis(): - pass \ No newline at end of file diff --git a/extensions.py b/extensions.py deleted file mode 100644 index 176c96c..0000000 --- a/extensions.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - - -from flask.ext.mail import Mail -from flask.ext.sqlalchemy import SQLAlchemy -from flask.ext.cache import Cache -from flask.ext.celery import Celery - -from lib.utils import RedisHandler - - -__all__ = ['mail', 'db', 'cache', 'celery', "rd"] - - -mail = Mail() -db = SQLAlchemy() -cache = Cache() -celery = Celery() -rd = RedisHandler() \ No newline at end of file diff --git a/gunicornserver.py b/gunicornserver.py deleted file mode 100644 index 996804e..0000000 --- a/gunicornserver.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- - -from flask_script import Command, Option - - -class GunicornServer(Command): - description = 'Run the app within Gunicorn' - - def __init__(self, host='127.0.0.1', port=5000, workers=8, - worker_class="sync", daemon=False): - self.port = port - self.host = host - self.workers = workers - self.worker_class = worker_class - self.daemon = daemon - - def get_options(self): - return ( - Option('-H', '--host', - dest='host', - default=self.host), - - Option('-p', '--port', - dest='port', - type=int, - default=self.port), - - Option('-w', '--workers', - dest='workers', - type=int, - default=self.workers), - - Option("-c", "--worker_class", - dest='worker_class', - type=str, - default=self.worker_class), - - Option("-d", "--daemon", - dest="daemon", - type=bool, - default=self.daemon) - ) - - def handle(self, app, host, port, workers, worker_class, daemon): - - from gunicorn import version_info - - if version_info < (0, 9, 0): - from gunicorn.arbiter import Arbiter - from gunicorn.config import Config - - arbiter = Arbiter(Config({'bind': "%s:%d" % (host, int(port)), - 'workers': workers, - 'worker_class': worker_class, - 'daemon': daemon}), app) - arbiter.run() - else: - from gunicorn.app.base import Application - - class FlaskApplication(Application): - def init(self, parser, opts, args): - return { - 'bind': '{0}:{1}'.format(host, port), - 'workers': workers, - 'worker_class': worker_class, - 'daemon': daemon - } - - def load(self): - return app - - FlaskApplication().run() diff --git a/lib/account.py b/lib/account.py deleted file mode 100644 index 31bb2b1..0000000 --- a/lib/account.py +++ /dev/null @@ -1,145 +0,0 @@ -# -*- coding:utf-8 -*- - - -import uuid -import random -import string -import datetime - -from flask import current_app -from flask import abort - -from extensions import db -from models.account import UserCache -from models.account import User -from models.account import UserRole - - -class AccountManager(object): - def __init__(self): - pass - - def get_user_by_uid(self, uid): - user = UserCache.get(uid) - return user - - def _generate_key(self): - key = uuid.uuid4().hex - secret = ''.join(random.sample(string.ascii_letters + - string.digits + '~!@#$%^&*?', 32)) - return key, secret - - def validate(self, username, password): - user, authenticated = User.query.authenticate(username, password) - return user, authenticated - - def create_user(self, **kwargs): - username = kwargs.get("username") - if username: - user = UserCache.get(username) - if user is not None: - user, authenticated = self.validate( - username, kwargs.get("password")) - if authenticated: - return user - else: - return abort(401, "authenticate validate failed") - else: - return abort(400, "argument username is required") - user = User() - email = kwargs.get("email", "") - if not email: - return abort(400, "argument email is required") - user.email = email - user.password = kwargs.get("password") - user.username = kwargs.get("username", "") - user.nickname = kwargs.get("nickname") if kwargs.get("nickname") \ - else kwargs.get("username", "") - key, secret = self._generate_key() - user.key = key - user.secret = secret - user.date_joined = datetime.datetime.now() - user.block = 0 - - db.session.add(user) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("create user is error {0}".format(str(e))) - return abort(500, "create user is error, {0}".format(str(e))) - return user - - def update_user(self, uid, **kwargs): - user = UserCache.get(uid) - if user is None: - return abort(400, "the user[{0}] is not existed".format(uid)) - user.username = kwargs.get("username", "") \ - if kwargs.get("username") else user.username - user.nickname = kwargs.get("nickname") \ - if kwargs.get("nickname") else user.nickname - user.department = kwargs.get("department") \ - if kwargs.get("department") else user.department - user.catalog = kwargs.get("catalog") \ - if kwargs.get("catalog") else user.catalog - user.email = kwargs.get("email") \ - if kwargs.get("email") else user.email - user.mobile = kwargs.get("mobile") \ - if kwargs.get("mobile") else user.mobile - db.session.add(user) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("create user is error {0}".format(str(e))) - return abort(500, "create user is error, {0}".format(str(e))) - return True, user - - def delete_user(self, uid): - user = UserCache.get(uid) - if user is None: - return abort(400, "the user[{0}] is not existed".format(uid)) - db.session.query(UserRole).filter(UserRole.uid == uid).delete() - db.session.delete(user) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("delete user error, {0}".format(str(e))) - return abort(500, "delete user error, {0}".format(str(e))) - return True, uid - - def update_password(self, uid, old, new, confirm): - user = User.query.get(uid) - if not user: - return abort(400, "user is not existed") - if not user.check_password(old): - return abort(400, "invalidate old password") - if not (new and confirm and new == confirm): - return abort(400, """Password cannot be empty, - two inputs must be the same""") - user.password = new - db.session.add(user) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("set password error, %s" % str(e)) - return abort(500, "set password errors, {0:s}".format(str(e))) - return True, user - - def reset_key(self, uid): - user = UserCache.get(uid) - if user is None: - return abort(400, "the user[{0}] is not existed".format(uid)) - key, secret = self._generate_key() - user.key = key - user.secret = secret - db.session.add(user) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("reset key is error, {0}".format(str(e))) - return abort(500, "reset key is error, {0}".format(str(e))) - return True, user \ No newline at end of file diff --git a/lib/attribute.py b/lib/attribute.py deleted file mode 100644 index dd6f6ca..0000000 --- a/lib/attribute.py +++ /dev/null @@ -1,168 +0,0 @@ -# -*- coding:utf-8 -*- - -from flask import current_app -from flask import abort - -from extensions import db -from models.attribute import CIAttribute -from models.attribute import CIAttributeCache -from models import row2dict -from lib.const import type_map - - -class AttributeManager(object): - """ - CI attributes manager - """ - - def __init__(self): - pass - - def _get_choice_value(self, attr_id, value_type): - _table = type_map.get("choice").get(value_type) - choice_values = db.session.query(_table.value).filter( - _table.attr_id == attr_id).all() - return [choice_value.value for choice_value in choice_values] - - def _add_choice_value(self, choice_value, attr_id, value_type): - _table = type_map.get("choice").get(value_type) - db.session.query(_table).filter(_table.attr_id == attr_id).delete() - db.session.flush() - for v in choice_value.strip().split(","): - table = _table() - table.attr_id = attr_id - table.value = v - db.session.add(table) - db.session.flush() - - def get_attributes(self, name=None): - """ - return attribute by name, - if name is None, then return all attributes - """ - attrs = db.session.query(CIAttribute).filter( - CIAttribute.attr_name.ilike("%{0}%".format(name))).all() \ - if name is not None else db.session.query(CIAttribute).all() - res = list() - for attr in attrs: - attr_dict = row2dict(attr) - if attr.is_choice: - attr_dict["choice_value"] = self._get_choice_value( - attr.attr_id, attr.value_type) - res.append(attr_dict) - return res - - def get_attribute_by_name(self, attr_name): - attr = db.session.query(CIAttribute).filter( - CIAttribute.attr_name == attr_name).first() - if attr: - attr_dict = row2dict(attr) - if attr.is_choice: - attr_dict["choice_value"] = self._get_choice_value( - attr.attr_id, attr.value_type) - return attr_dict - - def get_attribute_by_alias(self, attr_alias): - attr = db.session.query(CIAttribute).filter( - CIAttribute.attr_alias == attr_alias).first() - if attr: - attr_dict = row2dict(attr) - if attr.is_choice: - attr_dict["choice_value"] = self._get_choice_value( - attr.attr_id, attr.value_type) - return attr_dict - - def get_attribute_by_id(self, attr_id): - attr = db.session.query(CIAttribute).filter( - CIAttribute.attr_id == attr_id).first() - if attr: - attr_dict = row2dict(attr) - if attr.is_choice: - attr_dict["choice_value"] = self._get_choice_value( - attr.attr_id, attr.value_type) - return attr_dict - - def add(self, attr_name, attr_alias, **kwargs): - choice_value = kwargs.get("choice_value", False) - attr = CIAttributeCache.get(attr_name) - if attr is not None: - return False, "attribute {0} is already existed".format(attr_name) - is_choice = False - if choice_value: - is_choice = True - if not attr_alias: - attr_alias = attr_name - attr = CIAttribute() - attr.attr_name = attr_name - attr.attr_alias = attr_alias - attr.is_choice = is_choice - attr.is_multivalue = kwargs.get("is_multivalue", False) - attr.is_uniq = kwargs.get("is_uniq", False) - attr.is_index = kwargs.get("is_index", False) - attr.value_type = kwargs.get("value_type", "text") - db.session.add(attr) - db.session.flush() - - if choice_value: - self._add_choice_value(choice_value, attr.attr_id, attr.value_type) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("add attribute error, {0}".format(str(e))) - return False, str(e) - CIAttributeCache.clean(attr) - return True, attr.attr_id - - def update(self, attr_id, *args, **kwargs): - attr = db.session.query(CIAttribute).filter_by(attr_id=attr_id).first() - if not attr: - return False, "CI attribute you want to update is not existed" - choice_value = kwargs.get("choice_value", False) - is_choice = False - if choice_value: - is_choice = True - attr.attr_name = args[0] - attr.attr_alias = args[1] - if not args[1]: - attr.attr_alias = args[0] - attr.is_choice = is_choice - attr.is_multivalue = kwargs.get("is_multivalue", False) - attr.is_uniq = kwargs.get("is_uniq", False) - attr.value_type = kwargs.get("value_type", "text") - db.session.add(attr) - db.session.flush() - if is_choice: - self._add_choice_value(choice_value, attr.attr_id, attr.value_type) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("update attribute error, {0}".format( - str(e))) - return False, str(e) - CIAttributeCache.clean(attr) - return True, attr.attr_id - - def delete(self, attr_id): - attr, name = db.session.query(CIAttribute).filter_by( - attr_id=attr_id).first(), None - if attr: - if attr.is_choice: - choice_table = type_map["choice"].get(attr.value_type) - db.session.query(choice_table).filter( - choice_table.attr_id == attr_id).delete() - db.session.flush() - name = attr.attr_name - CIAttributeCache.clean(attr) - db.session.delete(attr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("delete attribute error, {0}".format( - str(e))) - return abort(500, str(e)) - else: - return abort(404, "attribute you want to delete is not existed") - return name \ No newline at end of file diff --git a/lib/auth.py b/lib/auth.py deleted file mode 100644 index 7147e78..0000000 --- a/lib/auth.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding:utf-8 -*- - -import urllib -from functools import wraps - -from flask import current_app -from flask import g -from flask import request -from flask import abort -from flask.ext.principal import identity_changed -from flask.ext.principal import Identity -from flask.ext.principal import AnonymousIdentity - -from models.account import User -from models.account import UserCache - - -def auth_with_key(func): - @wraps(func) - def wrapper(*args, **kwargs): - ip = request.remote_addr - if request.data: - request_args = dict() - _args = request.data.split("&") - for arg in _args: - if arg: - request_args[arg.split("=")[0]] = \ - urllib.unquote(arg.split("=")[1]) - else: - request_args = request.values - - key = request_args.get('_key') - secret = request_args.get('_secret') - if not key and not secret and \ - ip.strip() in current_app.config.get("WHITE_LIST"): - ip = ip.strip() - user = UserCache.get(ip) - if user: - identity_changed.send(current_app._get_current_object(), - identity=Identity(user.uid)) - return func(*args, **kwargs) - else: - identity_changed.send(current_app._get_current_object(), - identity=AnonymousIdentity()) - return abort(401, "invalid _key and _secret") - - path = request.path - - keys = sorted(request_args.keys()) - req_args = [request_args[k] for k in keys - if str(k) not in ("_key", "_secret")] - current_app.logger.debug('args is %s' % req_args) - user, authenticated = User.query.authenticate_with_key( - key, secret, req_args, path) - if user and authenticated: - identity_changed.send(current_app._get_current_object(), - identity=Identity(user.get("uid"))) - return func(*args, **kwargs) - else: - identity_changed.send(current_app._get_current_object(), - identity=AnonymousIdentity()) - return abort(401, "invalid _key and _secret") - - return wrapper diff --git a/lib/ci.py b/lib/ci.py deleted file mode 100644 index f69991f..0000000 --- a/lib/ci.py +++ /dev/null @@ -1,704 +0,0 @@ -# -*- coding:utf-8 -*- - - -import uuid -import time -import datetime -import json - -from flask import current_app -from flask import abort -from sqlalchemy import or_ - -from extensions import db -from extensions import rd -from models.ci import CI -from models.ci_relation import CIRelation -from models.ci_type import CITypeAttribute -from models.ci_type import CITypeCache -from models.ci_type import CITypeSpecCache -from models.history import CIAttributeHistory -from models.attribute import CIAttributeCache -from lib.const import TableMap -from lib.const import type_map -from lib.value import AttributeValueManager -from lib.history import CIAttributeHistoryManger -from lib.history import CIRelationHistoryManager -from lib.query_sql import QUERY_HOSTS_NUM_BY_PRODUCT -from lib.query_sql import QUERY_HOSTS_NUM_BY_BU -from lib.query_sql import QUERY_HOSTS_NUM_BY_PROJECT -from lib.query_sql import QUERY_CIS_BY_IDS -from lib.query_sql import QUERY_CIS_BY_VALUE_TABLE -from tasks.cmdb import ci_cache -from tasks.cmdb import ci_delete - - -class CIManager(object): - """ manage CI interface - """ - - def __init__(self): - pass - - def get_ci_by_id(self, ci_id, ret_key="name", - fields=None, need_children=True, use_master=False): - """@params: `ret_key` is one of 'name', 'id', 'alias' - `fields` is list of attribute name/alias/id - """ - ci = CI.query.get(ci_id) or \ - abort(404, "CI {0} is not existed".format(ci_id)) - - res = dict() - - if need_children: - children = self.get_children(ci_id, ret_key=ret_key) # one floor - res.update(children) - ci_type = CITypeCache.get(ci.type_id) - res["ci_type"] = ci_type.type_name - uniq_key = CIAttributeCache.get(ci_type.uniq_id) - if not fields: # fields are all attributes - attr_ids = db.session.query(CITypeAttribute.attr_id).filter_by( - type_id=ci.type_id) - fields = [CIAttributeCache.get(_.attr_id).attr_name - for _ in attr_ids] - - if uniq_key.attr_name not in fields: - fields.append(uniq_key.attr_name) - if fields: - value_manager = AttributeValueManager() - _res = value_manager._get_attr_values( - fields, ci_id, - ret_key=ret_key, uniq_key=uniq_key, use_master=use_master) - res.update(_res) - res['_type'] = ci_type.type_id - res['_id'] = ci_id - return res - - def get_ci_by_ids(self, ci_id_list, ret_key="name", fields=None): - result = list() - for ci_id in ci_id_list: - res = self.get_ci_by_id(ci_id, ret_key=ret_key, fields=fields) - result.append(res) - return result - - def get_children(self, ci_id, ret_key='name', relation_type="contain"): - second_cis = db.session.query(CIRelation.second_ci_id).filter( - CIRelation.first_ci_id == ci_id).filter(or_( - CIRelation.relation_type == relation_type, - CIRelation.relation_type == "deploy")) - second_ci_ids = (second_ci.second_ci_id for second_ci in second_cis) - ci_types = {} - for ci_id in second_ci_ids: - type_id = db.session.query(CI.type_id).filter( - CI.ci_id == ci_id).first().type_id - if type_id not in ci_types: - ci_types[type_id] = [ci_id] - else: - ci_types[type_id].append(ci_id) - res = {} - for type_id in ci_types: - ci_type = CITypeCache.get(type_id) - children = get_cis_by_ids(map(str, ci_types.get(type_id)), - ret_key=ret_key) - res[ci_type.type_name] = children - return res - - def get_cis_by_type(self, type_id, ret_key="name", fields="", - page=1, per_page=None): - if per_page is None: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - cis = db.session.query(CI.ci_id).filter(CI.type_id == type_id) - numfound = cis.count() - cis = cis.offset((page - 1) * per_page).limit(per_page) - res = list() - ci_ids = [str(ci.ci_id) for ci in cis] - if ci_ids: - res = get_cis_by_ids(ci_ids, ret_key, fields) - return numfound, page, res - - def ci_is_exist(self, ci_type, unique_key, unique): - table = TableMap(attr_name=unique_key.attr_name).table - unique = db.session.query(table).filter( - table.attr_id == unique_key.attr_id).filter( - table.value == unique).first() - if unique: - return db.session.query(CI).filter( - CI.ci_id == unique.ci_id).first() - - def _delete_ci_by_id(self, ci_id): - db.session.query(CI.ci_id).filter(CI.ci_id == ci_id).delete() - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("delete ci is error, {0}".format(str(e))) - - def add(self, ci_type_name, exist_policy="replace", - _no_attribute_policy="ignore", **ci_dict): - ci_existed = False - ci_type = CITypeCache.get(ci_type_name) or \ - abort(404, "CIType {0} is not existed".format(ci_type_name)) - - unique_key = CIAttributeCache.get(ci_type.uniq_id) \ - or abort(400, 'illegality unique attribute') - - unique = ci_dict.get(unique_key.attr_name) \ - or abort(400, '{0} missing'.format(unique_key.attr_name)) - - old_ci = self.ci_is_exist(ci_type, unique_key, unique) - if old_ci is not None: - ci_existed = True - if exist_policy == 'reject': - return abort(400, 'CI is existed') - if old_ci.type_id != ci_type.type_id: # update ci_type - old_ci.type_id = ci_type.type_id - db.session.add(old_ci) - db.session.flush() - ci = old_ci - else: - if exist_policy == 'need': - return abort(404, 'CI {0} not exist'.format(unique)) - ci = CI() - ci.type_id = ci_type.type_id - _uuid = uuid.uuid4().hex - ci.uuid = _uuid - ci.created_time = datetime.datetime.now() - db.session.add(ci) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error('add CI error: {0}'.format(str(e))) - return abort(400, 'add CI error') - value_manager = AttributeValueManager() - histories = list() - for p, v in ci_dict.items(): - ret, res = value_manager.add_attr_value( - p, v, ci.ci_id, ci_type, - _no_attribute_policy=_no_attribute_policy, - ci_existed=ci_existed) - if not ret: - db.session.rollback() - if not ci_existed: - self.delete(ci.ci_id) - current_app.logger.info(res) - return abort(400, res) - if res is not None: - histories.append(res) - try: - db.session.commit() - except Exception as e: - current_app.logger.error(str(e)) - db.session.rollback() - if not ci_existed: # only add - self.delete(ci.ci_id) - return abort(400, "add CI error") - his_manager = CIAttributeHistoryManger() - his_manager.add(ci.ci_id, histories) - ci_cache.apply_async([ci.ci_id], queue="cmdb_async") - return ci.ci_id - - def update_unique_value(self, ci_id, args): - ci = self.get_ci_by_id(ci_id, need_children=False) - unique_key = ci.get("unique") - attr = CIAttributeCache.get(unique_key) - table_key = "index_{0}".format(attr.value_type) \ - if attr.is_index else attr.value_type - value_table = type_map.get("table").get(table_key) - v = args.get(unique_key) - if value_table and v: - item = db.session.query(value_table).filter( - value_table.ci_id == ci_id).filter( - value_table.attr_id == attr.attr_id).first() - if item: - converter = type_map.get("converter").get(attr.value_type) - try: - item.value = converter(v) - except: - return abort(400, "value is illegal") - db.session.add(item) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error(str(e)) - return abort(400, "update unique failed") - ci_cache.apply_async([ci_id], queue="cmdb_async") - - def delete(self, ci_id): - ci = db.session.query(CI).filter(CI.ci_id == ci_id).first() - if ci is not None: - attrs = db.session.query(CITypeAttribute.attr_id).filter( - CITypeAttribute.type_id == ci.type_id).all() - attr_names = [] - for attr in attrs: - attr_names.append(CIAttributeCache.get(attr.attr_id).attr_name) - attr_names = set(attr_names) - for attr_name in attr_names: - Table = TableMap(attr_name=attr_name).table - db.session.query(Table).filter(Table.ci_id == ci_id).delete() - db.session.query(CIRelation).filter( - CIRelation.first_ci_id == ci_id).delete() - db.session.query(CIRelation).filter( - CIRelation.second_ci_id == ci_id).delete() - # db.session.query(CIAttributeHistory).filter( - # CIAttributeHistory.ci_id == ci_id).delete() - - db.session.flush() - db.session.delete(ci) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("delete CI error, {0}".format(str(e))) - return abort(400, "delete CI error, {0}".format(str(e))) - # todo: write history - ci_delete.apply_async([ci.ci_id], queue="cmdb_async") - return ci_id - return abort(404, "CI {0} not found".format(ci_id)) - - def add_heartbeat(self, ci_type, unique): - ci_type = CITypeCache.get(ci_type) - if not ci_type: - return 'error' - uniq_key = CIAttributeCache.get(ci_type.uniq_id) - Table = TableMap(attr_name=uniq_key.attr_name).table - ci_id = db.session.query(Table.ci_id).filter( - Table.attr_id == uniq_key.attr_id).filter( - Table.value == unique).first() - if ci_id is None: - return 'error' - ci = db.session.query(CI).filter(CI.ci_id == ci_id.ci_id).first() - if ci is None: - return 'error' - - ci.heartbeat = datetime.datetime.now() - - db.session.add(ci) - db.session.commit() - return "ok" - - def get_heartbeat(self, page, type_id, agent_status=None): - query = db.session.query(CI.ci_id, CI.heartbeat) - expire = datetime.datetime.now() - datetime.timedelta(minutes=72) - if type_id: - query = query.filter(CI.type_id == type_id) - else: - query = query.filter(db.or_(CI.type_id == 7, CI.type_id == 8)) - if agent_status == -1: - query = query.filter(CI.heartbeat == None) - elif agent_status == 0: - query = query.filter(CI.heartbeat <= expire) - elif agent_status == 1: - query = query.filter(CI.heartbeat > expire) - numfound = query.count() - per_page_count = current_app.config.get("DEFAULT_PAGE_COUNT") - cis = query.offset((page - 1) * per_page_count).limit( - per_page_count).all() - ci_ids = [ci.ci_id for ci in cis] - heartbeat_dict = {} - for ci in cis: - if agent_status is not None: - heartbeat_dict[ci.ci_id] = agent_status - else: - if ci.heartbeat is None: - heartbeat_dict[ci.ci_id] = -1 - elif ci.heartbeat <= expire: - heartbeat_dict[ci.ci_id] = 0 - else: - heartbeat_dict[ci.ci_id] = 1 - current_app.logger.debug(heartbeat_dict) - ci_ids = map(str, ci_ids) - res = get_cis_by_ids(ci_ids, fields=["hostname", "private_ip"]) - result = [(i.get("hostname"), i.get("private_ip")[0], i.get("ci_type"), - heartbeat_dict.get(i.get("_id"))) for i in res - if i.get("private_ip")] - return numfound, result - - -class CIRelationManager(object): - """ - manage relation between CIs - """ - - def __init__(self): - pass - - @property - def relation_types(self): - """ all CIType relation types - """ - from lib.const import CI_RELATION_TYPES - - return CI_RELATION_TYPES - - def get_second_cis(self, first_ci, relation_type="contain", - page=1, per_page=None, **kwargs): - if per_page is None: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - second_cis = db.session.query( - CI.ci_id).join( - CIRelation, CIRelation.second_ci_id == CI.ci_id).filter( - CIRelation.first_ci_id == first_ci).filter( - CIRelation.relation_type == relation_type) - if kwargs: # special for devices - second_cis = self._query_wrap_for_device(second_cis, **kwargs) - numfound = second_cis.count() - second_cis = second_cis.offset( - (page - 1) * per_page).limit(per_page).all() - ci_ids = [str(son.ci_id) for son in second_cis] - total = len(ci_ids) - result = get_cis_by_ids(ci_ids) - return numfound, total, result - - def get_grandsons(self, ci_id, page=1, per_page=None, **kwargs): - if per_page is None: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - children = db.session.query(CIRelation.second_ci_id).filter( - CIRelation.first_ci_id == ci_id).subquery() - grandsons = db.session.query(CIRelation.second_ci_id).join( - children, - children.c.second_ci_id == CIRelation.first_ci_id).subquery() - grandsons = db.session.query(CI.ci_id).join( - grandsons, grandsons.c.second_ci_id == CI.ci_id) - if kwargs: - grandsons = self._query_wrap_for_device(grandsons, **kwargs) - - numfound = grandsons.count() - grandsons = grandsons.offset( - (page - 1) * per_page).limit(per_page).all() - if not grandsons: - return 0, 0, [] - ci_ids = [str(son.ci_id) for son in grandsons] - total = len(ci_ids) - result = get_cis_by_ids(ci_ids) - - return numfound, total, result - - def _sort_handler(self, sort_by, query_sql): - - if sort_by.startswith("+"): - sort_type = "asc" - sort_by = sort_by[1:] - elif sort_by.startswith("-"): - sort_type = "desc" - sort_by = sort_by[1:] - else: - sort_type = "asc" - attr = CIAttributeCache.get(sort_by) - if attr is None: - return query_sql - - attr_id = attr.attr_id - Table = TableMap(attr_name=sort_by).table - - CI_table = query_sql.subquery() - query_sql = db.session.query(CI_table.c.ci_id, Table.value).join( - Table, Table.ci_id == CI_table.c.ci_id).filter( - Table.attr_id == attr_id).order_by( - getattr(Table.value, sort_type)()) - - return query_sql - - def _query_wrap_for_device(self, query_sql, **kwargs): - _type = kwargs.pop("_type", False) or kwargs.pop("type", False) \ - or kwargs.pop("ci_type", False) - if _type: - ci_type = CITypeCache.get(_type) - if ci_type is None: - return - query_sql = query_sql.filter(CI.type_id == ci_type.type_id) - - for k, v in kwargs.iteritems(): - attr = CIAttributeCache.get(k) - if attr is None: - continue - Table = TableMap(attr_name=k).table - CI_table = query_sql.subquery() - query_sql = db.session.query(CI_table.c.ci_id).join( - Table, Table.ci_id == CI_table.c.ci_id).filter( - Table.attr_id == attr.attr_id).filter( - Table.value.ilike(v.replace("*", "%"))) - - current_app.logger.debug(query_sql) - sort_by = kwargs.pop("sort", False) - if sort_by: - query_sql = self._sort_handler(sort_by, query_sql) - return query_sql - - def get_great_grandsons(self, ci_id, page=1, per_page=None, **kwargs): - if per_page is None: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - - children = db.session.query(CIRelation.second_ci_id).filter( - CIRelation.first_ci_id == ci_id).subquery() - grandsons = db.session.query(CIRelation.second_ci_id).join( - children, - children.c.second_ci_id == CIRelation.first_ci_id).subquery() - great_grandsons = db.session.query(CIRelation.second_ci_id).join( - grandsons, - grandsons.c.second_ci_id == CIRelation.first_ci_id).subquery() - great_grandsons = db.session.query(CI.ci_id).join( - great_grandsons, great_grandsons.c.second_ci_id == CI.ci_id) - if kwargs: - great_grandsons = self._query_wrap_for_device( - great_grandsons, **kwargs) - if great_grandsons is None: - return 0, 0, [] - numfound = great_grandsons.count() - great_grandsons = great_grandsons.offset( - (page - 1) * per_page).limit(per_page).all() - ci_ids = [str(son.ci_id) for son in great_grandsons] - total = len(ci_ids) - result = get_cis_by_ids(ci_ids) - - return numfound, total, result - - def get_first_cis(self, second_ci, relation_type="contain", - page=1, per_page=None): - """only for CI Type - """ - if per_page is None: - per_page = current_app.config.get("DEFAULT_PAGE_COUNT") - first_cis = db.session.query(CIRelation.first_ci_id).filter( - CIRelation.second_ci_id == second_ci).filter( - CIRelation.relation_type == relation_type) - numfound = first_cis.count() - first_cis = first_cis.offset( - (page - 1) * per_page).limit(per_page).all() - result = [] - first_ci_ids = [str(first_ci.first_ci_id) for first_ci in first_cis] - total = len(first_ci_ids) - if first_ci_ids: - result = get_cis_by_ids(first_ci_ids) - return numfound, total, result - - def get_grandfather(self, ci_id, relation_type="contain"): - """only for CI Type - """ - grandfather = db.session.query(CIRelation.first_ci_id).filter( - CIRelation.second_ci_id.in_(db.session.query( - CIRelation.first_ci_id).filter( - CIRelation.second_ci_id == ci_id).filter( - CIRelation.relation_type == relation_type))).filter( - CIRelation.relation_type == relation_type).first() - if grandfather: - return CIManager().get_ci_by_id(grandfather.first_ci_id, - need_children=False) - - def add(self, first_ci, second_ci, more=None, relation_type="contain"): - ci = db.session.query(CI.ci_id).filter(CI.ci_id == first_ci).first() - if ci is None: - return abort(404, "first_ci {0} is not existed".format(first_ci)) - c = db.session.query(CI.ci_id).filter(CI.ci_id == second_ci).first() - if c is None: - return abort(404, "second_ci {0} is not existed".format( - second_ci)) - existed = db.session.query(CIRelation.cr_id).filter( - CIRelation.first_ci_id == first_ci).filter( - CIRelation.second_ci_id == second_ci).first() - if existed is not None: - return existed.cr_id - cr = CIRelation() - cr.first_ci_id = first_ci - cr.second_ci_id = second_ci - if more is not None: - cr.more = more - cr.relation_type = relation_type - db.session.add(cr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("add CIRelation is error, {0}".format( - str(e))) - return abort(400, "add CIRelation is error, {0}".format(str(e))) - # write history - his_manager = CIRelationHistoryManager() - his_manager.add(cr.cr_id, cr.first_ci_id, cr.second_ci_id, - relation_type, operate_type="add") - return cr.cr_id - - def delete(self, cr_id): - cr = db.session.query(CIRelation).filter( - CIRelation.cr_id == cr_id).first() - cr_id = cr.cr_id - first_ci = cr.first_ci_id - second_ci = cr.second_ci_id - if cr is not None: - db.session.delete(cr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "delete CIRelation is error, {0}".format(str(e))) - return abort( - 400, "delete CIRelation is error, {0}".format(str(e))) - his_manager = CIRelationHistoryManager() - his_manager.add(cr_id, first_ci, second_ci, - cr.relation_type, operate_type="delete") - return True - return abort(404, "CI relation is not existed") - - def delete_2(self, first_ci, second_ci): - cr = db.session.query(CIRelation).filter( - CIRelation.first_ci_id == first_ci).filter( - CIRelation.second_ci_id == second_ci).first() - return self.delete(cr.cr_id) - - -class HostNumStatis(object): - def __init__(self): - pass - - def get_hosts_by_project(self, project_id_list=None): - res = {} - if not project_id_list: - project = CITypeCache.get("project") - projects = db.session.query(CI.ci_id).filter( - CI.type_id == project.type_id).all() - project_id_list = (project.ci_id for project in projects) - project_id_list = map(str, project_id_list) - project_ids = ",".join(project_id_list) - nums = db.session.execute(QUERY_HOSTS_NUM_BY_PROJECT.format( - "".join(["(", project_ids, ")"]))).fetchall() - if nums: - for ci_id in project_id_list: - res[int(ci_id)] = 0 - for ci_id, num in nums: - res[ci_id] = num - return res - - def get_hosts_by_product(self, product_id_list=None): - res = {} - if not product_id_list: - product = CITypeCache.get("product") - products = db.session.query(CI.ci_id).filter( - CI.type_id == product.type_id).all() - product_id_list = (product.ci_id for product in products) - product_id_list = map(str, product_id_list) - product_ids = ",".join(product_id_list) - nums = db.session.execute(QUERY_HOSTS_NUM_BY_PRODUCT.format( - "".join(["(", product_ids, ")"]))).fetchall() - if nums: - for ci_id in product_id_list: - res[int(ci_id)] = 0 - for ci_id, num in nums: - res[ci_id] = num - return res - - def get_hosts_by_bu(self, bu_id_list=None): - res = {} - if not bu_id_list: - bu = CITypeCache.get("bu") - bus = db.session.query(CI.ci_id).filter( - CI.type_id == bu.type_id).all() - bu_id_list = (bu.ci_id for bu in bus) - bu_id_list = map(str, bu_id_list) - bu_ids = ",".join(bu_id_list) - current_app.logger.debug(QUERY_HOSTS_NUM_BY_BU.format( - "".join(["(", bu_ids, ")"]))) - if not bu_ids: - return res - nums = db.session.execute( - QUERY_HOSTS_NUM_BY_BU.format( - "".join(["(", bu_ids, ")"]))).fetchall() - if nums: - for ci_id in bu_id_list: - res[int(ci_id)] = 0 - for ci_id, num in nums: - res[ci_id] = num - return res - - -def get_cis_by_ids(ci_ids, ret_key="name", fields="", value_tables=None): - """ argument ci_ids are string list of CI instance ID, eg. ['1', '2'] - """ - if not ci_ids: - return [] - start = time.time() - ci_id_tuple = tuple(map(int, ci_ids)) - res = rd.get(ci_id_tuple) - if res is not None and None not in res and ret_key == "name": - res = map(json.loads, res) - if not fields: - return res - else: - _res = [] - for d in res: - _d = dict() - _d["_id"], _d["_type"] = d.get("_id"), d.get("_type") - _d["ci_type"] = d.get("ci_type") - for field in fields: - _d[field] = d.get(field) - _res.append(_d) - current_app.logger.debug("filter time: %s" % (time.time() - start)) - return _res - current_app.logger.warning("cache not hit...............") - if not fields: - _fields = "" - else: - _fields = list() - for field in fields: - attr = CIAttributeCache.get(field) - if attr is not None: - _fields.append(str(attr.attr_id)) - _fields = "WHERE A.attr_id in ({0})".format(",".join(_fields)) - ci_ids = ",".join(ci_ids) - if value_tables is None: - value_tables = type_map["table_name"].values() - current_app.logger.debug(value_tables) - value_sql = " UNION ".join([QUERY_CIS_BY_VALUE_TABLE.format(value_table, - ci_ids) - for value_table in value_tables]) - query_sql = QUERY_CIS_BY_IDS.format(ci_ids, _fields, value_sql) - current_app.logger.debug(query_sql) - start = time.time() - hosts = db.session.execute(query_sql).fetchall() - current_app.logger.info("get cis time is: {0}".format( - time.time() - start)) - - ci_list = set() - res = list() - ci_dict = dict() - start = time.time() - for ci_id, type_id, attr_id, attr_name, \ - attr_alias, value, value_type, is_multivalue in hosts: - if ci_id not in ci_list: - ci_dict = dict() - ci_type = CITypeSpecCache.get(type_id) - ci_dict["_id"] = ci_id - ci_dict["_type"] = type_id - ci_dict["ci_type"] = ci_type.type_name - ci_dict["ci_type_alias"] = ci_type.type_alias - ci_list.add(ci_id) - res.append(ci_dict) - if ret_key == "name": - if is_multivalue: - if isinstance(ci_dict.get(attr_name), list): - ci_dict[attr_name].append(value) - else: - ci_dict[attr_name] = [value] - else: - ci_dict[attr_name] = value - elif ret_key == "alias": - if is_multivalue: - if isinstance(ci_dict.get(attr_alias), list): - ci_dict[attr_alias].append(value) - else: - ci_dict[attr_alias] = [value] - else: - ci_dict[attr_alias] = value - elif ret_key == "id": - if is_multivalue: - if isinstance(ci_dict.get(attr_id), list): - ci_dict[attr_id].append(value) - else: - ci_dict[attr_id] = [value] - else: - ci_dict[attr_id] = value - - current_app.logger.debug("result parser time is: {0}".format( - time.time() - start)) - return res \ No newline at end of file diff --git a/lib/ci_type.py b/lib/ci_type.py deleted file mode 100644 index 51f70ca..0000000 --- a/lib/ci_type.py +++ /dev/null @@ -1,316 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask import current_app -from flask import abort - -from extensions import db -from models import row2dict -from models.ci_type import CITypeAttribute -from models.ci_type import CIType -from models.ci_type import CITypeAttributeCache -from models.ci_type import CITypeCache -from models.ci_type_relation import CITypeRelation -from models.attribute import CIAttributeCache -from lib.attribute import AttributeManager - - -class CITypeAttributeManager(object): - """ - manage CIType's attributes, include query, add, update, delete - """ - - def __init__(self): - pass - - def get_attributes_by_type_id(self, type_id): - attrs = CITypeAttributeCache.get(type_id) - attr_manager = AttributeManager() - result = list() - for attr in attrs: - attr_dict = attr_manager.get_attribute_by_id(attr.attr_id) - attr_dict["is_required"] = attr.is_required - attr_dict["order"] = attr.order - result.append(attr_dict) - return result - - def add(self, type_id, attr_ids=None, is_required=False): - """ - add attributes to CIType, attr_ids are list - """ - if not attr_ids or not isinstance(attr_ids, list): - return abort(500, "attr_ids must be required") - ci_type = CITypeCache.get(type_id) - if ci_type is None: - return abort(404, "CIType ID({0}) is not existed".format(type_id)) - for attr_id in attr_ids: - attr = CIAttributeCache.get(attr_id) - if attr is None: - return abort(404, - "attribute id {0} is not existed".format(attr_id)) - existed = db.session.query(CITypeAttribute.attr_id).filter_by( - type_id=type_id).filter_by(attr_id=attr_id).first() - if existed is not None: - continue - current_app.logger.debug(attr_id) - db.session.add(CITypeAttribute( - type_id=type_id, attr_id=attr_id, is_required=is_required)) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "add attribute to CIType is error, {0}".format(str(e))) - return abort( - 500, "add attribute to CIType is error, maybe duplicate entry") - - CITypeAttributeCache.clean(type_id) - return True - - def delete(self, type_id, attr_ids=None): - """ - delete attributes at CIType, attr_ids are list - """ - if not attr_ids or not isinstance(attr_ids, list): - return abort( - 500, "delete attribute of CIType, attr_ids must be required") - ci_type = CITypeCache.get(type_id) - if ci_type is None: - return abort( - 404, "CIType ID({0}) is not existed".format(type_id)) - for attr_id in attr_ids: - attr = CIAttributeCache.get(attr_id) - if attr is None: - return abort( - 404, "attribute id {0} is not existed".format(attr_id)) - db.session.query(CITypeAttribute).filter_by( - type_id=type_id).filter_by(attr_id=attr_id).delete() - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "delete attributes of CIType is error, {0}".format(str(e))) - return abort(500, "delete attributes of CIType is error") - CITypeAttributeCache.clean(type_id) - return True - - -class CITypeManager(object): - """ - manage CIType - """ - - def __init__(self): - pass - - def get_citypes(self, type_name=None): - ci_types = db.session.query(CIType).all() if type_name is None else \ - db.session.query(CIType).filter( - CIType.type_name.ilike("%{0}%".format(type_name))).all() - res = list() - for ci_type in ci_types: - type_dict = row2dict(ci_type) - type_dict["uniq_key"] = CIAttributeCache.get( - type_dict["uniq_id"]).attr_name - res.append(type_dict) - return res - - def query(self, _type): - citype = CITypeCache.get(_type) - if citype: - return row2dict(citype) - return abort(404, "citype is not found") - - def add(self, type_name, type_alias, _id=None, unique=None, - icon_url="", enabled=True): - uniq_key = CIAttributeCache.get(_id) or CIAttributeCache.get(unique) - if uniq_key is None: - return False, "uniq_key is not existed" - citype = CITypeCache.get(type_name) - if citype: - return False, "this CIType {0} is existed".format(type_name) - _citype = CIType() - _citype.type_name = type_name - _citype.type_alias = type_alias - _citype.uniq_id = uniq_key.attr_id - _citype.enabled = enabled - _citype.icon_url = icon_url - db.session.add(_citype) - db.session.flush() - _citype_attr = CITypeAttribute() - _citype_attr.attr_id = uniq_key.attr_id - _citype_attr.type_id = _citype.type_id - _citype_attr.is_required = True - db.session.add(_citype_attr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("add CIType is error, {0}".format(str(e))) - return False, str(e) - CITypeCache.clean(type_name) - return True, _citype.type_id - - def update(self, type_id, type_name, type_alias, _id=None, unique=None, - icon_url="", enabled=None): - citype = CITypeCache.get(type_id) - if citype is None: - return False, "CIType {0} is not existed".format(type_name) - uniq_key = CIAttributeCache.get(_id) or CIAttributeCache.get(unique) - if uniq_key is not None: - citype.uniq_id = uniq_key.attr_id - citype_attr = db.session.query(CITypeAttribute).filter( - CITypeAttribute.type_id == type_id).filter( - CITypeAttribute.attr_id == uniq_key.attr_id).first() - if citype_attr is None: - citype_attr = CITypeAttribute() - citype_attr.attr_id = uniq_key.attr_id - citype_attr.type_id = type_id - citype_attr.is_required = True - db.session.add(citype_attr) - if type_name: - citype.type_name = type_name - if type_alias: - citype.type_alias = type_alias - if icon_url: - citype.icon_url = icon_url - if enabled is not None: - citype.enabled = enabled - db.session.add(citype) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error("add CIType is error, {0}".format(str(e))) - return False, str(e) - CITypeCache.clean(type_id) - return True, type_id - - def set_enabled(self, type_id, enabled=True): - citype = CITypeCache.get(type_id) - if citype is None: - return abort(404, "CIType[{0}] is not existed".format(type_id)) - citype.enabled = enabled - db.session.add(citype) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "set CIType enabled is error, {0}".format(str(e))) - return abort(500, str(e)) - return type_id - - def delete(self, type_id): - citype = db.session.query(CIType).filter_by(type_id=type_id).first() - type_name = citype.type_name - if citype: - db.session.delete(citype) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "delete CIType is error, {0}".format(str(e))) - return abort(500, str(e)) - CITypeCache.clean(type_id) - return "CIType {0} deleted".format(type_name) - return abort(404, "CIType is not existed") - - -class CITypeRelationManager(object): - """ - manage relation between CITypes - """ - - def __init__(self): - pass - - @property - def relation_types(self): - """ all CIType relation types - """ - from lib.const import CITYPE_RELATION_TYPES - - return CITYPE_RELATION_TYPES - - def get_children(self, parent_id): - children = db.session.query(CITypeRelation).filter( - CITypeRelation.parent_id == parent_id).all() - result = [] - for child in children: - ctr_id = child.ctr_id - citype = CITypeCache.get(child.child_id) - citype_dict = row2dict(citype) - citype_dict["ctr_id"] = ctr_id - manager = CITypeAttributeManager() - citype_dict["attributes"] = manager.get_attributes_by_type_id( - citype.type_id) - citype_dict["relation_type"] = child.relation_type - result.append(citype_dict) - return result - - def get_parents(self, child_id): - parents = db.session.query(CITypeRelation).filter( - CITypeRelation.child_id == child_id).all() - result = [] - for parent in parents: - ctr_id = parent.ctr_id - citype = CITypeCache.get(parent.parent_id) - citype_dict = row2dict(citype) - citype_dict["ctr_id"] = ctr_id - manager = CITypeAttributeManager() - citype_dict["attributes"] = manager.get_attributes_by_type_id( - citype.type_id) - citype_dict["relation_type"] = parent.relation_type - result.append(citype_dict) - return result - - def add(self, parent, child, relation_type="contain"): - p = CITypeCache.get(parent) - if p is None: - return abort(404, "parent {0} is not existed".format(parent)) - c = CITypeCache.get(child) - if c is None: - return abort(404, "child {0} is not existed".format(child)) - existed = db.session.query(CITypeRelation.ctr_id).filter_by( - parent_id=parent).filter_by(child_id=child).first() - if existed is not None: - return True, existed.ctr_id - ctr = CITypeRelation() - ctr.parent_id = parent - ctr.child_id = child - ctr.relation_type = relation_type - db.session.add(ctr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "add CITypeRelation is error, {0}".format(str(e))) - return abort( - 500, "add CITypeRelation is error, {0}".format(str(e))) - return ctr.ctr_id - - def delete(self, ctr_id): - ctr = db.session.query(CITypeRelation).filter( - CITypeRelation.ctr_id == ctr_id).first() - if ctr: - db.session.delete(ctr) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "delete CITypeRelation is error, {0}".format(str(e))) - return abort( - 500, "delete CITypeRelation is error, {0}".format(str(e))) - return True - return abort(404, "CIType relation is not existed") - - def delete_2(self, parent, child): - ctr = db.session.query(CITypeRelation).filter( - CITypeRelation.parent_id == parent).filter( - CITypeRelation.child_id == child).first() - return self.delete(ctr.ctr_id) \ No newline at end of file diff --git a/lib/const.py b/lib/const.py deleted file mode 100644 index ee25660..0000000 --- a/lib/const.py +++ /dev/null @@ -1,101 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from markupsafe import escape - -from models.attribute import TextChoice -from models.attribute import FloatChoice -from models.attribute import IntegerChoice -from models.attribute import CIAttributeCache -from models.ci_value import CIValueText -from models.ci_value import CIValueInteger -from models.ci_value import CIValueFloat -from models.ci_value import CIValueDateTime -from models.ci_value import CIIndexValueDateTime -from models.ci_value import CIIndexValueFloat -from models.ci_value import CIIndexValueInteger -from models.ci_value import CIIndexValueText - - -def string2int(x): - return int(float(x)) - - -def str2datetime(x): - try: - v = datetime.datetime.strptime(x, "%Y-%m-%d") - return v - except ValueError: - pass - try: - v = datetime.datetime.strptime(x, "%Y-%m-%d %H:%M:%S") - return v - except ValueError: - pass - raise ValueError - - -type_map = { - 'converter': { - 'int': string2int, - 'float': float, - 'text': escape, - 'datetime': str2datetime, - }, - 'choice': { - 'int': IntegerChoice, - 'float': FloatChoice, - 'text': TextChoice, - }, - 'table': { - 'int': CIValueInteger, - 'text': CIValueText, - 'datetime': CIValueDateTime, - 'float': CIValueFloat, - 'index_int': CIIndexValueInteger, - 'index_text': CIIndexValueText, - 'index_datetime': CIIndexValueDateTime, - 'index_float': CIIndexValueFloat, - }, - 'table_name': { - 'int': 'integers', - 'text': 'texts', - 'datetime': 'datetime', - 'float': 'floats', - 'index_int': 'index_integers', - 'index_text': 'index_texts', - 'index_datetime': 'index_datetime', - 'index_float': 'index_floats', - } -} - - -class TableMap(): - def __init__(self, attr_name=None): - self.attr_name = attr_name - - @property - def table(self): - if self.attr_name is not None: - attr = CIAttributeCache.get(self.attr_name) - if attr.is_index: - i = "index_{0}".format(attr.value_type) - else: - i = attr.value_type - return type_map["table"].get(i) - - @property - def table_name(self): - if self.attr_name is not None: - attr = CIAttributeCache.get(self.attr_name) - if attr.is_index: - i = "index_{0}".format(attr.value_type) - else: - i = attr.value_type - return type_map["table_name"].get(i) - - -CITYPE_RELATION_TYPES = ["connect", "deploy", "install", "contain"] -CI_RELATION_TYPES = ["connect", "deploy", "install", "contain"] \ No newline at end of file diff --git a/lib/decorator.py b/lib/decorator.py deleted file mode 100644 index 8cafba7..0000000 --- a/lib/decorator.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding:utf-8 -*- - - -import time -from functools import wraps - -from flask import request -from flask import render_template -from flask import current_app - -from lib.exception import InvalidUsageError - - -def templated(template=None): - def decorator(f): - @wraps(f) - def decorated_function(*args, **kwargs): - template_name = template - if template_name is None: - template_name = request.endpoint.replace('.', '/') + '.html' - ctx = f(*args, **kwargs) - if ctx is None: - ctx = {} - elif not isinstance(ctx, dict): - return ctx - return render_template(template_name, **ctx) - - return decorated_function - - return decorator - - -def argument_required1(*args_required): - from manage import InvalidUsageError - - def decorator(f): - @wraps(f) - def decorated_function(*args, **kwargs): - for arg in args_required: - if request.values.get(arg, None) is None: - raise InvalidUsageError( - "argument {0} is required".format(arg), 400) - return f(*args, **kwargs) - - return decorated_function - - return decorator - - -class argument_required(object): - def __init__(self, *args): - self.args = args - - def __enter__(self): - for arg in self.args: - if not request.values.get(arg): - raise InvalidUsageError( - "argument {0} is required".format(arg), status_code=400) - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - - -def url_statistic(f): - @wraps(f) - def decorated_func(*args, **kwargs): - start = time.time() - r = f(*args, **kwargs) - spend = time.time() - start - url = request.path - current_app.logger.info(url) - current_app.logger.info(spend) - return r - return decorated_func \ No newline at end of file diff --git a/lib/exception.py b/lib/exception.py deleted file mode 100644 index a11af85..0000000 --- a/lib/exception.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding:utf-8 -*- - - -class InvalidUsageError(Exception): - status_code = 400 - - def __init__(self, message, status_code=None, payload=None): - Exception.__init__(self) - self.message = message - if status_code is not None: - self.status_code = status_code - self.payload = payload - - def to_dict(self): - rv = dict(self.payload or ()) - rv['message'] = self.message - return rv \ No newline at end of file diff --git a/lib/history.py b/lib/history.py deleted file mode 100644 index ebcef62..0000000 --- a/lib/history.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from flask import current_app -from flask import g - -from extensions import db -from models.history import OperationRecord -from models.history import CIAttributeHistory -from models.history import CIRelationHistory - - -class CIAttributeHistoryManger(object): - def __init__(self): - pass - - def add(self, ci_id, history_list): - if history_list: - record = OperationRecord() - record.uid = g.user.uid - record.timestamp = datetime.datetime.now() - db.session.add(record) - db.session.commit() - for attr_id, operate_type, old, new in history_list: - history = CIAttributeHistory() - history.attr_id = attr_id - history.operate_type = operate_type - history.old = old - history.new = new - history.ci_id = ci_id - history.record_id = record.record_id - db.session.add(history) - - try: - db.session.commit() - except Exception as e: - db.session.rollback() - db.session.rollback() - current_app.logger.error( - "add attribute history error, {0}".format(str(e))) - return False, "add attribute history error, {0}".format(str(e)) - return True, None - - -class CIRelationHistoryManager(object): - def __init__(self): - pass - - def add(self, relation, first_ci, second_ci, - relation_type, operate_type="add"): - record = OperationRecord() - record.uid = g.user.uid - record.timestamp = datetime.datetime.now() - db.session.add(record) - db.session.flush() - - history = CIRelationHistory() - history.relation = relation - history.record_id = record.record_id - history.operate_type = operate_type - history.first_ci_id = first_ci - history.second_ci_id = second_ci - history.relation_type = relation_type - db.session.add(history) - - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "add relation history is error, {0}".format(str(e))) - return False, "add relation history is error, {0}".format(str(e)) - return True, None diff --git a/lib/query_sql.py b/lib/query_sql.py deleted file mode 100644 index 66e89b1..0000000 --- a/lib/query_sql.py +++ /dev/null @@ -1,107 +0,0 @@ -# -*- coding:utf-8 -*- - - -QUERY_HOSTS_BY_APP = """ - SELECT * - FROM cis - INNER JOIN ci_relations AS cr ON cis.`ci_id`=cr.`second_ci` - WHERE cr.`first_ci` = {0:d} LIMIT {1:d}, {2:d}; -""" - -QUERY_HOSTS_NUM_BY_PROJECT = """ - SELECT cr.first_ci_id, - count(DISTINCT cr.second_ci_id) - FROM ci_relations AS cr - WHERE cr.first_ci_id IN {0} - GROUP BY cr.first_ci_id -""" - -QUERY_HOSTS_NUM_BY_BU = """ - SELECT B.first_ci_id, - count(DISTINCT cr.second_ci_id) - FROM - (SELECT A.first_ci_id, - cr.second_ci_id - FROM - (SELECT cr.first_ci_id, - cis.ci_id - FROM cis - INNER JOIN ci_relations AS cr ON cis.ci_id=cr.second_ci_id - WHERE cr.first_ci_id IN {0}) AS A - INNER JOIN ci_relations AS cr ON cr.first_ci_id=A.ci_id) AS B - INNER JOIN ci_relations AS cr ON B.second_ci_id=cr.first_ci_id - GROUP BY B.first_ci_id -""" - -QUERY_HOSTS_NUM_BY_PRODUCT = """ - SELECT A.first_ci_id, - count(DISTINCT cr.second_ci_id) - FROM - (SELECT cr.first_ci_id, - cis.ci_id - FROM cis - INNER JOIN ci_relations AS cr ON cis.ci_id=cr.second_ci_id - WHERE cr.first_ci_id IN {0}) AS A - INNER JOIN ci_relations AS cr ON cr.first_ci_id=A.ci_id - GROUP BY A.first_ci_id; -""" - -QUERY_CIS_BY_VALUE_TABLE = """ - SELECT attr.attr_name, - attr.attr_alias, - attr.value_type, - attr.is_multivalue, - cis.type_id, - {0}.ci_id, - {0}.attr_id, - {0}.value - FROM {0} - INNER JOIN cis ON {0}.ci_id=cis.ci_id - AND {0}.`ci_id` IN ({1}) - INNER JOIN ci_attributes as attr ON attr.attr_id = {0}.attr_id -""" - -QUERY_CIS_BY_IDS = """ - SELECT A.ci_id, - A.type_id, - A.attr_id, - A.attr_name, - A.attr_alias, - A.value, - A.value_type, - A.is_multivalue - FROM - ({2}) AS A {1} - ORDER BY A.ci_id; -""" - -FACET_QUERY1 = """ - SELECT {0}.value, - count({0}.ci_id) - FROM {0} - INNER JOIN ci_attributes AS attr ON attr.attr_id={0}.attr_id - WHERE attr.attr_name="{1}" - GROUP BY {0}.ci_id; -""" - -FACET_QUERY = """ - SELECT {0}.value, - count({0}.ci_id) - FROM {0} - INNER JOIN ({1}) AS F ON F.ci_id={0}.ci_id - WHERE {0}.attr_id={2:d} - GROUP BY {0}.value -""" - -QUERY_CI_BY_ATTR_NAME = """ - SELECT {0}.ci_id - FROM {0} - WHERE {0}.attr_id={1:d} - AND {0}.value {2} -""" - -QUERY_CI_BY_TYPE = """ - SELECT cis.ci_id - FROM cis - WHERE cis.type_id in ({0}) -""" \ No newline at end of file diff --git a/lib/search.py b/lib/search.py deleted file mode 100644 index fc9c997..0000000 --- a/lib/search.py +++ /dev/null @@ -1,365 +0,0 @@ -# -*- coding:utf-8 -*- - - -import time - -from flask import current_app - -from lib.const import TableMap -from models.attribute import CIAttributeCache -from models.ci_type import CITypeCache -from extensions import db -from models.ci import CI -from lib.ci import get_cis_by_ids -from lib.query_sql import FACET_QUERY -from lib.query_sql import QUERY_CI_BY_TYPE -from lib.query_sql import QUERY_CI_BY_ATTR_NAME - - -class SearchError(Exception): - def __init__(self, v): - self.v = v - - def __str__(self): - return self.v - - -class Search(object): - def __init__(self, query=None, fl=None, facet_field=None, - page=1, ret_key="name", count=1, sort=None): - self.orig_query = query - self.fl = fl - self.facet_field = facet_field - self.page = page - self.ret_key = ret_key - try: - self.count = int(count) - except ValueError: - self.count = current_app.config.get("DEFAULT_PAGE_COUNT") - self.sort = sort - self.query_sql = "" - self.type_id_list = [] - - def tor_proc(self, key): - tor = list() - if key.startswith("+"): - tor.append('&') - key = key[1:].strip() - elif key.startswith("-"): - tor.append('|') - key = key[1:].strip() - elif key.startswith("~"): - tor.append('~') - key = key[1:].strip() - if not tor: - tor = ['&', ''] - if len(tor) < 2: - tor.append('') - return tor, key - - def attr_name_proc(self, key): - tor, key = self.tor_proc(key) - if key in ('ci_type', 'type', '_type'): - return '_type', 'text', tor, None - if key in ('id', 'ci_id', '_id'): - return '_id', 'text', tor, None - attr = CIAttributeCache.get(key) - if attr is not None: - # if not attr.is_index: - # raise SearchError("{0} is not indexed".format(attr.attr_name)) - field_name = attr.attr_name - return field_name, attr.value_type, tor, attr - else: - raise SearchError("{0} is not existed".format(key)) - - def type_query_handler(self, v, only_type_query): - new_v = [v] - if v.startswith("(") and v.endswith(")"): - new_v = v[1:-1].split(";") - for _v in new_v: - ci_type = CITypeCache.get(_v) - if ci_type is not None: - self.type_id_list.append(str(ci_type.type_id)) - if self.type_id_list: - type_ids = ",".join(self.type_id_list) - _query_sql = QUERY_CI_BY_TYPE.format(type_ids) - if only_type_query: - return _query_sql - else: - return "" - return "" - - def in_query_handler(self, attr, v): - new_v = v[1:-1].split(";") - table_name = TableMap(attr_name=attr.attr_name).table_name - _query_sql = QUERY_CI_BY_ATTR_NAME.format( - table_name, attr.attr_id, - " OR {0}.value ".format(table_name).join(['LIKE "{0}"'.format( - _v.replace("*", "%")) for _v in new_v])) - return _query_sql - - def range_query_handler(self, attr, v): - start, end = [x.strip() for x in v[1:-1].split("_TO_")] - table_name = TableMap(attr_name=attr.attr_name).table_name - _query_sql = QUERY_CI_BY_ATTR_NAME.format( - table_name, attr.attr_id, "BETWEEN '{0}' AND '{1}'".format( - start.replace("*", "%"), end.replace("*", "%"))) - return _query_sql - - def comparison_query_handler(self, attr, v): - table_name = TableMap(attr_name=attr.attr_name).table_name - if (v.startswith("<") and not v.startswith("<=")) or \ - (v.startswith(">") and not v.startswith(">=")): - _query_sql = QUERY_CI_BY_ATTR_NAME.format( - table_name, attr.attr_id, "{0} '{1}'".format( - v[0], v[1:].replace("*", "%"))) - elif v.startswith(">=") or v.startswith("<="): - _query_sql = QUERY_CI_BY_ATTR_NAME.format( - table_name, attr.attr_id, "{0} '{1}'".format( - v[:2], v[2:].replace("*", "%"))) - return _query_sql - - def sort_query_handler(self, field, query_sql, only_type_query): - if field is None: - field = "" - if field.startswith("+"): - field = field[1:] - sort_type = "ASC" - elif field.startswith("-"): - field = field[1:] - sort_type = "DESC" - else: - sort_type = "ASC" - - if field in ("_id", "ci_id") or not field: - if only_type_query: - return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ({0}) AS B {1}""".format( - query_sql, - "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( - (self.page - 1) * self.count, sort_type, self.count)) - elif self.type_id_list: - self.query_sql = """SELECT B.ci_id - FROM ({0}) AS B {1}""".format( - query_sql, - "INNER JOIN cis on cis.ci_id=B.ci_id " - "WHERE cis.type_id in ({0}) ".format( - ",".join(self.type_id_list))) - return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ({0}) AS B {1}""".format( - query_sql, - "INNER JOIN cis on cis.ci_id=B.ci_id " - "WHERE cis.type_id in ({3}) " - "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( - (self.page - 1) * self.count, sort_type, self.count, - ",".join(self.type_id_list))) - else: - self.query_sql = """SELECT B.ci_id - FROM ({0}) AS B {1}""".format( - query_sql, - "INNER JOIN cis on cis.ci_id=B.ci_id ") - return """SELECT SQL_CALC_FOUND_ROWS DISTINCT B.ci_id - FROM ({0}) AS B {1}""".format( - query_sql, - "INNER JOIN cis on cis.ci_id=B.ci_id " - "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( - (self.page - 1) * self.count, sort_type, self.count)) - else: - attr = CIAttributeCache.get(field) - attr_id = attr.attr_id - - table_name = TableMap(attr_name=attr.attr_name).table_name - _v_query_sql = """SELECT {0}.ci_id, {1}.value FROM - ({2}) AS {0} INNER JOIN {1} ON {1}.ci_id = {0}.ci_id - WHERE {1}.attr_id = {3}""".format("ALIAS", table_name, - query_sql, attr_id) - new_table = _v_query_sql - if only_type_query: - return "SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id " \ - "FROM ({0}) AS C " \ - "ORDER BY C.value {2} " \ - "LIMIT {1:d}, {3};".format(new_table, - (self.page - 1) * self.count, - sort_type, self.count) - elif self.type_id_list: - self.query_sql = """SELECT C.ci_id - FROM ({0}) AS C - INNER JOIN cis on cis.ci_id=C.ci_id - WHERE cis.type_id in ({1})""".format( - new_table, - ",".join(self.type_id_list)) - return """SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id - FROM ({0}) AS C - INNER JOIN cis on cis.ci_id=C.ci_id - WHERE cis.type_id in ({4}) - ORDER BY C.value {2} - LIMIT {1:d}, {3};""".format(new_table, - (self.page - 1) * self.count, - sort_type, self.count, - ",".join(self.type_id_list)) - else: - return """SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id - FROM ({0}) AS C - ORDER BY C.value {2} - LIMIT {1:d}, {3};""".format(new_table, - (self.page - 1) * self.count, - sort_type, self.count) - - def _wrap_sql(self, tor, alias, _query_sql, query_sql): - if tor[0] == "&": - query_sql = """SELECT * FROM ({0}) as {1} - INNER JOIN ({2}) as {3} USING(ci_id)""".format( - query_sql, alias, _query_sql, alias + "A") - elif tor[0] == "|": - query_sql = "SELECT * FROM ({0}) as {1} UNION ALL ({2})".format( - query_sql, alias, _query_sql) - elif tor[0] == "~": - query_sql = "SELECT * FROM ({0}) as {1} LEFT JOIN ({2}) as {3} " \ - "USING(ci_id) WHERE {3}.ci_id is NULL".format( - query_sql, alias, _query_sql, alias + "A") - return query_sql - - def _execute_sql(self, query_sql, only_type_query): - v_query_sql = self.sort_query_handler(self.sort, query_sql, - only_type_query) - start = time.time() - execute = db.session.execute - current_app.logger.debug(v_query_sql) - res = execute(v_query_sql).fetchall() - end_time = time.time() - current_app.logger.debug("query ci ids time is: {0}".format( - end_time - start)) - numfound = execute("SELECT FOUND_ROWS();").fetchall()[0][0] - current_app.logger.debug("statistics ci ids time is: {0}".format( - time.time() - end_time) - ) - return numfound, res - - def query_build_raw(self): - query_sql, alias, tor = "", "A", ["&"] - is_first = True - only_type_query = False - queries = self.orig_query.split(",") - queries = filter(lambda x: x != "", queries) - for q in queries: - if q.startswith("_type"): - queries.remove(q) - queries.insert(0, q) - if len(queries) == 1 or queries[1].startswith("-") or \ - queries[1].startswith("~"): - only_type_query = True - break - current_app.logger.debug(queries) - special = True - for q in queries: - _query_sql = "" - if ":" in q: - k = q.split(":")[0].strip() - v = ":".join(q.split(":")[1:]).strip() - current_app.logger.info(v) - field, field_type, tor, attr = self.attr_name_proc(k) - if field == "_type": - _query_sql = self.type_query_handler(v, only_type_query) - current_app.logger.debug(_query_sql) - elif field == "_id": # exclude all others - _ci_ids = [str(v)] - ci = db.session.query(CI.ci_id).filter( - CI.ci_id == int(v)).first() - if ci is not None: - return 1, _ci_ids - elif field: - if attr is None: - raise SearchError("{0} is not found".format(field)) - # in query - if v.startswith("(") and v.endswith(")"): - _query_sql = self.in_query_handler(attr, v) - # range query - elif v.startswith("[") and v.endswith("]") and "_TO_" in v: - _query_sql = self.range_query_handler(attr, v) - # comparison query - elif v.startswith(">=") or v.startswith("<=") or \ - v.startswith(">") or v.startswith("<"): - _query_sql = self.comparison_query_handler(attr, v) - else: - table_name = \ - TableMap(attr_name=attr.attr_name).table_name - _query_sql = QUERY_CI_BY_ATTR_NAME.format( - table_name, attr.attr_id, - 'LIKE "{0}"'.format(v.replace("*", "%"))) - else: - return 0, [] - elif q: - return 0, [] - - if is_first and _query_sql and not only_type_query: - query_sql = "SELECT * FROM ({0}) AS {1}".format(_query_sql, - alias) - is_first = False - alias += "A" - elif only_type_query and special: - is_first = False - special = False - query_sql = _query_sql - elif _query_sql: - query_sql = self._wrap_sql(tor, alias, _query_sql, query_sql) - alias += "AA" - - _start = time.time() - if query_sql: - self.query_sql = query_sql - current_app.logger.debug(query_sql) - numfound, res = self._execute_sql(query_sql, only_type_query) - current_app.logger.info("query ci ids is: {0}".format( - time.time() - _start)) - return numfound, [_res[0] for _res in res] - return 0, [] - - def facet_build(self): - facet = {} - for f in self.facet_field: - k, field_type, _, attr = self.attr_name_proc(f) - if k: - table_name = TableMap(attr_name=k).table_name - query_sql = FACET_QUERY.format( - table_name, self.query_sql, attr.attr_id) - current_app.logger.debug(query_sql) - result = db.session.execute(query_sql).fetchall() - facet[k] = result - facet_result = dict() - for k, v in facet.items(): - if not k.startswith('_'): - a = getattr(CIAttributeCache.get(k), "attr_%s" % self.ret_key) - facet_result[a] = list() - for f in v: - if f[1] != 0: - facet_result[a].append((f[0], f[1], a)) - return facet_result - - def fl_build(self): - _fl = list() - for f in self.fl: - k, _, _, _ = self.attr_name_proc(f) - if k: - _fl.append(k) - return _fl - - def search(self): - numfound, ci_ids = self.query_build_raw() - ci_ids = map(str, ci_ids) - _fl = self.fl_build() - - if self.facet_field and numfound: - facet = self.facet_build() - else: - facet = dict() - - response, counter = [], {} - if ci_ids: - response = get_cis_by_ids(ci_ids, ret_key=self.ret_key, fields=_fl) - for res in response: - ci_type = res.get("ci_type") - if ci_type not in counter.keys(): - counter[ci_type] = 0 - counter[ci_type] += 1 - total = len(response) - return response, counter, total, self.page, numfound, facet diff --git a/lib/template/__init__.py b/lib/template/__init__.py deleted file mode 100644 index 44d37d3..0000000 --- a/lib/template/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/lib/template/filters.py b/lib/template/filters.py deleted file mode 100644 index 149d4f7..0000000 --- a/lib/template/filters.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding:utf-8 -*- - - -def convert_to_list(v): - if isinstance(v, list): - return v - if isinstance(v, tuple): - return list(v) - return [v, ] diff --git a/lib/value.py b/lib/value.py deleted file mode 100644 index 4c98469..0000000 --- a/lib/value.py +++ /dev/null @@ -1,170 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from flask import current_app - -from extensions import db -from models.attribute import CIAttributeCache -from lib.attribute import AttributeManager -from lib.const import type_map -from lib.const import TableMap - - -class AttributeValueManager(object): - """ - manage CI attribute values - """ - - def __init__(self): - pass - - def _get_attr(self, key): - """key is one of attr_id, attr_name and attr_alias - """ - attr = CIAttributeCache.get(key) - return attr - - def _get_attr_values(self, fields, ci_id, - ret_key="name", - uniq_key=None, - use_master=False): - res = dict() - for field in fields: - attr = CIAttributeCache.get(field) - if not attr: - current_app.logger.warn('attribute %s not found' % field) - return res - table = TableMap(attr_name=attr.attr_name).table - if use_master: - rs = db.session().using_bind("master").query( - table.value).filter_by(ci_id=ci_id).filter_by( - attr_id=attr.attr_id) - else: - rs = db.session.query(table.value).filter_by( - ci_id=ci_id).filter_by(attr_id=attr.attr_id) - field_name = getattr(attr, "attr_{0}".format(ret_key)) - try: - if attr.is_multivalue: - if attr.value_type == 'datetime': - res[field_name] = [datetime.datetime.strftime( - x.value, '%Y-%m-%d %H:%M:%S') for x in rs.all()] - else: - res[field_name] = [x.value for x in rs.all()] - else: - x = rs.first() - if x: - if attr.value_type == 'datetime': - res[field_name] = datetime.datetime.strftime( - rs.first().value, '%Y-%m-%d %H:%M:%S') - else: - res[field_name] = rs.first().value - else: - res[field_name] = None - except AttributeError as e: - current_app.logger.warn("get ci by id error, {0}".format(e)) - if attr.is_multivalue: - res[field_name] = list() - else: - res[field_name] = "" - if uniq_key is not None and attr.attr_id == uniq_key.attr_id \ - and rs.first() is not None: - res['unique'] = uniq_key.attr_name - return res - - def _validate(self, attr, value, table, ci_id): - converter = type_map.get("converter").get(attr.value_type) - try: - v = converter(value) - except ValueError: - return False, "attribute value {0} converter fail".format(value) - if attr.is_choice: - choice_list = AttributeManager()._get_choice_value( - attr.attr_id, attr.value_type) - if v not in choice_list: - return False, "{0} is not existed in choice values".format( - value) - elif attr.is_uniq: - old_value = db.session.query(table.attr_id).filter( - table.attr_id == attr.attr_id).filter( - table.value == v).filter(table.ci_id != ci_id).first() - if old_value is not None: - return False, "attribute {0} value {1} must be unique".format( - attr.attr_name, value) - return True, v - - def add_attr_value(self, key, value, ci_id, ci_type, - _no_attribute_policy="ignore", ci_existed=False): - """key is one of attr_id, attr_name and attr_alias - """ - attr = self._get_attr(key) - if attr is None: - if _no_attribute_policy == 'ignore': - return True, None - if _no_attribute_policy == 'reject': - return False, 'attribute {0} not exist'.format(key) - table, old_value, old_value_table = TableMap( - attr_name=attr.attr_name).table, None, None - if ci_existed: - old_value_table = db.session.query(table).filter( - table.attr_id == attr.attr_id).filter( - table.ci_id == ci_id).first() - if old_value_table is not None: - old_value = old_value_table.value - if not value and ci_existed: - db.session.query(table).filter( - table.attr_id == attr.attr_id).filter( - table.ci_id == ci_id).delete() - if old_value: - return True, (attr.attr_id, "delete", old_value, None) - else: - return True, None - elif not value: - return True, None - if not attr.is_multivalue: - ret, res = self._validate(attr, value, table, ci_id) - if not ret: - return False, res - value_table = table() - if ci_existed: # for history - old = db.session.query(table).filter( - table.attr_id == attr.attr_id).filter( - table.value == value).filter( - table.ci_id == ci_id).first() - if old is not None: - return True, None - elif old_value_table: - value_table = old_value_table - value_table.ci_id = ci_id - value_table.attr_id = attr.attr_id - value_table.value = res - db.session.add(value_table) - elif attr.is_multivalue: - if ci_existed: - db.session.query(table).filter( - table.attr_id == attr.attr_id).filter( - table.ci_id == ci_id).delete() - - for v in value.strip().split(","): - ret, res = self._validate(attr, v, table, ci_id) - if not ret: - return False, res - value_table = table() - value_table.ci_id = ci_id - value_table.attr_id = attr.attr_id - value_table.value = res - db.session.add(value_table) - try: - db.session.commit() - except Exception as e: - db.session.rollback() - current_app.logger.error( - "add attribute value is error, {0}".format(str(e))) - return False, "add attribute value is error, {0}".format(str(e)) - if ci_existed: - if old_value != value: - return True, (attr.attr_id, "update", old_value, value) - else: - return True, None - return True, (attr.attr_id, "add", None, value) diff --git a/manage.py b/manage.py deleted file mode 100644 index 3488926..0000000 --- a/manage.py +++ /dev/null @@ -1,77 +0,0 @@ -# -*- coding: utf-8 -*- - - -from flask import jsonify -from flask import make_response -from flask.ext.script import Manager -from flask.ext.script import prompt_bool -from flask.ext.celery import install_commands as install_celery_command - -from __init__ import make_app -from extensions import db -from gunicornserver import GunicornServer -from lib.exception import InvalidUsageError - - -app = make_app('config.cfg') - - -@app.errorhandler(InvalidUsageError) -def handle_invalid_usage(error): - response = jsonify(error.to_dict()) - response.status_code = error.status_code - return response - - -@app.errorhandler(404) -def not_found(error): - return make_response(jsonify({'message': error.description}), 404) - - -@app.errorhandler(400) -def bad_request(error): - return make_response(jsonify({'message': error.description}), 400) - - -@app.errorhandler(401) -def auth_lack(error): - return make_response(jsonify({'message': error.description}), 401) - - -@app.errorhandler(403) -def exception_403(error): - return make_response(jsonify({'message': error.description}), 403) - - -@app.errorhandler(405) -def exception_405(error): - return make_response(jsonify({'message': error.description}), 405) - - -@app.errorhandler(500) -def server_error(error): - return make_response(jsonify({"message": error.description}), 500) - - -manager = Manager(app) - -install_celery_command(manager) - - -@manager.command -def db_setup(): - "create all database tables" - db.create_all() - - -@manager.command -def db_dropall(): - "drop all databse tables" - if prompt_bool("Are you sure ? You will lose all your data !"): - db.drop_all() - - -manager.add_command("run", GunicornServer()) - -if __name__ == '__main__': - manager.run(default_command="runserver") diff --git a/models/__init__.py b/models/__init__.py deleted file mode 100644 index f18317d..0000000 --- a/models/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding:utf-8 -*- - - -def row2dict(row): - d = dict() - for c in row.__table__.columns: - if not isinstance(getattr(row, c.name), - (basestring, long, int, float, list, tuple, dict)) \ - and getattr(row, c.name): - d[c.name] = getattr(row, c.name).strftime("%Y-%m-%d %H:%M:%S") - elif c.name not in ("password", "secret"): - d[c.name] = getattr(row, c.name) - return d \ No newline at end of file diff --git a/models/attribute.py b/models/attribute.py deleted file mode 100644 index 1f5081f..0000000 --- a/models/attribute.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding:utf-8 -*- - -from extensions import db, cache - - -class CIAttribute(db.Model): - __tablename__ = "ci_attributes" - - attr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - attr_name = db.Column(db.String(32), nullable=False, unique=True) - attr_alias = db.Column(db.String(32), nullable=False, unique=True) - value_type = db.Column( - db.Enum("int", "float", "text", "datetime", name='value_type'), - default="text", - nullable=False) - is_choice = db.Column(db.Boolean, default=False) - is_multivalue = db.Column(db.Boolean, default=False) - is_uniq = db.Column(db.Boolean, default=False) - is_index = db.Column(db.Boolean, default=False) - - -class IntegerChoice(db.Model): - __tablename__ = 'choice_integers' - - choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - attr = db.relationship("CIAttribute", backref="choice_integers") - value = db.Column(db.Integer, nullable=False) - - -class FloatChoice(db.Model): - __tablename__ = 'choice_floats' - - choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - attr = db.relationship("CIAttribute", backref="choice_floats") - value = db.Column(db.Float, nullable=False) - - -class TextChoice(db.Model): - __tablename__ = 'choice_texts' - - choice_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - attr = db.relationship("CIAttribute", backref="choice_texts") - value = db.Column(db.Text, nullable=False) - - -class CIAttributeCache(object): - @classmethod - def get(cls, key): - if key is None: - return - attr = cache.get('Field::Name::%s' % key) or \ - cache.get('Field::ID::%s' % key) or \ - cache.get('Field::Alias::%s' % key) - if attr is None: - attr = db.session.query(CIAttribute).filter_by( - attr_name=key).first() or \ - db.session.query(CIAttribute).filter( - CIAttribute.attr_id == key).first() or \ - db.session.query(CIAttribute).filter( - CIAttribute.attr_alias == key).first() - db.session.close() - if attr is not None: - CIAttributeCache.set(attr) - return attr - - @classmethod - def set(cls, attr): - cache.set('Field::ID::%s' % attr.attr_id, attr) - cache.set('Field::Name::%s' % attr.attr_name, attr) - cache.set('Field::Alias::%s' % attr.attr_alias, attr) - - @classmethod - def clean(cls, attr): - if cache.get('Field::ID::%s' % attr.attr_id): - cache.delete('Field::ID::%s' % attr.attr_id) - cache.delete('Field::Name::%s' % attr.attr_name) - cache.delete('Field::Alias::%s' % attr.attr_alias) \ No newline at end of file diff --git a/models/ci.py b/models/ci.py deleted file mode 100644 index ab1a897..0000000 --- a/models/ci.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding:utf-8 -*- - -import datetime - -from extensions import db - - -class CI(db.Model): - __tablename__ = "cis" - - ci_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - uuid = db.Column(db.String(32), nullable=False) - type_id = db.Column(db.Integer, - db.ForeignKey("ci_types.type_id"), - nullable=False) - ci_type = db.relationship("CIType", backref="cis") - status = db.Column(db.Enum("review", "validate", name="status")) - created_time = db.Column(db.DateTime, default=datetime.datetime.now()) - heartbeat = db.Column(db.DateTime, default=datetime.datetime.now()) diff --git a/models/ci_relation.py b/models/ci_relation.py deleted file mode 100644 index 10585c9..0000000 --- a/models/ci_relation.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding:utf-8 -*- - - -from extensions import db - - -class CIRelation(db.Model): - __tablename__ = "ci_relations" - cr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - first_ci_id = db.Column(db.Integer, - db.ForeignKey("cis.ci_id"), - primary_key=True) - second_ci_id = db.Column(db.Integer, - db.ForeignKey("cis.ci_id"), - primary_key=True) - first_ci = db.relationship("CI", - primaryjoin="CI.ci_id==CIRelation.first_ci_id") - second_ci = db.relationship( - "CI", primaryjoin="CI.ci_id==CIRelation.second_ci_id") - relation_type = db.Column( - db.Enum("connect", "deploy", "install", "contain", - name="relation_type"), nullable=False) - more = db.Column(db.Integer, db.ForeignKey("cis.ci_id")) - - __table_args__ = (db.UniqueConstraint("first_ci_id", "second_ci_id", - name="first_second_uniq"), ) diff --git a/models/ci_type.py b/models/ci_type.py deleted file mode 100644 index 7ec4e78..0000000 --- a/models/ci_type.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- coding:utf-8 -*- - -from extensions import db -from extensions import cache - - -class CIType(db.Model): - __tablename__ = "ci_types" - - type_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - type_name = db.Column(db.String(32)) - type_alias = db.Column(db.String(32)) - uniq_id = db.Column(db.Integer, - db.ForeignKey("ci_attributes.attr_id"), - nullable=False) - uniq_key = db.relationship("CIAttribute", backref="ci_types") - enabled = db.Column(db.Boolean, default=True, nullable=False) - is_attached = db.Column(db.Boolean, default=False, nullable=False) - icon_url = db.Column(db.String(256)) - order = db.Column(db.SmallInteger, default=0, nullable=False) - - -class CITypeAttribute(db.Model): - __tablename__ = "type_attributes" - - type_id = db.Column(db.Integer, - db.ForeignKey("ci_types.type_id"), - primary_key=True) - attr_id = db.Column(db.Integer, - db.ForeignKey("ci_attributes.attr_id"), - primary_key=True) - is_required = db.Column(db.Boolean, default=False) - order = db.Column(db.Integer, default=0) - - __table_args__ = (db.UniqueConstraint("type_id", "attr_id", - name="type_attr_uniq"), ) - - -class CITypeCache(object): - @classmethod - def get(cls, key): - if key is None: - return - ct = cache.get("CIType::ID::%s" % key) or \ - cache.get("CIType::Name::%s" % key) - if ct is None: - ct = db.session.query(CIType).filter( - CIType.type_name == key).first() or \ - db.session.query(CIType).filter(CIType.type_id == key).first() - if ct is not None: - CITypeCache.set(ct) - return ct - - @classmethod - def set(cls, ct): - cache.set("CIType::Name::%s" % ct.type_name, ct) - cache.set("CIType::ID::%d" % ct.type_id, ct) - - @classmethod - def clean(cls, key): - ct = CITypeCache.get(key) - if ct is not None: - cache.delete("CIType::Name::%s" % ct.type_name) - cache.delete("CIType::ID::%s" % ct.type_id) - - -class CITypeSpecCache(object): - @classmethod - def get(cls, key): - if key is None: - return - ct = cache.get("CITypeSPEC::ID::%d" % key) - if ct is None: - ct = db.session.query(CIType).filter(CIType.type_id == key).first() - if ct is not None: - CITypeSpecCache.set(ct) - return ct - - @classmethod - def set(cls, ct): - cache.set("CITypeSPEC::ID::%d" % ct.type_id, ct) - - @classmethod - def clean(cls, key): - ct = CITypeCache.get(key) - if ct is not None: - cache.delete("CITypeSPEC::ID::%d" % ct.type_id) - - -class CITypeAttributeCache(object): - """ - key is type_id or type_name - """ - - @classmethod - def get(cls, key): - if key is None: - return - if isinstance(key, basestring) and isinstance(key, unicode): - key = unicode(key, 'utf8') - citypes = cache.get("CITypeAttribute::Name::%s" % key) or \ - cache.get("CITypeAttribute::ID::%s" % key) - if not citypes: - citypes = db.session.query(CITypeAttribute).filter( - CITypeAttribute.type_id == key).all() - if citypes is None: - ci_type = db.session.query(CIType).filter( - CIType.type_name == key).first() - if ci_type is not None: - citypes = db.session.query(CITypeAttribute).filter_by( - type_id=ci_type.type_id).all() - if citypes is not None: - CITypeAttributeCache.set(key, citypes) - return citypes - - @classmethod - def set(cls, key, values): - citype = CITypeCache.get(key) - if citype is not None: - cache.set("CITypeAttribute::ID::%s" % citype.type_id, values) - cache.set("CITypeAttribute::Name::%s" % citype.type_name, values) - - @classmethod - def clean(cls, key): - citype = CITypeCache.get(key) - attrs = CITypeAttributeCache.get(key) - if attrs is not None and citype: - cache.delete("CITypeAttribute::ID::%s" % citype.type_id) - cache.delete("CITypeAttribute::Name::%s" % citype.type_name) \ No newline at end of file diff --git a/models/ci_type_relation.py b/models/ci_type_relation.py deleted file mode 100644 index b36509f..0000000 --- a/models/ci_type_relation.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding:utf-8 -*- - -from extensions import db - - -class CITypeRelation(db.Model): - __tablename__ = "ci_type_relations" - - ctr_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - parent_id = db.Column(db.Integer, - db.ForeignKey("ci_types.type_id"), - primary_key=True) - parent = db.relationship( - "CIType", primaryjoin="CIType.type_id==CITypeRelation.parent_id") - child_id = db.Column(db.Integer, - db.ForeignKey("ci_types.type_id"), - primary_key=True) - child = db.relationship( - "CIType", primaryjoin="CIType.type_id==CITypeRelation.child_id") - relation_type = db.Column( - db.Enum("contain", "connect", "deploy", "install", - name="relation_type"), - default="contain") - - __table_args__ = (db.UniqueConstraint("parent_id", "child_id", - name="parent_child_uniq"), ) \ No newline at end of file diff --git a/models/ci_value.py b/models/ci_value.py deleted file mode 100644 index f99068c..0000000 --- a/models/ci_value.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- coding:utf-8 -*- - - -from extensions import db -from sqlalchemy import Index - - -class CIIndexValueInteger(db.Model): - __tablename__ = "index_integers" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="index_integers") - attr = db.relationship("CIAttribute", backref="index_integers") - value = db.Column(db.Integer, nullable=False) - - __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) - - -class CIIndexValueFloat(db.Model): - __tablename__ = "index_floats" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="index_floats") - attr = db.relationship("CIAttribute", backref="index_floats") - value = db.Column(db.Float, nullable=False) - - __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) - - -class CIIndexValueText(db.Model): - __tablename__ = "index_texts" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="index_texts") - attr = db.relationship("CIAttribute", backref="index_texts") - value = db.Column(db.String(128), nullable=False) - - __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) - - -class CIIndexValueDateTime(db.Model): - __tablename__ = "index_datetime" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="index_datetime") - attr = db.relationship("CIAttribute", backref="index_datetime") - value = db.Column(db.DateTime, nullable=False) - - __table_args__ = (Index("attr_value_index", "attr_id", "value"), ) - - -class CIValueInteger(db.Model): - __tablename__ = "integers" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="integers") - attr = db.relationship("CIAttribute", backref="integers") - value = db.Column(db.Integer, nullable=False) - - -class CIValueFloat(db.Model): - __tablename__ = "floats" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="floats") - attr = db.relationship("CIAttribute", backref="floats") - value = db.Column(db.Float, nullable=False) - - -class CIValueText(db.Model): - __tablename__ = "texts" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="texts") - attr = db.relationship("CIAttribute", backref="texts") - value = db.Column(db.Text, nullable=False) - - -class CIValueDateTime(db.Model): - __tablename__ = "datetime" - - value_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - ci_id = db.Column(db.Integer, db.ForeignKey('cis.ci_id'), nullable=False) - attr_id = db.Column(db.Integer, - db.ForeignKey('ci_attributes.attr_id'), - nullable=False) - ci = db.relationship("CI", backref="datetime") - attr = db.relationship("CIAttribute", backref="datetime") - value = db.Column(db.DateTime, nullable=False) diff --git a/models/history.py b/models/history.py deleted file mode 100644 index e0bf10a..0000000 --- a/models/history.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from extensions import db - - -class OperationRecord(db.Model): - __tablename__ = "records" - - record_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - uid = db.Column(db.Integer, db.ForeignKey('users.uid'), nullable=False) - timestamp = db.Column(db.DateTime, - nullable=False, - default=datetime.datetime.now()) - origin = db.Column(db.String(32)) - ticket_id = db.Column(db.String(32)) - reason = db.Column(db.Text) - - -class CIAttributeHistory(db.Model): - __tablename__ = "histories" - - h_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - operate_type = db.Column(db.Enum("add", "delete", "update", - name="operate_type")) - record_id = db.Column(db.Integer, - db.ForeignKey("records.record_id"), - nullable=False) - ci_id = db.Column(db.Integer, nullable=False) - attr_id = db.Column(db.Integer, nullable=False) - old = db.Column(db.Text) - new = db.Column(db.Text) - - -class CIRelationHistory(db.Model): - __tablename__ = "relation_histories" - - rh_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - operate_type = db.Column(db.Enum("add", "delete", name="operate_type")) - record_id = db.Column(db.Integer, - db.ForeignKey("records.record_id"), - nullable=False) - first_ci_id = db.Column(db.Integer) - second_ci_id = db.Column(db.Integer) - relation_type = db.Column( - db.Enum("connect", "deploy", "install", "contain", - name="relation_type")) - relation = db.Column(db.Integer, nullable=False) diff --git a/models/statis.py b/models/statis.py deleted file mode 100644 index 64e03a4..0000000 --- a/models/statis.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from extensions import db - - -class UrlRecord(db.Model): - - url_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - - url = db.Column(db.String(64), nullable=False) - response_time = db.Column(db.Float, nullable=False) - is_ok = db.Column(db.Boolean, default=True) - source = db.Column(db.String(32)) - remote_addr = db.Column(db.String(20)) - hits = db.Column(db.Integer) - method = db.Column(db.String(5), default="GET") - created_at = db.Column(db.DateTime, default=datetime.datetime.now()) \ No newline at end of file diff --git a/permissions.py b/permissions.py deleted file mode 100644 index 891b952..0000000 --- a/permissions.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding:utf-8 -*- - - -from flask.ext.principal import RoleNeed, Permission - - -admin = Permission(RoleNeed('admin')) -auth = Permission(RoleNeed('authenticated')) -null = Permission(RoleNeed('null')) \ No newline at end of file diff --git a/requirements/default.txt b/requirements/default.txt deleted file mode 100644 index 6ee0a59..0000000 --- a/requirements/default.txt +++ /dev/null @@ -1,14 +0,0 @@ -Flask==0.9 -Flask-Script==0.5.2 -Flask-Babel==0.8 -Flask-principal==0.3.5 -Flask-mail==0.7.4 -pymysql==0.5 -sqlalchemy==0.8.2 -Flask-sqlalchemy==0.16 -Flask-cache==0.9.2 -redis==2.7.2 -gunicorn==0.17.4 -celery==3.0.18 -flask-celery=2.4.3 -Jinja2==2.7.1 \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..97ac5d6 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,11 @@ +[flake8] +ignore = D401,D202,E226,E302,E41 +max-line-length=120 +exclude = migrations/* +max-complexity = 10 + +[isort] +line_length=88 +multi_line_output=3 +skip=migrations/* +include_trailing_comma=true diff --git a/tasks/__init__.py b/tasks/__init__.py deleted file mode 100644 index 44d37d3..0000000 --- a/tasks/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding:utf-8 -*- \ No newline at end of file diff --git a/tasks/statis.py b/tasks/statis.py deleted file mode 100644 index 0971117..0000000 --- a/tasks/statis.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding:utf-8 -*- - - -import datetime - -from flask import current_app - -from extensions import celery -from extensions import db -from models.statis import UrlRecord - - -@celery.task(name="statis.url_record", queue="statis_async") -def url_record(url, method, remote_addr, response_time, status_code, source): - current_app.logger.info("%s add 1" % url) - now = datetime.datetime.now() - u = UrlRecord(url=url, response_time=response_time, is_ok=1, - source="default", hits=1, method=method, created_at=now, - remote_addr=remote_addr) - db.session.add(u) - db.session.commit() \ No newline at end of file diff --git a/templates/search.xml b/templates/search.xml deleted file mode 100644 index e30f791..0000000 --- a/templates/search.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - {{ numfound }} - {{ page }} - - {% for ci in result %} - - {% for k, v in ci.items() %} - {% if not k.startswith('_') %} - {% for item in v | convert_to_list %} - {{ item }} - {% endfor %} - {% endif %} - {% endfor %} - - {% endfor %} - - - {% for k,v in facet.items() %} - - {% for item in v %} - {{ item[1] }} - {% endfor %} - - {% endfor %} - - \ No newline at end of file diff --git a/templates/search_tidy.xml b/templates/search_tidy.xml deleted file mode 100644 index 52832a0..0000000 --- a/templates/search_tidy.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - {{ code }} - - {% for k, v in ret.items() %} - - {% for ci in v %} - - - {% for item in ci|convert_to_list %} - {{ item }} - {% endfor %} - - - {% endfor %} - - {% endfor %} - - \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..b0c2ab8 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +"""Tests for the app.""" diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..003c8fc --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +"""Defines fixtures available to all tests.""" + +import pytest +from webtest import TestApp + +from api.app import create_app + + +@pytest.fixture +def app(): + """Create application for the tests.""" + _app = create_app("tests.settings") + ctx = _app.test_request_context() + ctx.push() + yield _app + + ctx.pop() + + +@pytest.fixture +def testapp(app): + """Create Webtest app.""" + return TestApp(app) diff --git a/tests/test_cmdb_attribute.py b/tests/test_cmdb_attribute.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/tests/test_cmdb_attribute.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/tests/test_cmdb_ci.py b/tests/test_cmdb_ci.py new file mode 100644 index 0000000..78a93f1 --- /dev/null +++ b/tests/test_cmdb_ci.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- + + +class TestCI: + + def test_ci_search_only_type_query(self, app): + with app.test_client() as c: + rv = c.get('/api/v0.1/ci/s?q=_type:server', json={}) + json_data = rv.get_json() + assert type(json_data.get("result")) is list diff --git a/tests/test_cmdb_ci_realtion.py b/tests/test_cmdb_ci_realtion.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/tests/test_cmdb_ci_realtion.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/tests/test_cmdb_ci_type.py b/tests/test_cmdb_ci_type.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/tests/test_cmdb_ci_type.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/tests/test_cmdb_ci_type_relation.py b/tests/test_cmdb_ci_type_relation.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/tests/test_cmdb_ci_type_relation.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/tests/test_cmdb_history.py b/tests/test_cmdb_history.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/tests/test_cmdb_history.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/tests/test_cmdb_preference.py b/tests/test_cmdb_preference.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/tests/test_cmdb_preference.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/tests/test_cmdb_relation_type.py b/tests/test_cmdb_relation_type.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/tests/test_cmdb_relation_type.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/ui b/ui new file mode 160000 index 0000000..fe3c83d --- /dev/null +++ b/ui @@ -0,0 +1 @@ +Subproject commit fe3c83d40ab2fd41e3356184f2ec403f7f4d4294 From c0b50642e058f0f71b7bb6d2cf4e44eca16ee490 Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 28 Aug 2019 20:45:59 +0800 Subject: [PATCH 024/159] update README --- .gitignore | 34 ++++++++++++++-------------------- README.md | 2 +- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index e07e230..a2c0d27 100755 --- a/.gitignore +++ b/.gitignore @@ -62,34 +62,28 @@ env/ # Configuration -api/settings.py -tests/settings.py +settings.py # Development database *.db # UI -ui/.DS_Store -ui/node_modules -ui/dist +node_modules +dist # local env files -ui/.env.local -ui/.env.*.local +.env.local +.env.*.local # Log files -ui/npm-debug.log* -ui/yarn-debug.log* -ui/yarn-error.log* -ui/yarn.lock +npm-debug.log* +yarn-debug.log* +yarn-error.log* +yarn.lock # Editor directories and files -ui/.idea -ui/.vscode -ui/*.suo -ui/*.ntvs* -ui/*.njsproj -ui/*.sln -ui/*.sw* - - +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw* diff --git a/README.md b/README.md index 61a4dbb..c70dd52 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ -- 在线预览: [CMDB](url "http://39.100.252.148:8000") +- 在线预览: [CMDB]("http://39.100.252.148:8000") - username: admin - password: admin From 5faae9af671d30112bff6535fad11621e86188ab Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 28 Aug 2019 20:48:04 +0800 Subject: [PATCH 025/159] remove ui --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c70dd52..11ce10a 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ -- 在线预览: [CMDB]("http://39.100.252.148:8000") +- 在线预览: [CMDB](http://39.100.252.148:8000) - username: admin - password: admin From f3046d3c91e8c9dc1f861a773d0ddf59423d2d2a Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 28 Aug 2019 20:48:23 +0800 Subject: [PATCH 026/159] remove ui --- ui | 1 - 1 file changed, 1 deletion(-) delete mode 160000 ui diff --git a/ui b/ui deleted file mode 160000 index fe3c83d..0000000 --- a/ui +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fe3c83d40ab2fd41e3356184f2ec403f7f4d4294 From 5b4f95a50e47ed5e6acab6307f9915334904866c Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 28 Aug 2019 20:51:51 +0800 Subject: [PATCH 027/159] add ui --- .gitignore | 22 +- ui/.editorconfig | 39 + ui/.env | 3 + ui/.env.preview | 3 + ui/.prettierrc | 5 + ui/.travis.yml | 7 + ui/LICENSE | 21 + ui/babel.config.js | 20 + ui/jest.config.js | 23 + ui/jsconfig.json | 11 + ui/package-lock.json | 19631 ++++++++++++++++ ui/package.json | 144 + ui/public/cmdb01.jpeg | Bin 0 -> 118206 bytes ui/public/cmdb02.jpeg | Bin 0 -> 71403 bytes ui/public/color.less | 7684 ++++++ ui/public/index.html | 23 + ui/public/loading/loading.css | 1 + ui/public/loading/loading.html | 1 + .../loading/option2/html_code_segment.html | 5 + ui/public/loading/option2/loading.css | 1 + ui/public/loading/option2/loading.svg | 1 + ui/src/App.vue | 41 + ui/src/EventBus.js | 3 + ui/src/api/cmdb/CIRelation.js | 15 + ui/src/api/cmdb/CIType.js | 111 + ui/src/api/cmdb/CITypeAttr.js | 124 + ui/src/api/cmdb/CITypeRelation.js | 40 + ui/src/api/cmdb/batch.js | 67 + ui/src/api/cmdb/ci.js | 41 + ui/src/api/cmdb/history.js | 8 + ui/src/api/cmdb/preference.js | 41 + ui/src/api/index.js | 14 + ui/src/api/login.js | 67 + ui/src/api/manage.js | 62 + ui/src/assets/background.svg | 69 + ui/src/assets/icons/bx-analyse.svg | 1 + ui/src/assets/logo.png | Bin 0 -> 20228 bytes ui/src/assets/logo.svg | 29 + .../ArticleListContent/ArticleListContent.vue | 89 + ui/src/components/ArticleListContent/index.js | 3 + ui/src/components/AvatarList/Item.vue | 46 + ui/src/components/AvatarList/List.vue | 99 + ui/src/components/AvatarList/index.js | 4 + ui/src/components/AvatarList/index.less | 60 + ui/src/components/AvatarList/index.md | 64 + ui/src/components/Charts/Bar.vue | 62 + ui/src/components/Charts/ChartCard.vue | 120 + ui/src/components/Charts/Liquid.vue | 67 + ui/src/components/Charts/MiniArea.vue | 56 + ui/src/components/Charts/MiniBar.vue | 57 + ui/src/components/Charts/MiniProgress.vue | 75 + ui/src/components/Charts/MiniSmoothArea.vue | 40 + ui/src/components/Charts/Radar.vue | 68 + ui/src/components/Charts/RankList.vue | 77 + ui/src/components/Charts/TagCloud.vue | 113 + ui/src/components/Charts/TransferBar.vue | 64 + ui/src/components/Charts/Trend.vue | 82 + ui/src/components/Charts/chart.less | 13 + ui/src/components/Charts/smooth.area.less | 14 + ui/src/components/CountDown/CountDown.vue | 102 + ui/src/components/CountDown/index.js | 3 + ui/src/components/CountDown/index.md | 34 + .../DescriptionList/DescriptionList.vue | 153 + ui/src/components/DescriptionList/index.js | 2 + ui/src/components/Editor/QuillEditor.vue | 82 + ui/src/components/Editor/WangEditor.vue | 57 + ui/src/components/Ellipsis/Ellipsis.vue | 64 + ui/src/components/Ellipsis/index.js | 3 + ui/src/components/Ellipsis/index.md | 38 + ui/src/components/Exception/ExceptionPage.vue | 130 + ui/src/components/Exception/index.js | 2 + ui/src/components/Exception/type.js | 19 + .../FooterToolbar/FooterToolBar.vue | 30 + ui/src/components/FooterToolbar/index.js | 4 + ui/src/components/FooterToolbar/index.less | 23 + ui/src/components/FooterToolbar/index.md | 48 + .../components/GlobalFooter/GlobalFooter.vue | 42 + ui/src/components/GlobalFooter/index.js | 2 + .../components/GlobalHeader/GlobalHeader.vue | 129 + ui/src/components/GlobalHeader/index.js | 2 + .../components/IconSelector/IconSelector.vue | 86 + ui/src/components/IconSelector/README.md | 48 + ui/src/components/IconSelector/icons.js | 36 + ui/src/components/IconSelector/index.js | 2 + ui/src/components/Menu/SideMenu.vue | 63 + ui/src/components/Menu/index.js | 2 + ui/src/components/Menu/menu.js | 184 + ui/src/components/MultiTab/MultiTab.vue | 173 + ui/src/components/MultiTab/index.js | 4 + ui/src/components/MultiTab/index.less | 25 + ui/src/components/NoticeIcon/NoticeIcon.vue | 90 + ui/src/components/NoticeIcon/index.js | 2 + ui/src/components/NumberInfo/NumberInfo.vue | 54 + ui/src/components/NumberInfo/index.js | 3 + ui/src/components/NumberInfo/index.less | 55 + ui/src/components/NumberInfo/index.md | 43 + ui/src/components/PageHeader/PageHeader.vue | 202 + ui/src/components/PageHeader/index.js | 2 + ui/src/components/PageLoading/index.jsx | 10 + ui/src/components/Result/Result.vue | 109 + ui/src/components/Result/index.js | 2 + .../SettingDrawer/SettingDrawer.vue | 354 + .../components/SettingDrawer/SettingItem.vue | 38 + ui/src/components/SettingDrawer/index.js | 2 + .../components/SettingDrawer/settingConfig.js | 105 + ui/src/components/SettingDrawer/themeColor.js | 23 + .../StandardFormRow/StandardFormRow.vue | 122 + ui/src/components/StandardFormRow/index.js | 3 + ui/src/components/Table/README.md | 341 + ui/src/components/Table/index.js | 315 + .../components/TagSelect/TagSelectOption.jsx | 45 + ui/src/components/TagSelect/index.jsx | 103 + ui/src/components/Tree/Tree.jsx | 124 + ui/src/components/Trend/Trend.vue | 41 + ui/src/components/Trend/index.js | 3 + ui/src/components/Trend/index.less | 42 + ui/src/components/Trend/index.md | 45 + ui/src/components/_util/util.js | 46 + ui/src/components/global.less | 490 + ui/src/components/index.js | 62 + ui/src/components/index.less | 5 + ui/src/components/tools/Breadcrumb.vue | 45 + ui/src/components/tools/DetailList.vue | 5 + ui/src/components/tools/HeadInfo.vue | 67 + ui/src/components/tools/Logo.vue | 30 + ui/src/components/tools/TopMenu.vue | 34 + ui/src/components/tools/TwoStepCaptcha.vue | 89 + ui/src/components/tools/UserMenu.vue | 72 + ui/src/components/tools/index.js | 0 ui/src/config/defaultSettings.js | 34 + ui/src/config/router.config.js | 152 + ui/src/core/bootstrap.js | 34 + ui/src/core/directives/action.js | 34 + ui/src/core/icons.js | 11 + ui/src/core/lazy_lib/components_use.js | 99 + ui/src/core/lazy_use.js | 20 + ui/src/core/use.js | 25 + ui/src/layouts/BasicLayout.vue | 192 + ui/src/layouts/BlankLayout.vue | 16 + ui/src/layouts/PageView.vue | 181 + ui/src/layouts/RouteView.vue | 32 + ui/src/layouts/UserLayout.vue | 139 + ui/src/layouts/index.js | 7 + ui/src/main.js | 27 + ui/src/permission.js | 62 + ui/src/router/README.md | 145 + ui/src/router/index.js | 28 + ui/src/store/getters.js | 15 + ui/src/store/index.js | 27 + ui/src/store/modules/app.js | 122 + ui/src/store/modules/permission.js | 62 + ui/src/store/modules/user.js | 95 + ui/src/store/mutation-types.js | 16 + ui/src/utils/axios.js | 35 + ui/src/utils/device.js | 33 + ui/src/utils/domUtil.js | 19 + ui/src/utils/filter.js | 20 + ui/src/utils/helper/permission.js | 51 + ui/src/utils/mixin.js | 76 + ui/src/utils/permissions.js | 8 + ui/src/utils/request.js | 56 + ui/src/utils/util.js | 60 + ui/src/utils/utils.less | 50 + ui/src/views/404.vue | 15 + ui/src/views/account/center/Index.vue | 288 + ui/src/views/account/center/page/App.vue | 113 + ui/src/views/account/center/page/Article.vue | 75 + ui/src/views/account/center/page/Project.vue | 109 + ui/src/views/account/center/page/index.js | 5 + ui/src/views/account/settings/AvatarModal.vue | 109 + ui/src/views/account/settings/BaseSetting.vue | 161 + ui/src/views/account/settings/Binding.vue | 25 + ui/src/views/account/settings/Custom.vue | 75 + ui/src/views/account/settings/Index.vue | 155 + .../views/account/settings/Notification.vue | 25 + ui/src/views/account/settings/Security.vue | 41 + ui/src/views/cmdb/ci/index.vue | 449 + ui/src/views/cmdb/ci/modules/CiDetail.vue | 369 + .../cmdb/ci/modules/CreateInstanceForm.vue | 158 + ui/src/views/cmdb/ci/modules/EditableCell.vue | 76 + ui/src/views/cmdb/ci/modules/SearchForm.vue | 131 + ui/src/views/cmdb/preference/index.vue | 366 + ui/src/views/cmdb/tree_views/index.vue | 248 + ui/src/views/exception/403.vue | 17 + ui/src/views/exception/404.vue | 17 + ui/src/views/exception/500.vue | 17 + ui/src/views/user/Login.vue | 210 + ui/src/views/user/Register.vue | 322 + ui/src/views/user/RegisterResult.vue | 50 + ui/src/views/welcome/index.vue | 34 + ui/src/views/welcome/welcome.vue | 0 ui/tests/unit/.eslintrc.js | 5 + ui/vue.config.js | 126 + ui/webstorm.config.js | 16 + 194 files changed, 40240 insertions(+), 16 deletions(-) create mode 100644 ui/.editorconfig create mode 100644 ui/.env create mode 100644 ui/.env.preview create mode 100644 ui/.prettierrc create mode 100644 ui/.travis.yml create mode 100644 ui/LICENSE create mode 100644 ui/babel.config.js create mode 100644 ui/jest.config.js create mode 100644 ui/jsconfig.json create mode 100644 ui/package-lock.json create mode 100644 ui/package.json create mode 100644 ui/public/cmdb01.jpeg create mode 100644 ui/public/cmdb02.jpeg create mode 100644 ui/public/color.less create mode 100644 ui/public/index.html create mode 100644 ui/public/loading/loading.css create mode 100644 ui/public/loading/loading.html create mode 100644 ui/public/loading/option2/html_code_segment.html create mode 100644 ui/public/loading/option2/loading.css create mode 100644 ui/public/loading/option2/loading.svg create mode 100644 ui/src/App.vue create mode 100644 ui/src/EventBus.js create mode 100644 ui/src/api/cmdb/CIRelation.js create mode 100644 ui/src/api/cmdb/CIType.js create mode 100644 ui/src/api/cmdb/CITypeAttr.js create mode 100644 ui/src/api/cmdb/CITypeRelation.js create mode 100644 ui/src/api/cmdb/batch.js create mode 100644 ui/src/api/cmdb/ci.js create mode 100644 ui/src/api/cmdb/history.js create mode 100644 ui/src/api/cmdb/preference.js create mode 100644 ui/src/api/index.js create mode 100644 ui/src/api/login.js create mode 100644 ui/src/api/manage.js create mode 100644 ui/src/assets/background.svg create mode 100644 ui/src/assets/icons/bx-analyse.svg create mode 100644 ui/src/assets/logo.png create mode 100644 ui/src/assets/logo.svg create mode 100644 ui/src/components/ArticleListContent/ArticleListContent.vue create mode 100644 ui/src/components/ArticleListContent/index.js create mode 100644 ui/src/components/AvatarList/Item.vue create mode 100644 ui/src/components/AvatarList/List.vue create mode 100644 ui/src/components/AvatarList/index.js create mode 100644 ui/src/components/AvatarList/index.less create mode 100644 ui/src/components/AvatarList/index.md create mode 100644 ui/src/components/Charts/Bar.vue create mode 100644 ui/src/components/Charts/ChartCard.vue create mode 100644 ui/src/components/Charts/Liquid.vue create mode 100644 ui/src/components/Charts/MiniArea.vue create mode 100644 ui/src/components/Charts/MiniBar.vue create mode 100644 ui/src/components/Charts/MiniProgress.vue create mode 100644 ui/src/components/Charts/MiniSmoothArea.vue create mode 100644 ui/src/components/Charts/Radar.vue create mode 100644 ui/src/components/Charts/RankList.vue create mode 100644 ui/src/components/Charts/TagCloud.vue create mode 100644 ui/src/components/Charts/TransferBar.vue create mode 100644 ui/src/components/Charts/Trend.vue create mode 100644 ui/src/components/Charts/chart.less create mode 100644 ui/src/components/Charts/smooth.area.less create mode 100644 ui/src/components/CountDown/CountDown.vue create mode 100644 ui/src/components/CountDown/index.js create mode 100644 ui/src/components/CountDown/index.md create mode 100644 ui/src/components/DescriptionList/DescriptionList.vue create mode 100644 ui/src/components/DescriptionList/index.js create mode 100644 ui/src/components/Editor/QuillEditor.vue create mode 100644 ui/src/components/Editor/WangEditor.vue create mode 100644 ui/src/components/Ellipsis/Ellipsis.vue create mode 100644 ui/src/components/Ellipsis/index.js create mode 100644 ui/src/components/Ellipsis/index.md create mode 100644 ui/src/components/Exception/ExceptionPage.vue create mode 100644 ui/src/components/Exception/index.js create mode 100644 ui/src/components/Exception/type.js create mode 100644 ui/src/components/FooterToolbar/FooterToolBar.vue create mode 100644 ui/src/components/FooterToolbar/index.js create mode 100644 ui/src/components/FooterToolbar/index.less create mode 100644 ui/src/components/FooterToolbar/index.md create mode 100644 ui/src/components/GlobalFooter/GlobalFooter.vue create mode 100644 ui/src/components/GlobalFooter/index.js create mode 100644 ui/src/components/GlobalHeader/GlobalHeader.vue create mode 100644 ui/src/components/GlobalHeader/index.js create mode 100644 ui/src/components/IconSelector/IconSelector.vue create mode 100644 ui/src/components/IconSelector/README.md create mode 100644 ui/src/components/IconSelector/icons.js create mode 100644 ui/src/components/IconSelector/index.js create mode 100644 ui/src/components/Menu/SideMenu.vue create mode 100644 ui/src/components/Menu/index.js create mode 100644 ui/src/components/Menu/menu.js create mode 100644 ui/src/components/MultiTab/MultiTab.vue create mode 100644 ui/src/components/MultiTab/index.js create mode 100644 ui/src/components/MultiTab/index.less create mode 100644 ui/src/components/NoticeIcon/NoticeIcon.vue create mode 100644 ui/src/components/NoticeIcon/index.js create mode 100644 ui/src/components/NumberInfo/NumberInfo.vue create mode 100644 ui/src/components/NumberInfo/index.js create mode 100644 ui/src/components/NumberInfo/index.less create mode 100644 ui/src/components/NumberInfo/index.md create mode 100644 ui/src/components/PageHeader/PageHeader.vue create mode 100644 ui/src/components/PageHeader/index.js create mode 100644 ui/src/components/PageLoading/index.jsx create mode 100644 ui/src/components/Result/Result.vue create mode 100644 ui/src/components/Result/index.js create mode 100644 ui/src/components/SettingDrawer/SettingDrawer.vue create mode 100644 ui/src/components/SettingDrawer/SettingItem.vue create mode 100644 ui/src/components/SettingDrawer/index.js create mode 100644 ui/src/components/SettingDrawer/settingConfig.js create mode 100644 ui/src/components/SettingDrawer/themeColor.js create mode 100644 ui/src/components/StandardFormRow/StandardFormRow.vue create mode 100644 ui/src/components/StandardFormRow/index.js create mode 100644 ui/src/components/Table/README.md create mode 100644 ui/src/components/Table/index.js create mode 100644 ui/src/components/TagSelect/TagSelectOption.jsx create mode 100644 ui/src/components/TagSelect/index.jsx create mode 100644 ui/src/components/Tree/Tree.jsx create mode 100644 ui/src/components/Trend/Trend.vue create mode 100644 ui/src/components/Trend/index.js create mode 100644 ui/src/components/Trend/index.less create mode 100644 ui/src/components/Trend/index.md create mode 100644 ui/src/components/_util/util.js create mode 100644 ui/src/components/global.less create mode 100644 ui/src/components/index.js create mode 100644 ui/src/components/index.less create mode 100644 ui/src/components/tools/Breadcrumb.vue create mode 100644 ui/src/components/tools/DetailList.vue create mode 100644 ui/src/components/tools/HeadInfo.vue create mode 100644 ui/src/components/tools/Logo.vue create mode 100644 ui/src/components/tools/TopMenu.vue create mode 100644 ui/src/components/tools/TwoStepCaptcha.vue create mode 100644 ui/src/components/tools/UserMenu.vue create mode 100644 ui/src/components/tools/index.js create mode 100644 ui/src/config/defaultSettings.js create mode 100644 ui/src/config/router.config.js create mode 100644 ui/src/core/bootstrap.js create mode 100644 ui/src/core/directives/action.js create mode 100644 ui/src/core/icons.js create mode 100644 ui/src/core/lazy_lib/components_use.js create mode 100644 ui/src/core/lazy_use.js create mode 100644 ui/src/core/use.js create mode 100644 ui/src/layouts/BasicLayout.vue create mode 100644 ui/src/layouts/BlankLayout.vue create mode 100644 ui/src/layouts/PageView.vue create mode 100644 ui/src/layouts/RouteView.vue create mode 100644 ui/src/layouts/UserLayout.vue create mode 100644 ui/src/layouts/index.js create mode 100644 ui/src/main.js create mode 100644 ui/src/permission.js create mode 100644 ui/src/router/README.md create mode 100644 ui/src/router/index.js create mode 100644 ui/src/store/getters.js create mode 100644 ui/src/store/index.js create mode 100644 ui/src/store/modules/app.js create mode 100644 ui/src/store/modules/permission.js create mode 100644 ui/src/store/modules/user.js create mode 100644 ui/src/store/mutation-types.js create mode 100644 ui/src/utils/axios.js create mode 100644 ui/src/utils/device.js create mode 100644 ui/src/utils/domUtil.js create mode 100644 ui/src/utils/filter.js create mode 100644 ui/src/utils/helper/permission.js create mode 100644 ui/src/utils/mixin.js create mode 100644 ui/src/utils/permissions.js create mode 100644 ui/src/utils/request.js create mode 100644 ui/src/utils/util.js create mode 100644 ui/src/utils/utils.less create mode 100644 ui/src/views/404.vue create mode 100644 ui/src/views/account/center/Index.vue create mode 100644 ui/src/views/account/center/page/App.vue create mode 100644 ui/src/views/account/center/page/Article.vue create mode 100644 ui/src/views/account/center/page/Project.vue create mode 100644 ui/src/views/account/center/page/index.js create mode 100644 ui/src/views/account/settings/AvatarModal.vue create mode 100644 ui/src/views/account/settings/BaseSetting.vue create mode 100644 ui/src/views/account/settings/Binding.vue create mode 100644 ui/src/views/account/settings/Custom.vue create mode 100644 ui/src/views/account/settings/Index.vue create mode 100644 ui/src/views/account/settings/Notification.vue create mode 100644 ui/src/views/account/settings/Security.vue create mode 100644 ui/src/views/cmdb/ci/index.vue create mode 100644 ui/src/views/cmdb/ci/modules/CiDetail.vue create mode 100644 ui/src/views/cmdb/ci/modules/CreateInstanceForm.vue create mode 100644 ui/src/views/cmdb/ci/modules/EditableCell.vue create mode 100644 ui/src/views/cmdb/ci/modules/SearchForm.vue create mode 100644 ui/src/views/cmdb/preference/index.vue create mode 100644 ui/src/views/cmdb/tree_views/index.vue create mode 100644 ui/src/views/exception/403.vue create mode 100644 ui/src/views/exception/404.vue create mode 100644 ui/src/views/exception/500.vue create mode 100644 ui/src/views/user/Login.vue create mode 100644 ui/src/views/user/Register.vue create mode 100644 ui/src/views/user/RegisterResult.vue create mode 100644 ui/src/views/welcome/index.vue create mode 100644 ui/src/views/welcome/welcome.vue create mode 100644 ui/tests/unit/.eslintrc.js create mode 100644 ui/vue.config.js create mode 100644 ui/webstorm.config.js diff --git a/.gitignore b/.gitignore index a2c0d27..c537c02 100755 --- a/.gitignore +++ b/.gitignore @@ -68,22 +68,12 @@ settings.py *.db # UI -node_modules -dist - -# local env files -.env.local -.env.*.local +ui/node_modules +ui/dist # Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* -yarn.lock +ui/npm-debug.log* +ui/yarn-debug.log* +ui/yarn-error.log* +ui/yarn.lock -# Editor directories and files -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw* diff --git a/ui/.editorconfig b/ui/.editorconfig new file mode 100644 index 0000000..6f77dff --- /dev/null +++ b/ui/.editorconfig @@ -0,0 +1,39 @@ +[*] +charset=utf-8 +end_of_line=lf +insert_final_newline=false +indent_style=space +indent_size=2 + +[{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}] +indent_style=space +indent_size=2 + +[{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}] +indent_style=space +indent_size=2 + +[{.babelrc,.stylelintrc,jest.config,.eslintrc,.prettierrc,*.json,*.jsb3,*.jsb2,*.bowerrc}] +indent_style=space +indent_size=2 + +[*.svg] +indent_style=space +indent_size=2 + +[*.js.map] +indent_style=space +indent_size=2 + +[*.less] +indent_style=space +indent_size=2 + +[*.vue] +indent_style=space +indent_size=2 + +[{.analysis_options,*.yml,*.yaml}] +indent_style=space +indent_size=2 + diff --git a/ui/.env b/ui/.env new file mode 100644 index 0000000..580d9f3 --- /dev/null +++ b/ui/.env @@ -0,0 +1,3 @@ +NODE_ENV=production +VUE_APP_PREVIEW=false +VUE_APP_API_BASE_URL=http://127.0.0.1:5000/api diff --git a/ui/.env.preview b/ui/.env.preview new file mode 100644 index 0000000..60abf39 --- /dev/null +++ b/ui/.env.preview @@ -0,0 +1,3 @@ +NODE_ENV=production +VUE_APP_PREVIEW=true +VUE_APP_API_BASE_URL=http://127.0.0.1:5000/api diff --git a/ui/.prettierrc b/ui/.prettierrc new file mode 100644 index 0000000..cbe842a --- /dev/null +++ b/ui/.prettierrc @@ -0,0 +1,5 @@ +{ + "printWidth": 120, + "semi": false, + "singleQuote": true +} diff --git a/ui/.travis.yml b/ui/.travis.yml new file mode 100644 index 0000000..a08bfcb --- /dev/null +++ b/ui/.travis.yml @@ -0,0 +1,7 @@ +language: node_js +node_js: + - 10.15.0 +cache: yarn +script: + - yarn + - yarn run lint --no-fix && yarn run build diff --git a/ui/LICENSE b/ui/LICENSE new file mode 100644 index 0000000..66eef0b --- /dev/null +++ b/ui/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Anan Yang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/ui/babel.config.js b/ui/babel.config.js new file mode 100644 index 0000000..60d219e --- /dev/null +++ b/ui/babel.config.js @@ -0,0 +1,20 @@ +module.exports = { + presets: [ + '@vue/app', + [ + '@babel/preset-env', + { + 'useBuiltIns': 'entry' + } + ] + ] + // if your use import on Demand, Use this code + // , + // plugins: [ + // [ 'import', { + // 'libraryName': 'ant-design-vue', + // 'libraryDirectory': 'es', + // 'style': true // `style: true` 会加载 less 文件 + // } ] + // ] +} diff --git a/ui/jest.config.js b/ui/jest.config.js new file mode 100644 index 0000000..29fee32 --- /dev/null +++ b/ui/jest.config.js @@ -0,0 +1,23 @@ +module.exports = { + moduleFileExtensions: [ + 'js', + 'jsx', + 'json', + 'vue' + ], + transform: { + '^.+\\.vue$': 'vue-jest', + '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', + '^.+\\.jsx?$': 'babel-jest' + }, + moduleNameMapper: { + '^@/(.*)$': '/src/$1' + }, + snapshotSerializers: [ + 'jest-serializer-vue' + ], + testMatch: [ + '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' + ], + testURL: 'http://localhost/' +} diff --git a/ui/jsconfig.json b/ui/jsconfig.json new file mode 100644 index 0000000..1bd0da4 --- /dev/null +++ b/ui/jsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "es6", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "exclude": ["node_modules", "dist"], + "include": ["src/**/*"] +} diff --git a/ui/package-lock.json b/ui/package-lock.json new file mode 100644 index 0000000..494859c --- /dev/null +++ b/ui/package-lock.json @@ -0,0 +1,19631 @@ +{ + "name": "vue-antd-pro", + "version": "2.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ant-design/colors": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-3.1.0.tgz", + "integrity": "sha512-Td7g1P53sNFyT4Gya6836e70TrhoVZ+HjZs6mpWIHrxl4/VqsjjOyzj/8ktOuw0lCx+BfYu9UO1CiJ0MoYYfhg==", + "dev": true, + "requires": { + "tinycolor2": "^1.4.1" + } + }, + "@antv/adjust": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/@antv/adjust/download/@antv/adjust-0.1.1.tgz", + "integrity": "sha1-4mOrDhoZQaZIhC/Ahs9lp+O3Xpg=", + "requires": { + "@antv/util": "~1.3.1" + } + }, + "@antv/attr": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/@antv/attr/download/@antv/attr-0.1.2.tgz", + "integrity": "sha1-LusSL8qvhRoth0mrx8YFGdP3fjc=", + "requires": { + "@antv/util": "~1.3.1" + } + }, + "@antv/component": { + "version": "0.3.2", + "resolved": "http://registry.npm.taobao.org/@antv/component/download/@antv/component-0.3.2.tgz", + "integrity": "sha1-QYvZYSwHIFYFNMEXr3S1fYUdNco=", + "requires": { + "@antv/attr": "~0.1.2", + "@antv/g": "~3.3.5", + "@antv/util": "~1.3.1", + "wolfy87-eventemitter": "~5.1.0" + } + }, + "@antv/coord": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/@antv/coord/download/@antv/coord-0.1.0.tgz", + "integrity": "sha1-SKgK420HVS+WZX5/gJUifGPwwKk=", + "requires": { + "@antv/util": "~1.3.1" + } + }, + "@antv/data-set": { + "version": "0.10.2", + "resolved": "http://registry.npm.taobao.org/@antv/data-set/download/@antv/data-set-0.10.2.tgz", + "integrity": "sha1-WEqVdOfghThHy2WNUbn3NFoAAy8=", + "requires": { + "@antv/hierarchy": "~0.4.0", + "@antv/util": "~1.3.1", + "d3-array": "~1.2.0", + "d3-composite-projections": "~1.2.0", + "d3-dsv": "~1.0.5", + "d3-geo": "~1.6.4", + "d3-geo-projection": "~2.1.2", + "d3-hexjson": "~1.0.1", + "d3-hierarchy": "~1.1.5", + "d3-sankey": "~0.7.1", + "d3-voronoi": "~1.1.2", + "dagre": "~0.8.2", + "point-at-length": "~1.0.2", + "regression": "~2.0.0", + "simple-statistics": "~6.1.0", + "topojson-client": "~3.0.0", + "wolfy87-eventemitter": "~5.1.0" + } + }, + "@antv/g": { + "version": "3.3.6", + "resolved": "http://registry.npm.taobao.org/@antv/g/download/@antv/g-3.3.6.tgz", + "integrity": "sha1-Ef7Z3cntTloqokS3yKu5gqAD8gE=", + "requires": { + "@antv/gl-matrix": "~2.7.1", + "@antv/util": "~1.3.1", + "d3-ease": "~1.0.3", + "d3-interpolate": "~1.1.5", + "d3-timer": "~1.0.6", + "wolfy87-eventemitter": "~5.1.0" + } + }, + "@antv/g2": { + "version": "3.5.3", + "resolved": "http://registry.npm.taobao.org/@antv/g2/download/@antv/g2-3.5.3.tgz", + "integrity": "sha1-hFFxmqyGBpC2ekCdX7ewaALErKY=", + "requires": { + "@antv/adjust": "~0.1.0", + "@antv/attr": "~0.1.2", + "@antv/component": "~0.3.2", + "@antv/coord": "~0.1.0", + "@antv/g": "~3.3.6", + "@antv/scale": "~0.1.1", + "@antv/util": "~1.3.1", + "venn.js": "~0.2.20", + "wolfy87-eventemitter": "~5.1.0" + } + }, + "@antv/g2-brush": { + "version": "0.0.2", + "resolved": "http://registry.npm.taobao.org/@antv/g2-brush/download/@antv/g2-brush-0.0.2.tgz", + "integrity": "sha1-C2Xz67+CaQICkT0LZ1mrKQD6qEE=" + }, + "@antv/g2-plugin-slider": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/@antv/g2-plugin-slider/download/@antv/g2-plugin-slider-2.1.1.tgz", + "integrity": "sha1-wgxfHPCFvqR4+KsfyEg35FxGoGU=" + }, + "@antv/gl-matrix": { + "version": "2.7.1", + "resolved": "http://registry.npm.taobao.org/@antv/gl-matrix/download/@antv/gl-matrix-2.7.1.tgz", + "integrity": "sha1-rLjjf3qz3wE0WrpDcteUK+QuuhQ=" + }, + "@antv/hierarchy": { + "version": "0.4.0", + "resolved": "http://registry.npm.taobao.org/@antv/hierarchy/download/@antv/hierarchy-0.4.0.tgz", + "integrity": "sha1-cStbRHfuC4uNsXTGgrU1awQRqrY=", + "requires": { + "@antv/util": "~1.3.1" + } + }, + "@antv/scale": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/@antv/scale/download/@antv/scale-0.1.2.tgz", + "integrity": "sha1-vZyzMDPYlEtSw+DkrM/WBUHDwUc=", + "requires": { + "@antv/util": "~1.3.1", + "fecha": "~2.3.3" + } + }, + "@antv/util": { + "version": "1.3.1", + "resolved": "http://registry.npm.taobao.org/@antv/util/download/@antv/util-1.3.1.tgz", + "integrity": "sha1-MKNLIB/5Em7A1YxyyBZqnD5kTM0=", + "requires": { + "@antv/gl-matrix": "^2.7.1" + } + }, + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "http://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.0.0.tgz", + "integrity": "sha1-BuKrGb21NThVWaq7W6WXKUgoAPg=", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/core/download/@babel/core-7.4.3.tgz", + "integrity": "sha1-GY1tOvRWe+OYlVDZfgaN6UUDB08=", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helpers": "^7.4.3", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.11", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.4.0.tgz", + "integrity": "sha1-wjDnlYmuenKf1GMbne1NwiBBgZY=", + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha1-Mj053QtQ4Qx8Bsp9djjmhk2MXDI=", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha1-a2lijf5Ah3mODE7Zjj1Kay+9L18=", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-call-delegate/download/@babel/helper-call-delegate-7.4.0.tgz", + "integrity": "sha1-8wjqvg1E9FEheFOu303qX2/jKU8=", + "requires": { + "@babel/helper-hoist-variables": "^7.4.0", + "@babel/traverse": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz", + "integrity": "sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-split-export-declaration": "^7.4.4" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", + "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true + }, + "@babel/traverse": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", + "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-define-map": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.4.0.tgz", + "integrity": "sha1-y/2MGy8ScI4mLCb2AM0W7Wo7xsk=", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.4.0", + "lodash": "^4.17.11" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha1-U3+hP28WdN90WwwA7I/k6ZaByPY=", + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.1.0.tgz", + "integrity": "sha1-oM6wFoX3M1XUNgwSR/WCv6/I/1M=", + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha1-g1ctQyDipGVyY3NBE8QoaLZOScM=", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.4.0.tgz", + "integrity": "sha1-JbYhOZriKYaTKXMKYgFbvrCm+9Y=", + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha1-jNFLCg33/wDwCefXpDaUX0fHoW8=", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.0.0.tgz", + "integrity": "sha1-lggbcRHkhtpNLNlxrRpP4hbMLj0=", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.4.3.tgz", + "integrity": "sha1-seNXocSeWKRyEaaFOruOKq7+sGQ=", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/template": "^7.2.2", + "@babel/types": "^7.2.2", + "lodash": "^4.17.11" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha1-opIMVwKwc8Fd5REGIAqoytIEl9U=", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha1-u7P77phmHFaQNCN8wDlnupm08lA=" + }, + "@babel/helper-regex": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.4.3.tgz", + "integrity": "sha1-nW5UKL/WOKtTs3rk7IyvBHdJUUc=", + "requires": { + "lodash": "^4.17.11" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha1-Nh2AghtvONp1vT8HheziCojF/n8=", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.4.0.tgz", + "integrity": "sha1-T1attq7c1EnS2pOZwtzwVFRjtkw=", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.1.0.tgz", + "integrity": "sha1-Ze65VMjCRb6qToWdphiPOdceWFw=", + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha1-Vxv9UnAfSSkg1jt/c1Aw6aPhC1U=", + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.2.0.tgz", + "integrity": "sha1-xOABJEV2nigVtVKW6tQ6lYVJ9vo=", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.4.3.tgz", + "integrity": "sha1-ex01Q2NJSzHLmiQXroavMreFOjs=", + "requires": { + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "http://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.0.0.tgz", + "integrity": "sha1-9xDDjI1Fjm3ZogGvtjf8t4HOmeQ=", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.4.3.tgz", + "integrity": "sha1-6zrID2SqEByQfUzlQGNg/nW3iVs=" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha1-somzBmadzkrSCwJSiJoVdoydQX4=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz", + "integrity": "sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz", + "integrity": "sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha1-Vo7MRGxhSK5rJn8CVREwiR4p8xc=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.4.3.tgz", + "integrity": "sha1-vifNQW7O66hBQTBbk8KC9d4ju7Q=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha1-E12B7baKCB5V5W7EhUHs6AZcOPU=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.4.0.tgz", + "integrity": "sha1-IC2R7pd9dg74P09BaygNVovoRiM=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.5.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha1-aeHw2zTG9aDPfiszI78VmnbIy38=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", + "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha1-cr0T9v/h0lk4Ep0qGGsR/WKVFHA=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha1-O3o+czUQxX6CC5FCpleayLDfrS4=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha1-qUAT1u2okI3+akd+f57ahWVuz1w=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha1-mur75Nb/xlY7+Pg3IJFijwB3lVA=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.4.0.tgz", + "integrity": "sha1-I0/j5Fjc6VhlwNFS0lYRmyN4NLA=", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha1-XTzBHo1d3XUqpkyRSNDbbLef0ZA=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.4.0.tgz", + "integrity": "sha1-Fk3zu0Hj3rlUxMoy/6n8qlbTC8s=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.11" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.4.3.tgz", + "integrity": "sha1-rcehE3q0KHpVXUKcxW7N6PQMBiw=", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.4.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha1-g6ffamWIZbHI9kHVEMbzryICFto=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.4.3.tgz", + "integrity": "sha1-GpX1yivy+R7wZI1d44qNRy2kNQ8=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.4.3.tgz", + "integrity": "sha1-/O/xwW0AxT0y2YBEhgb4Es1tAr8=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.3", + "regexpu-core": "^4.5.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.2.0.tgz", + "integrity": "sha1-2VLEkw8xKk2//xjwspFOYMNVMLM=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha1-pjhoKJ5bQAf3BU1GSRr1FDV2YAg=", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.4.3.tgz", + "integrity": "sha1-w2/0DYk/K4NSIColWIJPcM116f4=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.4.3.tgz", + "integrity": "sha1-Ewwn7H+08MujDpWJiUSeXsjSK70=", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha1-aQNT6B+SZ9rU/Yz9d+r6hqulPqE=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha1-+hCqXFiiy2r88sn/qMtNiz1Imi0=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.2.0.tgz", + "integrity": "sha1-gqm85FuVRB9heiQBHcidEtp/TuY=", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.4.3.tgz", + "integrity": "sha1-ORfyYEY6wI+Ilqpb1UQD9uH+0WU=", + "requires": { + "@babel/helper-module-transforms": "^7.4.3", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.4.0.tgz", + "integrity": "sha1-wkleVVKBNXl7yBb11Q+FFpjFhqE=", + "requires": { + "@babel/helper-hoist-variables": "^7.4.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha1-dnjOdRafCHe46yI1U4wHQmjdAa4=", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.4.2", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.4.2.tgz", + "integrity": "sha1-gAORE21svMgHKNvbo8HG5G+GwS4=", + "requires": { + "regexp-tree": "^0.1.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.4.0.tgz", + "integrity": "sha1-Z2WKHZRO21PI1PowBEc6DdeDgVA=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.2.0.tgz", + "integrity": "sha1-s11MEPVrq11lAEfa0PHY6IFLZZg=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.4.3.tgz", + "integrity": "sha1-5f9ikp/fTPk+WLrbXiQwMDADgA0=", + "requires": { + "@babel/helper-call-delegate": "^7.4.0", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha1-A+M/ZT9bJcTrVyyYuUhQVbOJ6QU=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.4.3.tgz", + "integrity": "sha1-Kml6+WiH4rv10wOrAiHROd5ec5w=", + "requires": { + "regenerator-transform": "^0.13.4" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha1-R5Kvh8mYpJNnWX0H/t8CY20uFjQ=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.4.3.tgz", + "integrity": "sha1-TWaRaQ7NyfXLjDqxcKFXbB9VY3E=", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha1-YzOu4vjW7n4oYVRXKYk0o7RhmPA=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha1-MQOpq+IvdCttQG7NPNSbd0kZtAY=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha1-oeRUtZlVYKnB4NU338FQYf0mh+E=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.2.0.tgz", + "integrity": "sha1-2H7QG46qx6kkc/YIyXwIneK6Hls=", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha1-EX0rzsL79ktLWdH5gZiUaC0p8rI=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.4.3.tgz", + "integrity": "sha1-OGhwP8Do9EPdplZUspjfV297hjs=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.3", + "regexpu-core": "^4.5.4" + } + }, + "@babel/polyfill": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/polyfill/download/@babel/polyfill-7.4.3.tgz", + "integrity": "sha1-My3G9XtxgBfDqLN7TuqKpu6sEYc=", + "dev": true, + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.2.tgz", + "integrity": "sha1-MuWcmm+5saSv8JtJMMotRHc0NEc=", + "dev": true + } + } + }, + "@babel/preset-env": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.4.3.tgz", + "integrity": "sha1-5x4W4SPcD79lpSy8vO/QcvvQKIA=", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.4.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.4.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.4.0", + "@babel/plugin-transform-classes": "^7.4.3", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.4.3", + "@babel/plugin-transform-dotall-regex": "^7.4.3", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.3", + "@babel/plugin-transform-function-name": "^7.4.3", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.4.3", + "@babel/plugin-transform-modules-systemjs": "^7.4.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.2", + "@babel/plugin-transform-new-target": "^7.4.0", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.4.3", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.3", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.3", + "@babel/types": "^7.4.0", + "browserslist": "^4.5.2", + "core-js-compat": "^3.0.0", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "@babel/runtime": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.4.3.tgz", + "integrity": "sha1-eYiORSA0IjrZYJGHoK0f4NKtS9w=", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.2.tgz", + "integrity": "sha1-MuWcmm+5saSv8JtJMMotRHc0NEc=", + "dev": true + } + } + }, + "@babel/runtime-corejs2": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.4.5.tgz", + "integrity": "sha512-5yLuwzvIDecKwYMzJtiarky4Fb5643H3Ao5jwX0HrMR5oM5mn2iHH9wSZonxwNK0oAjAFUQAiOd4jT7/9Y2jMQ==", + "dev": true, + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/template/download/@babel/template-7.4.0.tgz", + "integrity": "sha1-EkdOnAd7rlhcXYNalcCwt5DCXIs=", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "http://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.4.3.tgz", + "integrity": "sha1-GgHwePxXXVif8wwPcb88PZzLrYQ=", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "http://registry.npm.taobao.org/@babel/types/download/@babel/types-7.4.0.tgz", + "integrity": "sha1-Zwck930kzObMfYz2RZnVEdFkiUw=", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "@hapi/address": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", + "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==", + "dev": true + }, + "@hapi/hoek": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.4.tgz", + "integrity": "sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A==", + "dev": true + }, + "@hapi/joi": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.0.3.tgz", + "integrity": "sha512-z6CesJ2YBwgVCi+ci8SI8zixoj8bGFn/vZb9MBPbSyoxsS2PnWYjHcyTM17VLK6tx64YVK38SDIh10hJypB+ig==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/hoek": "6.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.0.tgz", + "integrity": "sha512-gZDI/eXOIk8kP2PkUKjWu9RW8GGVd2Hkgjxyr/S7Z+JF+0mr7bAlbw+DkTRxnD580o8Kqxlnba9wvqp5aOHBww==", + "dev": true, + "requires": { + "@hapi/hoek": "6.x.x" + } + }, + "@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "dev": true, + "requires": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@soda/friendly-errors-webpack-plugin": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz", + "integrity": "sha512-cWKrGaFX+rfbMrAxVv56DzhPNqOJPZuNIS2HGMELtgGzb+vsMzyig9mml5gZ/hr2BGtSLV+dP2LUEuAL8aG2mQ==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^2.0.0" + } + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "http://registry.npm.taobao.org/@types/anymatch/download/@types/anymatch-1.3.1.tgz", + "integrity": "sha1-M2utwb7sudrMOL6izzKt9ieoQho=", + "dev": true + }, + "@types/d3-format": { + "version": "1.3.1", + "resolved": "http://registry.npm.taobao.org/@types/d3-format/download/@types/d3-format-1.3.1.tgz", + "integrity": "sha1-Nb+IJkvWvNo5JRFlu4J/Z4ecQ4Q=" + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/loader-utils": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/@types/loader-utils/download/@types/loader-utils-1.1.3.tgz", + "integrity": "sha1-grkWPy6tWWxoqMA+RQ+9bgid9AE=", + "dev": true, + "requires": { + "@types/node": "*", + "@types/webpack": "*" + } + }, + "@types/lodash": { + "version": "4.14.123", + "resolved": "http://registry.npm.taobao.org/@types/lodash/download/@types/lodash-4.14.123.tgz", + "integrity": "sha1-Ob5dIRR4yN072umO51u37+Sr/k0=" + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "11.13.6", + "resolved": "http://registry.npm.taobao.org/@types/node/download/@types/node-11.13.6.tgz", + "integrity": "sha1-N+x1aQgwrLDXTOPGxDyqt4cIHoU=" + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "dev": true + }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/@types/tapable/download/@types/tapable-1.0.4.tgz", + "integrity": "sha1-tP/H3Je0mMlps2CkHu4kf4JhY3A=", + "dev": true + }, + "@types/uglify-js": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/@types/uglify-js/download/@types/uglify-js-3.0.4.tgz", + "integrity": "sha1-lr6uI99vVhhiqDC0KIpJ6GuqwII=", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "@types/webpack": { + "version": "4.4.27", + "resolved": "http://registry.npm.taobao.org/@types/webpack/download/@types/webpack-4.4.27.tgz", + "integrity": "sha1-i7lCkYWXems7nm5hMvVhBmqn58I=", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz", + "integrity": "sha512-6tyf5Cqm4m6v7buITuwS+jHzPlIPxbFzEhXR5JGZpbrvOcp1hiQKckd305/3C7C36wFekNTQSxAtgeM0j0yoUw==", + "dev": true + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.0.0.tgz", + "integrity": "sha512-U+JNwVQSmaLKjO3lzCUC3cNXxprgezV1N+jOdqbP4xWNaqtWUCJnkjTVcgECM18A/AinDKPcUUeoyhU7yxUxXQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-preset-app": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-3.8.0.tgz", + "integrity": "sha512-A2NBzIVdtNq52foc+P+yQ/7rSm2q2oPpn2FJVW4hFgaWVOL+HaOLCjWDEQyEeMbRZvyOVHMuom097u3p2H2Rfw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-decorators": "^7.1.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.4.0", + "@babel/preset-env": "^7.0.0 < 7.4.0", + "@babel/runtime": "^7.0.0", + "@babel/runtime-corejs2": "^7.2.0", + "@vue/babel-preset-jsx": "^1.0.0", + "babel-plugin-dynamic-import-node": "^2.2.0", + "babel-plugin-module-resolver": "3.2.0", + "core-js": "^2.6.5" + }, + "dependencies": { + "@babel/preset-env": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.4.tgz", + "integrity": "sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.3.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.3.4", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.3.4", + "@babel/plugin-transform-classes": "^7.3.4", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.2.0", + "@babel/plugin-transform-dotall-regex": "^7.2.0", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.2.0", + "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "@babel/plugin-transform-modules-systemjs": "^7.3.4", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.3.4", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.2.0", + "browserslist": "^4.3.4", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" + } + } + } + }, + "@vue/babel-preset-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.0.0.tgz", + "integrity": "sha512-5CbDu/QHS+TtQNw5aYAffiMxBBB2Eo9+RJpS8X+6FJbdG5Rvc4TVipEqkrg0pJviWadNg7TEy0Uz4o7VNXeIZw==", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.0.0", + "@vue/babel-sugar-functional-vue": "^1.0.0", + "@vue/babel-sugar-inject-h": "^1.0.0", + "@vue/babel-sugar-v-model": "^1.0.0", + "@vue/babel-sugar-v-on": "^1.0.0" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.0.0.tgz", + "integrity": "sha512-XE/jNaaorTuhWayCz+QClk5AB9OV5HzrwbzEC6sIUY0J60A28ONQKeTwxfidW42egOkqNH/UU6eE3KLfmiDj0Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.0.0.tgz", + "integrity": "sha512-NxWU+DqtbZgfGvd25GPoFMj+rvyQ8ZA1pHj8vIeqRij+vx3sXoKkObjA9ulZunvWw5F6uG9xYy4ytpxab/X+Hg==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.0.0.tgz", + "integrity": "sha512-Pfg2Al0io66P1eO6zUbRIgpyKCU2qTnumiE0lao/wA/uNdb7Dx5Tfd1W6tO5SsByETPnEs8i8+gawRIXX40rFw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.0.0", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.0.0.tgz", + "integrity": "sha512-2aqJaDLKdSSGlxZU+GjFERaSNUaa6DQreV+V/K4W/6Lxj8520/r1lChWEa/zuAoPD2Vhy0D2QrqqO+I0D6CkKw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.0.0", + "camelcase": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@vue/cli-overlay": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.8.0.tgz", + "integrity": "sha512-4hY/+r9OwpMb7BPFnQGKftMC8CrfbV00REEFOij52+L4swQw+m879+5zX3Z0xHfPftw6JyaqJB0rmQ0ILI6Ovw==", + "dev": true + }, + "@vue/cli-plugin-babel": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-3.8.0.tgz", + "integrity": "sha512-VLWvpgDM+HN2FZu1x+r9pisombDTK1k+RPNPeslnwjGjrUXmKNAamXL1ZIsPwsj6k6PpWPN4jetBIMqcBzBu6Q==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "@vue/babel-preset-app": "^3.8.0", + "@vue/cli-shared-utils": "^3.8.0", + "babel-loader": "^8.0.5", + "webpack": ">=4 < 4.29" + }, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "webpack": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz", + "integrity": "sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + } + } + }, + "@vue/cli-plugin-eslint": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-3.8.0.tgz", + "integrity": "sha512-18LDJmjH0DDw9T4+RbrSVk4xkF8t8RDRsEPJLPurno1YVJodIkQ6lqVu82faVgtvPyCoqiaicoTq/iwi1avoLQ==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^3.8.0", + "babel-eslint": "^10.0.1", + "eslint": "^4.19.1", + "eslint-loader": "^2.1.2", + "eslint-plugin-vue": "^4.7.1", + "globby": "^9.2.0", + "webpack": ">=4 < 4.29" + }, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "optional": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "optional": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + } + }, + "eslint-plugin-vue": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-4.7.1.tgz", + "integrity": "sha512-esETKhVMI7Vdli70Wt4bvAwnZBJeM0pxVX9Yb0wWKxdCJc2EADalVYK/q2FzMw8oKN0wPMdqVCKS8kmR89recA==", + "dev": true, + "optional": true, + "requires": { + "vue-eslint-parser": "^2.0.3" + } + }, + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "dev": true, + "optional": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true, + "optional": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true, + "optional": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "optional": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "webpack": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz", + "integrity": "sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true, + "optional": true + } + } + }, + "@vue/cli-plugin-unit-jest": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.8.0.tgz", + "integrity": "sha512-8kvoh6NZYY7FjuqRorqo47VTi62a3u69+oAxqBiIOkc28OGaju/FrL0Vm95vRB8tMkU6EPXKVRtCjPz8R2QeZA==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^3.8.0", + "babel-jest": "^23.6.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "jest": "^23.6.0", + "jest-serializer-vue": "^2.0.2", + "jest-transform-stub": "^2.0.0", + "jest-watch-typeahead": "0.2.1", + "vue-jest": "^3.0.4" + } + }, + "@vue/cli-service": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.8.0.tgz", + "integrity": "sha512-ipJF4RHjyLyLC4oLx+JM1Jk6tiIG0KjCFAqfOscQ44K4CdyS03oFMAUR+SZYy/UXKccMnoeY6Ld4YrGXSytQsg==", + "dev": true, + "requires": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@vue/cli-overlay": "^3.8.0", + "@vue/cli-shared-utils": "^3.8.0", + "@vue/component-compiler-utils": "^2.6.0", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^6.1.1", + "acorn-walk": "^6.1.1", + "address": "^1.0.3", + "autoprefixer": "^9.5.1", + "browserslist": "^4.5.4", + "cache-loader": "^2.0.1", + "case-sensitive-paths-webpack-plugin": "^2.2.0", + "chalk": "^2.4.2", + "cli-highlight": "^2.1.0", + "clipboardy": "^2.0.0", + "cliui": "^5.0.0", + "copy-webpack-plugin": "^4.6.0", + "css-loader": "^1.0.1", + "cssnano": "^4.1.10", + "current-script-polyfill": "^1.0.0", + "debug": "^4.1.1", + "dotenv": "^7.0.0", + "dotenv-expand": "^5.1.0", + "escape-string-regexp": "^1.0.5", + "file-loader": "^3.0.1", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^1.0.2", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.0", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.6.0", + "minimist": "^1.2.0", + "ora": "^3.4.0", + "portfinder": "^1.0.20", + "postcss-loader": "^3.0.0", + "read-pkg": "^5.0.0", + "semver": "^6.0.0", + "slash": "^2.0.0", + "source-map-url": "^0.4.0", + "ssri": "^6.0.1", + "string.prototype.padend": "^3.0.0", + "terser-webpack-plugin": "^1.2.3", + "thread-loader": "^2.1.2", + "url-loader": "^1.1.2", + "vue-loader": "^15.7.0", + "webpack": ">=4 < 4.29", + "webpack-bundle-analyzer": "^3.3.0", + "webpack-chain": "^4.11.0", + "webpack-dev-server": "^3.4.1", + "webpack-merge": "^4.2.1", + "yorkie": "^2.0.0" + }, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.1.1.tgz", + "integrity": "sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^4.0.0", + "type-fest": "^0.4.1" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "webpack": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz", + "integrity": "sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "@vue/cli-shared-utils": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.8.0.tgz", + "integrity": "sha512-wn1L8pmQnotfftHOYm0VeXs2+cQTySd73uhWXwyO6pT0ehjqlY5c2RTipClmFF3Q+YCYjwlNpsV650F3l1tV8w==", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.1", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.7", + "semver": "^6.0.0", + "string.prototype.padstart": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@vue/component-compiler-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.6.0.tgz", + "integrity": "sha512-IHjxt7LsOFYc0DkTncB7OXJL7UzwOLPPQCfEUNyxL2qt+tF12THV+EO33O1G2Uk4feMSWua3iD39Itszx0f0bw==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^5.0.0", + "prettier": "1.16.3", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@vue/eslint-config-standard": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/@vue/eslint-config-standard/download/@vue/eslint-config-standard-4.0.0.tgz", + "integrity": "sha1-a+RH7mdOOw9zPFhAmP2aIubXb80=", + "dev": true, + "requires": { + "eslint-config-standard": "^12.0.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-node": "^8.0.0", + "eslint-plugin-promise": "^4.0.1", + "eslint-plugin-standard": "^4.0.0" + } + }, + "@vue/preload-webpack-plugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.0.tgz", + "integrity": "sha512-rcn2KhSHESBFMPj5vc5X2pI9bcBNQQixvJXhD5gZ4rN2iym/uH2qfDSQfUS5+qwiz0a85TCkeUs6w6jxFDudbw==", + "dev": true + }, + "@vue/test-utils": { + "version": "1.0.0-beta.29", + "resolved": "http://registry.npm.taobao.org/@vue/test-utils/download/@vue/test-utils-1.0.0-beta.29.tgz", + "integrity": "sha1-yULPJeiRzwgbagMzK0rh70MHJvA=", + "dev": true, + "requires": { + "dom-event-types": "^1.0.0", + "lodash": "^4.17.4" + } + }, + "@vue/web-component-wrapper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz", + "integrity": "sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/ast/download/@webassemblyjs/ast-1.8.5.tgz", + "integrity": "sha1-UbHF/mV2o0lTv0slPfnw1JDZ41k=", + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha1-G6kmopI2E+3OSW/VsC6M6KX0lyE=" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.8.5.tgz", + "integrity": "sha1-xJ2tIvZFInxe22EL25aX8aq3Ifc=" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.8.5.tgz", + "integrity": "sha1-/qk+Qphj3V5DOFVfQikjhaZT8gQ=" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.8.5.tgz", + "integrity": "sha1-mnQP9I4/qjAisd/1RCPfmqKTwl4=", + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.8.5.tgz", + "integrity": "sha1-ugt9Oz9+RzPaYFnJMyJ12GBwJFI=" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.8.5.tgz", + "integrity": "sha1-3vS5knsBAdyMu9jR7bW3ucguskU=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha1-U3p1Dt31weky83RCBlUckcG5PmE=" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.8.5.tgz", + "integrity": "sha1-dMpqa8vhnlCjtrRihH5pUD5r/L8=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.8.5.tgz", + "integrity": "sha1-cSMp2+8kDza/V70ve4+5v0FUQh4=", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.8.5.tgz", + "integrity": "sha1-BE7es06mefPgTNT9mCTV41dnrhA=", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.8.5.tgz", + "integrity": "sha1-qL87XY/+mGx8Hjc8y9wqCRXwztw=" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.8.5.tgz", + "integrity": "sha1-li2hKqWswcExyBxCMpkcgs5W4Bo=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.8.5.tgz", + "integrity": "sha1-VIQHZsLBAC62TtGr5yCt7XFPmLw=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.8.5.tgz", + "integrity": "sha1-sk2fa6UDlK8TSfUQr6j/y4pj0mQ=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.8.5.tgz", + "integrity": "sha1-IVdvDsiLkUJzV7hTY4NmjvfGa40=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.8.5.tgz", + "integrity": "sha1-4Q7s1ULQ5705T2gnxJ899tTu+4w=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.8.5.tgz", + "integrity": "sha1-EUu8SB/RDKDiOzVg+oEnSLC65bw=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz", + "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "http://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz", + "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=" + }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "abs-svg-path": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/abs-svg-path/download/abs-svg-path-0.1.1.tgz", + "integrity": "sha1-32Acjo0roQ1KdtYl4japo5wnI78=" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.1.1", + "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-6.1.1.tgz", + "integrity": "sha1-fSWuBbuK0fm2mRCOEJTs14hK3B8=" + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/acorn-dynamic-import/download/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha1-SCIQFAWCo2uDw+NC4c/ryqkkCUg=" + }, + "acorn-globals": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", + "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "optional": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true, + "optional": true + } + } + }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, + "address": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.0.tgz", + "integrity": "sha512-4diPfzWbLEIElVG4AnqP+00SULlPzNuyJFNnmMrLgyaxG6tZXJ1sn7mjBu4fHrJE+Yp/jgylOweJn2xsLMFggQ==", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.10.0.tgz", + "integrity": "sha1-kNDVRDnaWHzX6EO/twRfUL0ivfE=", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/ajv-errors/download/ajv-errors-1.0.1.tgz", + "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=" + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.4.0.tgz", + "integrity": "sha1-S4Mee1MUFafMUYzUBOc/YZPGNJ0=" + }, + "align-text": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz", + "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=" + }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "http://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "http://registry.npm.taobao.org/array-includes/download/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/arrify/download/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "http://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz", + "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "http://registry.npm.taobao.org/asn1.js/download/asn1.js-4.10.1.tgz", + "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "http://registry.npm.taobao.org/assert/download/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "http://registry.npm.taobao.org/util/download/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz", + "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", + "dev": true + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz", + "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=" + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=" + }, + "autoprefixer": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.5.1.tgz", + "integrity": "sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ==", + "dev": true, + "requires": { + "browserslist": "^4.5.4", + "caniuse-lite": "^1.0.30000957", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.14", + "postcss-value-parser": "^3.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz", + "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=", + "dev": true + }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + } + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "js-tokens": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + } + } + }, + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "http://registry.npm.taobao.org/babel-core/download/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha1-laSS3dkPm06aSh2hTrM1uHtjTs4=", + "dev": true + }, + "babel-eslint": { + "version": "10.0.1", + "resolved": "http://registry.npm.taobao.org/babel-eslint/download/babel-eslint-10.0.1.tgz", + "integrity": "sha1-kZaB3AmWFM19MdRciQhpUJKh+u0=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "3.7.1", + "resolved": "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "http://registry.npm.taobao.org/babel-generator/download/babel-generator-6.26.1.tgz", + "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "23.6.0", + "resolved": "http://registry.npm.taobao.org/babel-jest/download/babel-jest-23.6.0.tgz", + "integrity": "sha1-pkQjI2ZVeiJAoMCD2msleGGFovE=", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" + } + }, + "babel-loader": { + "version": "8.0.5", + "resolved": "http://registry.npm.taobao.org/babel-loader/download/babel-loader-8.0.5.tgz", + "integrity": "sha1-IlMi11CcIVdlWEC7pS5GtsLy/jM=", + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "util.promisify": "^1.0.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "http://registry.npm.taobao.org/babel-messages/download/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", + "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-import": { + "version": "1.11.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-import/download/babel-plugin-import-1.11.0.tgz", + "integrity": "sha1-eKyQjmsiUga6u3NOGerl941tEDU=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/runtime": "^7.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "http://registry.npm.taobao.org/babel-plugin-istanbul/download/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha1-NsWbIZLvzoHFs3gyG3QXWt0cmkU=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-jest-hoist/download/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "dev": true + }, + "babel-plugin-module-resolver": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz", + "integrity": "sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA==", + "dev": true, + "requires": { + "find-babel-config": "^1.1.0", + "glob": "^7.1.2", + "pkg-up": "^2.0.0", + "reselect": "^3.0.1", + "resolve": "^1.4.0" + } + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-object-rest-spread/download/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-runtime/download/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-polyfill": { + "version": "6.23.0", + "resolved": "http://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + } + } + }, + "babel-preset-jest": { + "version": "23.2.0", + "resolved": "http://registry.npm.taobao.org/babel-preset-jest/download/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-template/download/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-traverse/download/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "http://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-types/download/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "http://registry.npm.taobao.org/babylon/download/babylon-6.18.0.tgz", + "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=" + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/base64-js/download/base64-js-1.3.0.tgz", + "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bfj": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "hoopy": "^0.1.2", + "tryer": "^1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "http://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "http://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz", + "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=" + }, + "bluebird": { + "version": "3.5.4", + "resolved": "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.4.tgz", + "integrity": "sha1-1sxmFZXeMNWzr1/O3TwLPvbsVxQ=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "http://registry.npm.taobao.org/bn.js/download/bn.js-4.11.8.tgz", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "http://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz", + "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz", + "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz", + "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "http://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.5.5", + "resolved": "http://registry.npm.taobao.org/browserslist/download/browserslist-4.5.5.tgz", + "integrity": "sha1-/ho1IzDSSQ1XNVdMFJqFvBjvm4I=", + "requires": { + "caniuse-lite": "^1.0.30000960", + "electron-to-chromium": "^1.3.124", + "node-releases": "^1.1.14" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "http://registry.npm.taobao.org/buffer/download/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "11.3.2", + "resolved": "http://registry.npm.taobao.org/cacache/download/cacache-11.3.2.tgz", + "integrity": "sha1-LYHjCOPSWMo4Eltna5iyrJzmm/o=", + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-2.0.1.tgz", + "integrity": "sha512-V99T3FOynmGx26Zom+JrVBytLBsmUCzVG2/4NnUKgvXN4bEV42R1ERl1IyiH/cvFIDA1Ytq2lPZ9tXDSahcQpQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.0", + "normalize-path": "^3.0.0", + "schema-utils": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "optional": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true, + "optional": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000962", + "resolved": "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000962.tgz", + "integrity": "sha1-bBDDqzBLib6pBeZq35jAkFCI7kQ=" + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "http://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "http://registry.npm.taobao.org/chardet/download/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "charenc": { + "version": "0.0.2", + "resolved": "http://registry.npm.taobao.org/charenc/download/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + }, + "check-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", + "dev": true + }, + "chokidar": { + "version": "2.1.5", + "resolved": "http://registry.npm.taobao.org/chokidar/download/chokidar-2.1.5.tgz", + "integrity": "sha1-CuhDTZYigaX1bHKGnnnLbZ2GrU0=", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/chownr/download/chownr-1.1.1.tgz", + "integrity": "sha1-VHJri4//TfBTxCGH6AH7RBLfFJQ=" + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.0.tgz", + "integrity": "sha1-Rakb0sIMlBHwljtarrmhuV4JzEg=", + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true, + "optional": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "http://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-highlight": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.1.tgz", + "integrity": "sha512-0y0VlNmdD99GXZHYnvrQcmHxP8Bi6T00qucGgBgGv4kJ0RyDthNnnFPupHV7PYv/OXSVk+azFbOeaW6+vGmx9A==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "highlight.js": "^9.6.0", + "mz": "^2.4.0", + "parse5": "^4.0.0", + "yargs": "^13.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "cli-spinners": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.1.0.tgz", + "integrity": "sha512-8B00fJOEh1HPrx4fo5eW16XmE1PcL1tGpGrxy63CXGP9nHdPBN63X75hA1zhvQuhVztJWLqV58Roj2qlNM7cAA==", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "clipboard": { + "version": "2.0.4", + "resolved": "http://registry.npm.taobao.org/clipboard/download/clipboard-2.0.4.tgz", + "integrity": "sha1-g22v1mzw/qXXHOXVsL9ulYAJES0=", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "clipboardy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.0.0.tgz", + "integrity": "sha512-XbVjHMsss0giNUkp/tV/3eEAZe8i1fZTLzmPKqjE1RGIAWOTiF5D014f6R+g53ZAq0IK3cPrJXFvqE8eQjhFYQ==", + "dev": true, + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.1.tgz", + "integrity": "sha512-PvUltIXRjehRKPSy89VnDWFKY58xyhTLyxIg21vwQBI6qLwZNPmC8k3C1uytIgFKEpOIzN4y32iPm8231zFHIg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.7.tgz", + "integrity": "sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.20.0.tgz", + "integrity": "sha1-1YuytcHuj4ew00ACfp6U4iLFpCI=" + }, + "commondir": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=" + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/console-browserify/download/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/contains-path/download/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "contour_plot": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/contour_plot/download/contour_plot-0.0.1.tgz", + "integrity": "sha1-R1hw8DK44zhBKqX8UHiA8L9JXHc=" + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.6.0.tgz", + "integrity": "sha1-UbU3qMQ+DwTewZk7/83VBOdYrCA=", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", + "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-webpack-plugin": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "core-js": { + "version": "2.6.5", + "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-2.6.5.tgz", + "integrity": "sha1-RLyNJJ5/sv9dAOA0Gn/7lPv2eJU=" + }, + "core-js-compat": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/core-js-compat/download/core-js-compat-3.0.1.tgz", + "integrity": "sha1-v/c7oxyoaHQxuciPeNM2Jkb7dvA=", + "requires": { + "browserslist": "^4.5.4", + "core-js": "3.0.1", + "core-js-pure": "3.0.1", + "semver": "^6.0.0" + }, + "dependencies": { + "core-js": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-3.0.1.tgz", + "integrity": "sha1-E0MYJjQpj384Yi+V5z9U5I3fRzg=" + }, + "semver": { + "version": "6.0.0", + "resolved": "http://registry.npm.taobao.org/semver/download/semver-6.0.0.tgz", + "integrity": "sha1-BeNZ7lceWtftZBpu7B5Ue6Ut6mU=" + } + } + }, + "core-js-pure": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/core-js-pure/download/core-js-pure-3.0.1.tgz", + "integrity": "sha1-NzWPsNAk5rhtRD15T0436UkJjL4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "http://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.3.tgz", + "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz", + "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "http://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz", + "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", + "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "http://registry.npm.taobao.org/crypt/download/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "http://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz", + "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-loader": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/css-loader/download/css-loader-1.0.1.tgz", + "integrity": "sha1-aIW7UjOzXsR7AGBX2gHMZAtref4=", + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash": "^4.17.11", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + } + }, + "css-select": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", + "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^2.1.2", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "http://registry.npm.taobao.org/css-selector-tokenizer/download/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha1-oXcnGovKUBkXL0+JH8bu2cv2jV0=", + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/regexpu-core/download/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/regjsgen/download/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/regjsparser/download/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "css-tree": { + "version": "1.0.0-alpha.28", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", + "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", + "dev": true, + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", + "dev": true + }, + "css-url-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", + "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", + "dev": true + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "cssesc": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/cssesc/download/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.29" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", + "dev": true, + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "cssom": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", + "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "dev": true + }, + "cssstyle": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", + "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "current-script-polyfill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/current-script-polyfill/-/current-script-polyfill-1.0.0.tgz", + "integrity": "sha1-8xz35PPiGLBybnOMqSoC00iO9hU=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "http://registry.npm.taobao.org/cyclist/download/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" + }, + "d3-array": { + "version": "1.2.4", + "resolved": "http://registry.npm.taobao.org/d3-array/download/d3-array-1.2.4.tgz", + "integrity": "sha1-Y1zk1e6nWfb2BYY9vPww7cc39x8=" + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "http://registry.npm.taobao.org/d3-collection/download/d3-collection-1.0.7.tgz", + "integrity": "sha1-NJvSqpl32wcQkcExRNXk8WtbMQ4=" + }, + "d3-color": { + "version": "1.2.3", + "resolved": "http://registry.npm.taobao.org/d3-color/download/d3-color-1.2.3.tgz", + "integrity": "sha1-bGe7KvbfPMjXnvzE06PoPijIBI8=" + }, + "d3-composite-projections": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/d3-composite-projections/download/d3-composite-projections-1.2.0.tgz", + "integrity": "sha1-+g5vFELxfQRkOEOjqIPH2U4MJ8A=", + "requires": { + "d3-geo": "1.2.4", + "d3-path": "^1.0.1" + }, + "dependencies": { + "d3-geo": { + "version": "1.2.4", + "resolved": "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.2.4.tgz", + "integrity": "sha1-0XnzuqduYj7x4Ng2k9twW3xZkAY=", + "requires": { + "d3-array": "1" + } + } + } + }, + "d3-dispatch": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/d3-dispatch/download/d3-dispatch-1.0.5.tgz", + "integrity": "sha1-4lwQoYZRfNbILdGeoBjwfgHjkBU=" + }, + "d3-dsv": { + "version": "1.0.10", + "resolved": "http://registry.npm.taobao.org/d3-dsv/download/d3-dsv-1.0.10.tgz", + "integrity": "sha1-Q3HEiaKmVKKXrKFvyvYFpvMab1E=", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/d3-ease/download/d3-ease-1.0.5.tgz", + "integrity": "sha1-jOWSdtgSQbG3IELWry1A522Tb/s=" + }, + "d3-format": { + "version": "1.3.2", + "resolved": "http://registry.npm.taobao.org/d3-format/download/d3-format-1.3.2.tgz", + "integrity": "sha1-apa14xvLmBIqMIY/fZI2XABgNWI=" + }, + "d3-geo": { + "version": "1.6.4", + "resolved": "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.6.4.tgz", + "integrity": "sha1-8g4eRhyxhF9ai+Vatvh2VCp+MZk=", + "requires": { + "d3-array": "1" + } + }, + "d3-geo-projection": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/d3-geo-projection/download/d3-geo-projection-2.1.2.tgz", + "integrity": "sha1-ffjh6dBG1jHGUJ9+UxNX1K3CSqM=", + "requires": { + "commander": "2", + "d3-array": "1", + "d3-geo": "^1.1.0" + } + }, + "d3-hexjson": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/d3-hexjson/download/d3-hexjson-1.0.1.tgz", + "integrity": "sha1-aiMRHoNZ8eIU9dCvo3nAKytn3ws=", + "requires": { + "d3-array": "1" + } + }, + "d3-hierarchy": { + "version": "1.1.8", + "resolved": "http://registry.npm.taobao.org/d3-hierarchy/download/d3-hierarchy-1.1.8.tgz", + "integrity": "sha1-emMXvT7STjJGQbbx526XiDawCMw=" + }, + "d3-interpolate": { + "version": "1.1.6", + "resolved": "http://registry.npm.taobao.org/d3-interpolate/download/d3-interpolate-1.1.6.tgz", + "integrity": "sha1-LPOVriOBgE3wiqG/dmt/l7X2j7Y=", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.7", + "resolved": "http://registry.npm.taobao.org/d3-path/download/d3-path-1.0.7.tgz", + "integrity": "sha1-jefNaTp1rAtUgNOrrM2UeT5Yqug=" + }, + "d3-sankey": { + "version": "0.7.1", + "resolved": "http://registry.npm.taobao.org/d3-sankey/download/d3-sankey-0.7.1.tgz", + "integrity": "sha1-0imDImj8aaf+yEgD6WwiVqYUxSE=", + "requires": { + "d3-array": "1", + "d3-collection": "1", + "d3-shape": "^1.2.0" + } + }, + "d3-selection": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/d3-selection/download/d3-selection-1.4.0.tgz", + "integrity": "sha1-q5rB5mTPln6/G0ecwH4ozpkIxHQ=" + }, + "d3-shape": { + "version": "1.3.5", + "resolved": "http://registry.npm.taobao.org/d3-shape/download/d3-shape-1.3.5.tgz", + "integrity": "sha1-6BrqWUD1nwp5z8ysASIyqJh8YDM=", + "requires": { + "d3-path": "1" + } + }, + "d3-timer": { + "version": "1.0.9", + "resolved": "http://registry.npm.taobao.org/d3-timer/download/d3-timer-1.0.9.tgz", + "integrity": "sha1-97uMDVl9eS/3Ex4cJKNt1HGkcbo=" + }, + "d3-transition": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/d3-transition/download/d3-transition-1.2.0.tgz", + "integrity": "sha1-9TjA4hsqofBfPpZfhWfoEoSzsrg=", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "http://registry.npm.taobao.org/d3-voronoi/download/d3-voronoi-1.1.4.tgz", + "integrity": "sha1-3Tx412U9K7NZKErkeGRdlZRMgpc=" + }, + "dagre": { + "version": "0.8.4", + "resolved": "http://registry.npm.taobao.org/dagre/download/dagre-0.8.4.tgz", + "integrity": "sha1-Jrn7j3vcYMYRCgRYw3UmGDZ4YGE=", + "requires": { + "graphlib": "^2.1.7", + "lodash": "^4.17.4" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/date-now/download/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=" + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/defined/download/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegate": { + "version": "3.2.0", + "resolved": "http://registry.npm.taobao.org/delegate/download/delegate-3.2.0.tgz", + "integrity": "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/des.js/download/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/detect-indent/download/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "http://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz", + "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "optional": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-event-types": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/dom-event-types/download/dom-event-types-1.0.0.tgz", + "integrity": "sha1-WDCgop4b+Df+UKcM2ApZcjKBPK4=", + "dev": true + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.1.1.tgz", + "integrity": "sha1-HsQFnihLq+027sKUHUqXChic58A=", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz", + "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "http://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz", + "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "http://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz", + "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "http://registry.npm.taobao.org/domutils/download/domutils-1.7.0.tgz", + "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", + "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "downloadjs": { + "version": "1.4.7", + "resolved": "https://registry.npm.taobao.org/downloadjs/download/downloadjs-1.4.7.tgz", + "integrity": "sha1-9p+W+UDg0FU9rCkROYZaPNAQHjw=" + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "http://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", + "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "easy-stack": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.0.tgz", + "integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.124", + "resolved": "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.124.tgz", + "integrity": "sha1-hh/AFIdIoRs+XM69+LeV/1E/oR8=" + }, + "elliptic": { + "version": "6.4.1", + "resolved": "http://registry.npm.taobao.org/elliptic/download/elliptic-6.4.1.tgz", + "integrity": "sha1-wtC3d2kRuGcixjLDwGxg8vgZk5o=", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "http://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "http://registry.npm.taobao.org/encoding/download/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.1.tgz", + "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "http://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.1.0.tgz", + "integrity": "sha1-Qcfgv9/nSsH/4eV61qXGyfN0Kn8=", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "enquire.js": { + "version": "2.1.6", + "resolved": "http://registry.npm.taobao.org/enquire.js/download/enquire.js-2.1.6.tgz", + "integrity": "sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ=" + }, + "entities": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "http://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", + "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", + "dev": true, + "requires": { + "stackframe": "^1.0.4" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "http://registry.npm.taobao.org/es-abstract/download/es-abstract-1.13.0.tgz", + "integrity": "sha1-rIYUX91QmdjdSVWMy6Lq+biOJOk=", + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.0.tgz", + "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "5.16.0", + "resolved": "http://registry.npm.taobao.org/eslint/download/eslint-5.16.0.tgz", + "integrity": "sha1-oeOsGq5KP72Clvz496tzFMu2q+o=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "acorn-jsx": { + "version": "5.0.1", + "resolved": "http://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.0.1.tgz", + "integrity": "sha1-MqBk/ZJUKSFqCbFBECv90YX65A4=", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "http://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz", + "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz", + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "espree": { + "version": "5.0.1", + "resolved": "http://registry.npm.taobao.org/espree/download/espree-5.0.1.tgz", + "integrity": "sha1-XWUm+k/H8HiKXPdbFfMDI+L4H3o=", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "external-editor": { + "version": "3.0.3", + "resolved": "http://registry.npm.taobao.org/external-editor/download/external-editor-3.0.3.tgz", + "integrity": "sha1-WGbbKal4Jtvkvzr9JAcOrZ6kOic=", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz", + "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz", + "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz", + "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", + "dev": true + }, + "import-fresh": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/import-fresh/download/import-fresh-3.0.0.tgz", + "integrity": "sha1-o9iX9CDKsOZxI2iX91vBS0iFw5A=", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "inquirer": { + "version": "6.3.1", + "resolved": "http://registry.npm.taobao.org/inquirer/download/inquirer-6.3.1.tgz", + "integrity": "sha1-ekE7XnlQgRATo9tJHGHR87d26Oc=", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz", + "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz", + "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.2.3", + "resolved": "http://registry.npm.taobao.org/table/download/table-5.2.3.tgz", + "integrity": "sha1-zeDMbrBnUcAJ76sn6Mggyltnt/I=", + "dev": true, + "requires": { + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "write": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/write/download/write-1.0.3.tgz", + "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + } + } + }, + "eslint-config-standard": { + "version": "12.0.0", + "resolved": "http://registry.npm.taobao.org/eslint-config-standard/download/eslint-config-standard-12.0.0.tgz", + "integrity": "sha1-Y4tMZdsL1aQTGflruh8V3a0hB9k=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "http://registry.npm.taobao.org/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha1-WPFfuDm40FdsqYBBNHaqskcttmo=", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-loader": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.2.tgz", + "integrity": "sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg==", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + } + }, + "eslint-module-utils": { + "version": "2.4.0", + "resolved": "http://registry.npm.taobao.org/eslint-module-utils/download/eslint-module-utils-2.4.0.tgz", + "integrity": "sha1-i5NJnpsA6rgMy2YU5p8DZ46E4Jo=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-es": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/eslint-plugin-es/download/eslint-plugin-es-1.4.0.tgz", + "integrity": "sha1-R19luyDJk/wQ6Mj+d9HWAGgHLaY=", + "dev": true, + "requires": { + "eslint-utils": "^1.3.0", + "regexpp": "^2.0.1" + }, + "dependencies": { + "regexpp": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz", + "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=", + "dev": true + } + } + }, + "eslint-plugin-html": { + "version": "5.0.3", + "resolved": "http://registry.npm.taobao.org/eslint-plugin-html/download/eslint-plugin-html-5.0.3.tgz", + "integrity": "sha1-PbEzmV5JpzWW9qRzwWobg2NN7/0=", + "dev": true, + "requires": { + "htmlparser2": "^3.10.0" + } + }, + "eslint-plugin-import": { + "version": "2.17.2", + "resolved": "http://registry.npm.taobao.org/eslint-plugin-import/download/eslint-plugin-import-2.17.2.tgz", + "integrity": "sha1-0ifVxtxn7KcetZDSu2L7ONhun8s=", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "read-pkg-up": "^2.0.0", + "resolve": "^1.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "8.0.1", + "resolved": "http://registry.npm.taobao.org/eslint-plugin-node/download/eslint-plugin-node-8.0.1.tgz", + "integrity": "sha1-Va41YAIoY9FB+noReZUyNApoWWQ=", + "dev": true, + "requires": { + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^5.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.1", + "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-5.1.1.tgz", + "integrity": "sha1-L8a49Riv9I/vZafzSO2FYyRI5KU=", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/eslint-plugin-promise/download/eslint-plugin-promise-4.1.1.tgz", + "integrity": "sha1-HgjLaLWyzYg5+NWGTHlvVtgnRts=", + "dev": true + }, + "eslint-plugin-standard": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/eslint-plugin-standard/download/eslint-plugin-standard-4.0.0.tgz", + "integrity": "sha1-+EW0UQnJnNkOd3lpQKNEVGyPa1w=", + "dev": true + }, + "eslint-plugin-vue": { + "version": "5.2.2", + "resolved": "http://registry.npm.taobao.org/eslint-plugin-vue/download/eslint-plugin-vue-5.2.2.tgz", + "integrity": "sha1-hmAYI7dyG3C8ktVPFyjPwDs2KDw=", + "dev": true, + "requires": { + "vue-eslint-parser": "^5.0.0" + }, + "dependencies": { + "acorn-jsx": { + "version": "5.0.1", + "resolved": "http://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.0.1.tgz", + "integrity": "sha1-MqBk/ZJUKSFqCbFBECv90YX65A4=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "espree": { + "version": "4.1.0", + "resolved": "http://registry.npm.taobao.org/espree/download/espree-4.1.0.tgz", + "integrity": "sha1-co1UUeD9FWwEOEp62J7VH/VOsl8=", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "vue-eslint-parser": { + "version": "5.0.0", + "resolved": "http://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-5.0.0.tgz", + "integrity": "sha1-APTk2pTsl0uCGib/DtD3p4QCuKE=", + "dev": true, + "requires": { + "debug": "^4.1.0", + "eslint-scope": "^4.0.0", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.1.0", + "esquery": "^1.0.1", + "lodash": "^4.17.11" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz", + "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "http://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.3.1.tgz", + "integrity": "sha1-moUbqJ7nxGA0b5fPiTnHKYgn5RI=", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha1-PzGA+y4pEBdxastMnW1bXDSmqB0=", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "optional": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true, + "optional": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/esquery/download/esquery-1.0.1.tgz", + "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/events/download/events-3.0.0.tgz", + "integrity": "sha1-mgoN+vYok9krh1uPJpjKQRSXPog=" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "http://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-2.2.4.tgz", + "integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "expect": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^23.6.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/external-editor/download/external-editor-2.2.0.tgz", + "integrity": "sha1-BFURz9jRM/OEZnPRBHwVTiFK09U=", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=" + } + } + }, + "extract-from-css": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/extract-from-css/-/extract-from-css-0.4.4.tgz", + "integrity": "sha1-HqffLnx8brmSL6COitrqSG9vj5I=", + "dev": true, + "requires": { + "css": "^2.1.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/fastparse/download/fastparse-1.1.2.tgz", + "integrity": "sha1-kXKMWllC7O2FMSg8eUQe5BIsNak=" + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "fecha": { + "version": "2.3.3", + "resolved": "http://registry.npm.taobao.org/fecha/download/fecha-2.3.3.tgz", + "integrity": "sha1-lI50FX3xoy/RsSw6PDzctuydls0=" + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "http://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.1.tgz", + "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=" + }, + "figures": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "optional": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "file-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-babel-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "dev": true, + "requires": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz", + "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "optional": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "flatted": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/flatted/download/flatted-2.0.0.tgz", + "integrity": "sha1-VRIrZTbqSWtLRIk+4mCBQdENmRY=", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz", + "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "fmin": { + "version": "0.0.2", + "resolved": "http://registry.npm.taobao.org/fmin/download/fmin-0.0.2.tgz", + "integrity": "sha1-Wbu0DUP/3ByUzQClaMQflfGXMBc=", + "requires": { + "contour_plot": "^0.0.1", + "json2module": "^0.0.3", + "rollup": "^0.25.8", + "tape": "^4.5.1", + "uglify-js": "^2.6.2" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "for-each": { + "version": "0.3.3", + "resolved": "http://registry.npm.taobao.org/for-each/download/for-each-0.3.3.tgz", + "integrity": "sha1-abRH6IoKXTLD5whPPxcQA0shN24=", + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz", + "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "http://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.8", + "resolved": "http://registry.npm.taobao.org/fsevents/download/fsevents-1.2.8.tgz", + "integrity": "sha1-V+pTIPdizUaW5ejocSDszIsRys8=", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "http://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz", + "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "http://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globals": { + "version": "11.11.0", + "resolved": "http://registry.npm.taobao.org/globals/download/globals-11.11.0.tgz", + "integrity": "sha1-3Pk3V/ot5Uhvvu1xGFOK33ienC4=" + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "http://registry.npm.taobao.org/good-listener/download/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "requires": { + "delegate": "^3.1.2" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz", + "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA=" + }, + "graphlib": { + "version": "2.1.7", + "resolved": "http://registry.npm.taobao.org/graphlib/download/graphlib-2.1.7.tgz", + "integrity": "sha1-tqafn0S9neOWPOaASi/J5z2Grsw=", + "requires": { + "lodash": "^4.17.5" + } + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz", + "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/has/download/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/hash-base/download/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "http://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz", + "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/he/download/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "highlight.js": { + "version": "9.15.8", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.8.tgz", + "integrity": "sha512-RrapkKQWwE+wKdF73VsOa2RQdIoO3mxwJ4P8mhbI6KYJUraUHRKM5w5zQQKXNk0xNL4UVRdulV9SBJcmzJNzVA==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz", + "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + } + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "http://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz", + "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.3.0", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-3.3.0.tgz", + "integrity": "sha1-y4ARqtAC63F78EApH+uoVpyYb7k=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-parser-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/icss-utils/download/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "requires": { + "postcss": "^6.0.1" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "http://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" + }, + "iferr": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "http://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "optional": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "optional": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "http://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz", + "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "http://registry.npm.taobao.org/is-callable/download/is-callable-1.1.4.tgz", + "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=" + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "http://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", + "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "http://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/is-regex/download/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.2.tgz", + "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=", + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "http://registry.npm.taobao.org/istanbul-lib-coverage/download/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha1-zPftzQoLubj3Kf7rCTBHD5r2ZPA=", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "http://registry.npm.taobao.org/istanbul-lib-instrument/download/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha1-H1XtEKw8R/K93dUweTUSZ1TQqco=", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", + "dev": true + }, + "jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", + "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^23.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "jest-cli": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", + "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.4.2", + "jest-config": "^23.6.0", + "jest-environment-jsdom": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve-dependencies": "^23.6.0", + "jest-runner": "^23.6.0", + "jest-runtime": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "jest-watcher": "^23.4.0", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "prompts": "^0.1.9", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^11.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + } + } + }, + "jest-changed-files": { + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", + "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^23.6.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^23.4.0", + "jest-environment-node": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^23.6.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", + "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", + "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", + "jest-docblock": "^23.2.0", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "jest-jasmine2": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", + "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", + "dev": true, + "requires": { + "babel-traverse": "^6.0.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^23.6.0", + "is-generator-fn": "^1.0.0", + "jest-diff": "^23.6.0", + "jest-each": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", + "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", + "dev": true, + "requires": { + "pretty-format": "^23.6.0" + } + }, + "jest-matcher-utils": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", + "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "dev": true + }, + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "dev": true + }, + "jest-resolve": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", + "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", + "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", + "dev": true, + "requires": { + "jest-regex-util": "^23.3.0", + "jest-snapshot": "^23.6.0" + } + }, + "jest-runner": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", + "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-docblock": "^23.2.0", + "jest-haste-map": "^23.6.0", + "jest-jasmine2": "^23.6.0", + "jest-leak-detector": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-runtime": "^23.6.0", + "jest-util": "^23.4.0", + "jest-worker": "^23.2.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "jest-runtime": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", + "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.1.6", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^11.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + } + } + }, + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "dev": true + }, + "jest-serializer-vue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jest-serializer-vue/-/jest-serializer-vue-2.0.2.tgz", + "integrity": "sha1-sjjvKGNX7GtIBCG9RxRQUJh9WbM=", + "dev": true, + "requires": { + "pretty": "2.0.0" + } + }, + "jest-snapshot": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", + "dev": true, + "requires": { + "babel-types": "^6.0.0", + "chalk": "^2.0.1", + "jest-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.6.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.6.0", + "semver": "^5.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-transform-stub": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz", + "integrity": "sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==", + "dev": true + }, + "jest-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^23.4.0", + "mkdirp": "^0.5.1", + "slash": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-watch-typeahead": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.2.1.tgz", + "integrity": "sha512-xdhEtKSj0gmnkDQbPTIHvcMmXNUDzYpHLEJ5TFqlaI+schi2NI96xhWiZk9QoesAS7oBmKwWWsHazTrYl2ORgg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.4.1", + "jest-watcher": "^23.1.0", + "slash": "^2.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "js-beautify": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.0.tgz", + "integrity": "sha512-OMwf/tPDpE/BLlYKqZOhqWsd3/z2N3KOlyn1wsCRGFwViE8LOQTcDtathQvHvZc+q+zWmcNAbwKSC+iJoMaH2Q==", + "dev": true, + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "mkdirp": "~0.5.1", + "nopt": "~4.0.1" + } + }, + "js-cookie": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/js-cookie/download/js-cookie-2.2.0.tgz", + "integrity": "sha1-Gywnmm7s44ChIWi5JIUmWzWx7/s=" + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "http://registry.npm.taobao.org/js-levenshtein/download/js-levenshtein-1.1.6.tgz", + "integrity": "sha1-xs7ljrNVA3LfjeuF+tXOZs4B1Z0=" + }, + "js-message": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.5.tgz", + "integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=", + "dev": true + }, + "js-queue": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.0.tgz", + "integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=", + "dev": true, + "requires": { + "easy-stack": "^1.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.13.1.tgz", + "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz", + "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json2module": { + "version": "0.0.3", + "resolved": "http://registry.npm.taobao.org/json2module/download/json2module-0.0.3.tgz", + "integrity": "sha1-APtfSpt638PwZHwpyxe80Zeb6bI=", + "requires": { + "rw": "^1.3.2" + } + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/json5/download/json5-2.1.0.tgz", + "integrity": "sha1-56DGLEgoXGKNIKELhcibuAfDKFA=", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "dev": true + }, + "launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", + "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "launch-editor-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz", + "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==", + "dev": true, + "requires": { + "launch-editor": "^2.2.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "less": { + "version": "3.9.0", + "resolved": "http://registry.npm.taobao.org/less/download/less-3.9.0.tgz", + "integrity": "sha1-t1EcQ/N89X3Iff/ZiD7BISibFHQ=", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "4.1.0", + "resolved": "http://registry.npm.taobao.org/less-loader/download/less-loader-4.1.0.tgz", + "integrity": "sha1-LBNSxbCaT4QQFJAnT9UWdN5BNj4=", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-fs-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", + "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "http://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz", + "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "http://registry.npm.taobao.org/loader-utils/download/loader-utils-1.2.3.tgz", + "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "http://registry.npm.taobao.org/lodash.get/download/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "http://registry.npm.taobao.org/lodash.pick/download/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "loglevel": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.2.tgz", + "integrity": "sha512-Jt2MHrCNdtIe1W6co3tF5KXGRkzF+TYffiQstfXa04mrss9IKXzAAXYWak8LbZseAQY03sH2GzMCMU0ZOUc9bg==", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "http://registry.npm.taobao.org/mamacro/download/mamacro-0.0.3.tgz", + "integrity": "sha1-rSyVdhl8nxq/MI0Hh4Zb2XWj8+Q=" + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/math-random/download/math-random-1.0.4.tgz", + "integrity": "sha1-XdaUPJOFSCZwFtTjTwV1gwgMUUw=", + "dev": true + }, + "md5": { + "version": "2.2.1", + "resolved": "http://registry.npm.taobao.org/md5/download/md5-2.2.1.tgz", + "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "requires": { + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "http://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz", + "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "http://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "http://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=" + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", + "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.40.0.tgz", + "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.24.tgz", + "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz", + "integrity": "sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "^2.0.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz", + "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "http://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.1.tgz", + "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mockjs2": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/mockjs2/download/mockjs2-1.0.5.tgz", + "integrity": "sha1-voD2cOBGgJKxVFQWlZHpNsO9Kfk=", + "requires": { + "commander": "*" + } + }, + "moment": { + "version": "2.24.0", + "resolved": "http://registry.npm.taobao.org/moment/download/moment-2.24.0.tgz", + "integrity": "sha1-DQVdU/UFKqZTyfbraLtdEr9cK1s=" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.13.2", + "resolved": "http://registry.npm.taobao.org/nan/download/nan-2.13.2.tgz", + "integrity": "sha1-9R3Hrma6fV1V4ebU2AkugCya7+c=", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "http://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=" + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.0", + "resolved": "http://registry.npm.taobao.org/neo-async/download/neo-async-2.6.0.tgz", + "integrity": "sha1-udFeTXHGdikIZUtRg+04t1M0CDU=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz", + "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-cache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.0.tgz", + "integrity": "sha512-obRu6/f7S024ysheAjoYFEEBqqDWv4LOMNJEuO8vMeEw2AT4z+NCzO4hlc2lhI4vATzbCQv6kke9FVdx0RbCOw==", + "dev": true, + "requires": { + "clone": "2.x", + "lodash": "4.x" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + } + } + }, + "node-fetch": { + "version": "1.6.3", + "resolved": "http://registry.npm.taobao.org/node-fetch/download/node-fetch-1.6.3.tgz", + "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-ipc": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.1.tgz", + "integrity": "sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w==", + "dev": true, + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.5", + "js-queue": "2.0.0" + } + }, + "node-libs-browser": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.0.tgz", + "integrity": "sha1-xy9g2dRt4IqUDe27JfP/ovm7qnc=", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-notifier": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node-releases": { + "version": "1.1.15", + "resolved": "http://registry.npm.taobao.org/node-releases/download/node-releases-1.1.15.tgz", + "integrity": "sha1-nnanOw7KO/eAGt2qDmzpDHlfK5o=", + "requires": { + "semver": "^5.3.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/nprogress/download/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", + "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "http://registry.npm.taobao.org/object-inspect/download/object-inspect-1.6.0.tgz", + "integrity": "sha1-xwtsv3LydKq0w0wMgvUWe/gs8Vs=" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "http://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.3.0.tgz", + "integrity": "sha512-6AHdrJxPvAXIowO/aIaeHZ8CeMdDf7qCyRNq8NwJpinmCdXhz+NZR7ie1Too94lpciCDsG+qHGO9Mt0svA4OqA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opencollective": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/opencollective/download/opencollective-1.0.3.tgz", + "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", + "dev": true, + "requires": { + "babel-polyfill": "6.23.0", + "chalk": "1.1.3", + "inquirer": "3.0.6", + "minimist": "1.2.0", + "node-fetch": "1.6.3", + "opn": "4.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "inquirer": { + "version": "3.0.6", + "resolved": "http://registry.npm.taobao.org/inquirer/download/inquirer-3.0.6.tgz", + "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "chalk": "^1.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.1", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx": "^4.1.0", + "string-width": "^2.0.0", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "opn": { + "version": "4.0.2", + "resolved": "http://registry.npm.taobao.org/opn/download/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + } + } + }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/opencollective-postinstall/download/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha1-Vlfxvt5ptuM6RZObBh61PTxsOok=", + "dev": true + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "http://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-2.2.0.tgz", + "integrity": "sha1-QXyZQeYCepq8ulCS3SkE4lW1+8I=", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=" + }, + "pako": { + "version": "1.0.10", + "resolved": "http://registry.npm.taobao.org/pako/download/pako-1.0.10.tgz", + "integrity": "sha1-Qyi621CGpCaqkPVBl31JVdpclzI=" + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", + "dev": true + } + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "http://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.4.tgz", + "integrity": "sha1-N/Zij4I/vesic7TVQENKIvPvH8w=", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-svg-path": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/parse-svg-path/download/parse-svg-path-0.1.2.tgz", + "integrity": "sha1-en7A0esG+lMlx9PgCbhZoJtdSes=" + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "http://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "http://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.0.17.tgz", + "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz", + "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true, + "optional": true + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "point-at-length": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/point-at-length/download/point-at-length-1.0.2.tgz", + "integrity": "sha1-kXbY1tfIFi8Stkb3B9ufDqcoEl4=", + "requires": { + "abs-svg-path": "~0.1.1", + "isarray": "~0.0.1", + "parse-svg-path": "~0.1.1" + } + }, + "portfinder": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.23.tgz", + "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", + "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss": "^7.0.5", + "postcss-selector-parser": "^5.0.0-rc.4", + "postcss-value-parser": "^3.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-load-config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", + "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", + "dev": true, + "requires": { + "cosmiconfig": "^4.0.0", + "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "http://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha1-3IfjQUjsfqtfeR981YSYMzdbdBo=", + "requires": { + "postcss": "^6.0.1" + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + } + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "http://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "prettier": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.3.tgz", + "integrity": "sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==", + "dev": true + }, + "pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=", + "dev": true, + "requires": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "http://registry.npm.taobao.org/private/download/private-0.1.8.tgz", + "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=" + }, + "process": { + "version": "0.11.10", + "resolved": "http://registry.npm.taobao.org/process/download/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz", + "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=" + }, + "progress": { + "version": "2.0.3", + "resolved": "http://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "http://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz", + "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prompts": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "dev": true, + "requires": { + "kleur": "^2.0.1", + "sisteransi": "^0.1.1" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.31", + "resolved": "http://registry.npm.taobao.org/psl/download/psl-1.1.31.tgz", + "integrity": "sha1-6aqG0BAbWxBcvpOsa3hM1UcnYYQ=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "http://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz", + "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "http://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", + "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "quill": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.6.tgz", + "integrity": "sha512-K0mvhimWZN6s+9OQ249CH2IEPZ9JmkFuCQeHAOQax3EZ2nDJ3wfGh59mnlQaZV2i7u8eFarx6wAtvQKgShojug==", + "requires": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.1", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=" + } + } + }, + "quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "requires": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + } + }, + "randomatic": { + "version": "3.1.1", + "resolved": "http://registry.npm.taobao.org/randomatic/download/randomatic-3.1.1.tgz", + "integrity": "sha1-t3bvxZN1mE42xTey9RofCv8Noe0=", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", + "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz", + "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "http://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/regenerate/download/regenerate-1.4.0.tgz", + "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=" + }, + "regenerate-unicode-properties": { + "version": "8.0.2", + "resolved": "http://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.0.2.tgz", + "integrity": "sha1-ezj6opYlI3bTY1WM+9qQyc5wlmI=", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz", + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" + }, + "regenerator-transform": { + "version": "0.13.4", + "resolved": "http://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.13.4.tgz", + "integrity": "sha1-GPZ2PPE4LGnDbfdsbOEizGlChPs=", + "requires": { + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "http://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-tree": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/regexp-tree/download/regexp-tree-0.1.5.tgz", + "integrity": "sha1-fNcfyhcZjQS0F279eXE/KZgAk5c=" + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true, + "optional": true + }, + "regexpu-core": { + "version": "4.5.4", + "resolved": "http://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.5.4.tgz", + "integrity": "sha1-CA2dAiiaqH/hZnpPUTa8mKauuq4=", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "http://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.0.tgz", + "integrity": "sha1-p2NNwI+JIJwgSa3aNSVxH7lyZd0=" + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "http://registry.npm.taobao.org/regjsparser/download/regjsparser-0.6.0.tgz", + "integrity": "sha1-8eaui32iuulsmTmbhozWyTOiupw=", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "regression": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/regression/download/regression-2.0.1.tgz", + "integrity": "sha1-jSnD6CJKEIUMNeM36FqLL6w7DIc=" + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz", + "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "dev": true, + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "optional": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=", + "dev": true + }, + "resolve": { + "version": "1.10.0", + "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.10.0.tgz", + "integrity": "sha1-O9qur0XMB/N1ZW39LlTtCBCxAbo=", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true, + "optional": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "resumer": { + "version": "0.0.0", + "resolved": "http://registry.npm.taobao.org/resumer/download/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "requires": { + "through": "~2.3.4" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "http://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "http://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz", + "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz", + "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "0.25.8", + "resolved": "http://registry.npm.taobao.org/rollup/download/rollup-0.25.8.tgz", + "integrity": "sha1-v2zoO4dRDRY0Ru6qV37WpvxYNeA=", + "requires": { + "chalk": "^1.1.1", + "minimist": "^1.2.0", + "source-map-support": "^0.3.2" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "http://registry.npm.taobao.org/rw/download/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "rx": { + "version": "4.1.0", + "resolved": "http://registry.npm.taobao.org/rx/download/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true, + "optional": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "optional": true, + "requires": { + "rx-lite": "*" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "http://registry.npm.taobao.org/rxjs/download/rxjs-6.4.0.tgz", + "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/select/download/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.7.0.tgz", + "integrity": "sha1-eQp89v6lRZuslhELKbYEEtyP+Ws=" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "http://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.7.0.tgz", + "integrity": "sha1-1uDfsqODKoyURo5usduX5VoZKmU=" + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz", + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "http://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz", + "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-statistics": { + "version": "6.1.1", + "resolved": "http://registry.npm.taobao.org/simple-statistics/download/simple-statistics-6.1.1.tgz", + "integrity": "sha1-46B5n/xJkU1vQhxaSsWF9qE+K60=" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "sisteransi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "optional": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=" + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "requires": { + "kind-of": "^3.2.0" + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sortablejs": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/sortablejs/download/sortablejs-1.9.0.tgz", + "integrity": "sha1-LR50rmusLLStBiKQjzQISJaeuI0=" + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", + "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=" + }, + "source-map": { + "version": "0.1.32", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz", + "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.3.3", + "resolved": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.3.3.tgz", + "integrity": "sha1-NJAJd9W6PwfHdX7nLnO7GptTdU8=", + "requires": { + "source-map": "0.1.32" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.0.tgz", + "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz", + "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.4.tgz", + "integrity": "sha1-dezRqI3owYTvAV6vtRtbSL/RG7E=", + "dev": true + }, + "spdy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "http://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", + "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "http://registry.npm.taobao.org/ssri/download/ssri-6.0.1.tgz", + "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "stackframe": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", + "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz", + "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "http://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz", + "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "http://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz", + "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string.prototype.padstart": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz", + "integrity": "sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string.prototype.trim": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/string.prototype.trim/download/string.prototype.trim-1.1.2.tgz", + "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.0", + "function-bind": "^1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "0.23.1", + "resolved": "http://registry.npm.taobao.org/style-loader/download/style-loader-0.23.1.tgz", + "integrity": "sha1-y5FUYG8+dxq2xKtjcCahBJF02SU=", + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", + "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.28", + "css-url-regex": "^1.1.0", + "csso": "^3.5.1", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "optional": true, + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true, + "optional": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true, + "optional": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true, + "optional": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz", + "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=" + }, + "tape": { + "version": "4.10.1", + "resolved": "http://registry.npm.taobao.org/tape/download/tape-4.10.1.tgz", + "integrity": "sha1-9zvmCIjcsSDwi1f5R69lqClQal8=", + "requires": { + "deep-equal": "~1.0.1", + "defined": "~1.0.0", + "for-each": "~0.3.3", + "function-bind": "~1.1.1", + "glob": "~7.1.3", + "has": "~1.0.3", + "inherits": "~2.0.3", + "minimist": "~1.2.0", + "object-inspect": "~1.6.0", + "resolve": "~1.10.0", + "resumer": "~0.0.0", + "string.prototype.trim": "~1.1.2", + "through": "~2.3.8" + } + }, + "terser": { + "version": "3.17.0", + "resolved": "http://registry.npm.taobao.org/terser/download/terser-3.17.0.tgz", + "integrity": "sha1-+I/77aDetWN/nSSw2mb04VqxDLI=", + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.12.tgz", + "integrity": "sha1-tPOxDVGFelrwE4086AA7IBYT1Zk=", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "1.2.3", + "resolved": "http://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-1.2.3.tgz", + "integrity": "sha1-P5i8kC+sPl0N5zCGn1BmhWEmLsg=", + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.16.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "http://registry.npm.taobao.org/test-exclude/download/test-exclude-4.2.3.tgz", + "integrity": "sha1-qaXmRHTkOYM5JFoKdprXwvSpfCA=", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "http://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thread-loader": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.2.tgz", + "integrity": "sha512-7xpuc9Ifg6WU+QYw/8uUqNdRwMD+N5gjwHKMqETrs96Qn+7BHwECpt2Brzr4HFlf4IAkZsayNhmGdbkBsTJ//w==", + "dev": true, + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "http://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.10.tgz", + "integrity": "sha1-HSjj0qrfHVpZlsTp+VYBzQU0gK4=", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz", + "integrity": "sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=" + }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "http://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "topojson-client": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/topojson-client/download/topojson-client-3.0.0.tgz", + "integrity": "sha1-H5kpOnfvQqRI0DKoGqmCtz82DS8=", + "requires": { + "commander": "2" + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz", + "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "requires": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "http://registry.npm.taobao.org/tslib/download/tslib-1.9.3.tgz", + "integrity": "sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY=" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "http://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha1-JhmADEyCWADv3YNDr33Zkzy+KBg=" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw=", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha1-W0tCbgjROoA2Xg1lesemwexGonc=" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha1-qcxsx85joKMCP8meNBuUQx1AWlc=" + }, + "union-value": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.1.tgz", + "integrity": "sha1-Xp7cbRzo+yZNsYpQfvm9hURFHKY=", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/upath/download/upath-1.1.2.tgz", + "integrity": "sha1-PbZYYA7a7sy+bbXmhNZ+6MKs0Gg=" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "http://registry.npm.taobao.org/url/download/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "http://registry.npm.taobao.org/use/download/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=" + }, + "util": { + "version": "0.11.1", + "resolved": "http://registry.npm.taobao.org/util/download/util-0.11.1.tgz", + "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz", + "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz", + "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", + "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==", + "dev": true + }, + "venn.js": { + "version": "0.2.20", + "resolved": "http://registry.npm.taobao.org/venn.js/download/venn.js-0.2.20.tgz", + "integrity": "sha1-Pw5QzHXLofWGkqijL2e9eq8apvo=", + "requires": { + "d3-selection": "^1.0.2", + "d3-transition": "^1.0.1", + "fmin": "0.0.2" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "viser": { + "version": "2.4.5", + "resolved": "http://registry.npm.taobao.org/viser/download/viser-2.4.5.tgz", + "integrity": "sha1-eB9O8p/ciJMYnuiPdFCAvmqnfOw=", + "requires": { + "@antv/g2": "^3.4.0", + "@antv/g2-brush": "^0.0.2", + "@antv/g2-plugin-slider": "^2.1.0", + "@types/d3-format": "*", + "@types/lodash": "*", + "@types/node": "^8.0.53", + "d3-format": "^1.3.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "@types/node": { + "version": "8.10.46", + "resolved": "http://registry.npm.taobao.org/@types/node/download/@types/node-8.10.46.tgz", + "integrity": "sha1-EhYdtIp3Xoxpwc//K+VFYQOBBW8=" + } + } + }, + "viser-vue": { + "version": "2.4.5", + "resolved": "http://registry.npm.taobao.org/viser-vue/download/viser-vue-2.4.5.tgz", + "integrity": "sha1-dzGLsyETxcEIaMhcecu7/0oW05Q=", + "requires": { + "@types/node": "*", + "viser": "^2.0.0", + "vue": "^2.5.3" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "http://registry.npm.taobao.org/vm-browserify/download/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "0.0.1" + } + }, + "vue": { + "version": "2.6.10", + "resolved": "http://registry.npm.taobao.org/vue/download/vue-2.6.10.tgz", + "integrity": "sha1-pysaQqTYKnIepDjRtr9V5mGVxjc=" + }, + "vue-clipboard2": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/vue-clipboard2/download/vue-clipboard2-0.2.1.tgz", + "integrity": "sha1-nwZpCvHJiu80S+H8S+sAzcUwfuE=", + "requires": { + "clipboard": "^2.0.0" + } + }, + "vue-cropper": { + "version": "0.4.4", + "resolved": "http://registry.npm.taobao.org/vue-cropper/download/vue-cropper-0.4.4.tgz", + "integrity": "sha1-Y8hbpcf52XeTcJMMhSK2HesXfJc=", + "requires": { + "@babel/core": "^7.1.2", + "@babel/plugin-transform-runtime": "^7.1.0", + "@babel/preset-env": "^7.1.0", + "babel-loader": "^8.0.0-beta.0", + "babel-plugin-transform-runtime": "^6.23.0", + "babel-runtime": "^6.26.0", + "css-loader": "^1.0.0", + "style-loader": "^0.23.1", + "vue": "^2.5.17", + "vue-template-compiler": "^2.5.17", + "webpack": "^4.20.2" + } + }, + "vue-eslint-parser": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz", + "integrity": "sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.2", + "esquery": "^1.0.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "dev": true, + "optional": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "vue-hot-reload-api": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz", + "integrity": "sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g==", + "dev": true + }, + "vue-jest": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-3.0.4.tgz", + "integrity": "sha512-PY9Rwt4OyaVlA+KDJJ0614CbEvNOkffDI9g9moLQC/2DDoo0YrqZm7dHi13Q10uoK5Nt5WCYFdeAheOExPah0w==", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "chalk": "^2.1.0", + "extract-from-css": "^0.4.4", + "find-babel-config": "^1.1.0", + "js-beautify": "^1.6.14", + "node-cache": "^4.1.1", + "object-assign": "^4.1.1", + "source-map": "^0.5.6", + "tsconfig": "^7.0.0", + "vue-template-es2015-compiler": "^1.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "vue-json-excel": { + "version": "0.2.98", + "resolved": "https://registry.npm.taobao.org/vue-json-excel/download/vue-json-excel-0.2.98.tgz", + "integrity": "sha1-HYgv2X+L18qhhkAU42gLLd0OlLw=", + "requires": { + "downloadjs": "^1.4.7" + } + }, + "vue-loader": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.0.tgz", + "integrity": "sha512-x+NZ4RIthQOxcFclEcs8sXGEWqnZHodL2J9Vq+hUz+TDZzBaDIh1j3d9M2IUlTjtrHTZy4uMuRdTi8BGws7jLA==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^2.5.1", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + } + }, + "vue-ls": { + "version": "3.2.1", + "resolved": "http://registry.npm.taobao.org/vue-ls/download/vue-ls-3.2.1.tgz", + "integrity": "sha1-JdHHWzpRwXAYEp3mB7RLsSCjOFo=" + }, + "vue-quill-editor": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz", + "integrity": "sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ==", + "requires": { + "object-assign": "^4.1.1", + "quill": "^1.3.4" + } + }, + "vue-router": { + "version": "3.0.6", + "resolved": "http://registry.npm.taobao.org/vue-router/download/vue-router-3.0.6.tgz", + "integrity": "sha1-Lk8PnLsLltAgWrJpDP5YiTUTasM=" + }, + "vue-style-loader": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", + "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "vue-svg-component-builder": { + "version": "2.0.3", + "resolved": "http://registry.npm.taobao.org/vue-svg-component-builder/download/vue-svg-component-builder-2.0.3.tgz", + "integrity": "sha1-xOChkHNYeriC/W9yu3s7Y7Q5aAE=", + "dev": true + }, + "vue-svg-component-runtime": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/vue-svg-component-runtime/download/vue-svg-component-runtime-1.0.1.tgz", + "integrity": "sha1-xMJBzfkv6tdC7zMTO5l/9C2LnuY=" + }, + "vue-svg-icon-loader": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/vue-svg-icon-loader/download/vue-svg-icon-loader-2.1.1.tgz", + "integrity": "sha1-e5mcywZHzjs5A7+/U1/iR+EbAyo=", + "dev": true, + "requires": { + "@types/loader-utils": "1.1.3", + "@types/node": "8.9", + "loader-utils": "1.1.0", + "vue-svg-component-builder": "2.0.3" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "http://registry.npm.taobao.org/@types/node/download/@types/node-8.9.5.tgz", + "integrity": "sha1-FiuGS8cL4Hfm2yErMidUkXkp6XY=", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "http://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/loader-utils/download/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "vue-template-compiler": { + "version": "2.6.10", + "resolved": "http://registry.npm.taobao.org/vue-template-compiler/download/vue-template-compiler-2.6.10.tgz", + "integrity": "sha1-MjtPNJXwT6o1AzN6gvXWUHeZycw=", + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "vuedraggable": { + "version": "2.23.0", + "resolved": "https://registry.npm.taobao.org/vuedraggable/download/vuedraggable-2.23.0.tgz", + "integrity": "sha1-H0paYBZ1pdvw2W7mGuv/+kNEUmI=", + "requires": { + "sortablejs": "^1.9.0" + } + }, + "vuex": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/vuex/download/vuex-3.1.0.tgz", + "integrity": "sha1-Y0uBUVzwz+l2vR/+lgF1XlH4Q7k=" + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "wangeditor": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/wangeditor/-/wangeditor-3.1.1.tgz", + "integrity": "sha1-+9PB1JdpI8nt67hbKdMLNVEq0Dk=" + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "http://registry.npm.taobao.org/watchpack/download/watchpack-1.6.0.tgz", + "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=", + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "4.30.0", + "resolved": "http://registry.npm.taobao.org/webpack/download/webpack-4.30.0.tgz", + "integrity": "sha1-rKdu91YwoixJ/MI1s5tMV1kdM6k=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + }, + "webpack-bundle-analyzer": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz", + "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.10", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "webpack-chain": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz", + "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^1.6.0" + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.4.1.tgz", + "integrity": "sha512-CRqZQX2ryMtrg0r3TXQPpNh76eM1HD3Wmu6zDBxIKi/d2y+4aa28Ia8weNT0bfgWpY6Vs3Oq/K8+DjfbR+tWYw==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.0", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "killable": "^1.0.1", + "loglevel": "^1.6.1", + "opn": "^5.5.0", + "portfinder": "^1.0.20", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.0.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.3.0.tgz", + "integrity": "sha1-KijcufH0X+lg2PFJMlK17mUw+oU=", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "webpack-theme-color-replacer": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/webpack-theme-color-replacer/-/webpack-theme-color-replacer-1.2.15.tgz", + "integrity": "sha512-tht5fk6ce6ZwXqPbvkLBJMS+iAM3H60pyexKvZHEbkHpQ1Onq2Y0u6+wUbNBQ/QfDEvCTX5MSkNfD2w/ZJEeKg==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wolfy87-eventemitter": { + "version": "5.1.0", + "resolved": "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.1.0.tgz", + "integrity": "sha1-NcGsDdGsDBXjXZgVCPwiCEoToBE=" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "http://registry.npm.taobao.org/worker-farm/download/worker-farm-1.6.0.tgz", + "integrity": "sha1-rsxAWXb6talVJhgIRvDboojzpKA=", + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "optional": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=" + }, + "yallist": { + "version": "3.0.3", + "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-3.0.3.tgz", + "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", + "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", + "dev": true, + "requires": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + } + } +} diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000..6b9bd41 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,144 @@ +{ + "name": "vue-antd-pro", + "version": "2.0.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "build:preview": "vue-cli-service build --mode preview", + "lint": "vue-cli-service lint", + "lint:nofix": "vue-cli-service lint --no-fix", + "test:unit": "vue-cli-service test:unit", + "postinstall": "opencollective-postinstall" + }, + "dependencies": { + "@antv/data-set": "^0.10.1", + "@handsontable-pro/vue": "^3.1.1", + "@handsontable/vue": "^4.1.0", + "ant-design-vue": "^1.3.15", + "axios": "^0.19.0", + "core-js": "^2.6.5", + "enquire.js": "^2.1.6", + "handsontable": "^7.1.1", + "handsontable-pro": "^6.2.3", + "js-cookie": "^2.2.0", + "json2csv": "^4.5.2", + "lodash.get": "^4.4.2", + "lodash.pick": "^4.4.0", + "md5": "^2.2.1", + "moment": "^2.24.0", + "nprogress": "^0.2.0", + "viser-vue": "^2.3.3", + "vue": "^2.6.10", + "vue-clipboard2": "^0.2.1", + "vue-cropper": "0.4.4", + "vue-json-excel": "^0.2.98", + "vue-ls": "^3.2.0", + "vue-quill-editor": "^3.0.6", + "vue-router": "^3.0.1", + "vue-svg-component-runtime": "^1.0.1", + "vuedraggable": "^2.23.0", + "vuex": "^3.1.0", + "wangeditor": "^3.1.1", + "xlsx": "latest" + }, + "devDependencies": { + "@ant-design/colors": "^3.1.0", + "@babel/polyfill": "^7.2.5", + "@vue/cli-plugin-babel": "^3.7.0", + "@vue/cli-plugin-eslint": "^3.7.0", + "@vue/cli-plugin-unit-jest": "^3.7.0", + "@vue/cli-service": "^3.7.0", + "@vue/eslint-config-standard": "^4.0.0", + "@vue/test-utils": "^1.0.0-beta.20", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "^10.0.1", + "babel-jest": "^23.6.0", + "babel-plugin-import": "^1.11.0", + "eslint": "^5.8.0", + "eslint-plugin-html": "^5.0.0", + "eslint-plugin-vue": "^5.0.0", + "less": "^3.8.1", + "less-loader": "^4.1.0", + "opencollective": "^1.0.3", + "opencollective-postinstall": "^2.0.2", + "vue-svg-icon-loader": "^2.1.1", + "vue-template-compiler": "^2.6.7", + "webpack-theme-color-replacer": "^1.2.15" + }, + "eslintConfig": { + "root": true, + "env": { + "node": true + }, + "extends": [ + "plugin:vue/strongly-recommended", + "@vue/standard" + ], + "parserOptions": { + "parser": "babel-eslint" + }, + "rules": { + "generator-star-spacing": "off", + "no-mixed-operators": 0, + "vue/max-attributes-per-line": [ + 2, + { + "singleline": 5, + "multiline": { + "max": 1, + "allowFirstLine": false + } + } + ], + "vue/attribute-hyphenation": 0, + "vue/html-self-closing": 0, + "vue/component-name-in-template-casing": 0, + "vue/html-closing-bracket-spacing": 0, + "vue/singleline-html-element-content-newline": 0, + "vue/no-unused-components": 0, + "vue/multiline-html-element-content-newline": 0, + "vue/no-use-v-if-with-v-for": 0, + "vue/html-closing-bracket-newline": 0, + "vue/no-parsing-error": 0, + "no-console": 0, + "no-tabs": 0, + "quotes": [ + 2, + "single", + { + "avoidEscape": true, + "allowTemplateLiterals": true + } + ], + "semi": [ + 2, + "never", + { + "beforeStatementContinuationChars": "never" + } + ], + "no-delete-var": 2, + "prefer-const": [ + 2, + { + "ignoreReadBeforeAssign": false + } + ] + } + }, + "postcss": { + "plugins": { + "autoprefixer": {} + } + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 10" + ], + "collective": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design-pro-vue" + } +} diff --git a/ui/public/cmdb01.jpeg b/ui/public/cmdb01.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e939125f348ec3a3e4f5f049831411b7d5c7ba54 GIT binary patch literal 118206 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 AtpET3 literal 0 HcmV?d00001 diff --git a/ui/public/color.less b/ui/public/color.less new file mode 100644 index 0000000..c7e6b1b --- /dev/null +++ b/ui/public/color.less @@ -0,0 +1,7684 @@ +@primary-color: #1890ff; +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable */ +.bezierEasingMixin() { + @functions: ~`(function() { + var NEWTON_ITERATIONS = 4; + var NEWTON_MIN_SLOPE = 0.001; + var SUBDIVISION_PRECISION = 0.0000001; + var SUBDIVISION_MAX_ITERATIONS = 10; + + var kSplineTableSize = 11; + var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0); + + var float32ArraySupported = typeof Float32Array === 'function'; + + function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; } + function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; } + function C (aA1) { return 3.0 * aA1; } + + // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. + function calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; } + + // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. + function getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); } + + function binarySubdivide (aX, aA, aB, mX1, mX2) { + var currentX, currentT, i = 0; + do { + currentT = aA + (aB - aA) / 2.0; + currentX = calcBezier(currentT, mX1, mX2) - aX; + if (currentX > 0.0) { + aB = currentT; + } else { + aA = currentT; + } + } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS); + return currentT; + } + + function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) { + for (var i = 0; i < NEWTON_ITERATIONS; ++i) { + var currentSlope = getSlope(aGuessT, mX1, mX2); + if (currentSlope === 0.0) { + return aGuessT; + } + var currentX = calcBezier(aGuessT, mX1, mX2) - aX; + aGuessT -= currentX / currentSlope; + } + return aGuessT; + } + + var BezierEasing = function (mX1, mY1, mX2, mY2) { + if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) { + throw new Error('bezier x values must be in [0, 1] range'); + } + + // Precompute samples table + var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize); + if (mX1 !== mY1 || mX2 !== mY2) { + for (var i = 0; i < kSplineTableSize; ++i) { + sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2); + } + } + + function getTForX (aX) { + var intervalStart = 0.0; + var currentSample = 1; + var lastSample = kSplineTableSize - 1; + + for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) { + intervalStart += kSampleStepSize; + } + --currentSample; + + // Interpolate to provide an initial guess for t + var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]); + var guessForT = intervalStart + dist * kSampleStepSize; + + var initialSlope = getSlope(guessForT, mX1, mX2); + if (initialSlope >= NEWTON_MIN_SLOPE) { + return newtonRaphsonIterate(aX, guessForT, mX1, mX2); + } else if (initialSlope === 0.0) { + return guessForT; + } else { + return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2); + } + } + + return function BezierEasing (x) { + if (mX1 === mY1 && mX2 === mY2) { + return x; // linear + } + // Because JavaScript number are imprecise, we should guarantee the extremes are right. + if (x === 0) { + return 0; + } + if (x === 1) { + return 1; + } + return calcBezier(getTForX(x), mY1, mY2); + }; + }; + + this.colorEasing = BezierEasing(0.26, 0.09, 0.37, 0.18); + // less 3 requires a return + return ''; +})()`; +} +// It is hacky way to make this function will be compiled preferentially by less +// resolve error: `ReferenceError: colorPalette is not defined` +// https://github.com/ant-design/ant-motion/issues/44 +.bezierEasingMixin(); + +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.tinyColorMixin() { + @functions: ~`(function() { +// TinyColor v1.4.1 +// https://github.com/bgrins/TinyColor +// 2016-07-07, Brian Grinstead, MIT License +var trimLeft = /^\s+/, + trimRight = /\s+$/, + tinyCounter = 0, + mathRound = Math.round, + mathMin = Math.min, + mathMax = Math.max, + mathRandom = Math.random; + +function tinycolor (color, opts) { + + color = (color) ? color : ''; + opts = opts || { }; + + // If input is already a tinycolor, return itself + if (color instanceof tinycolor) { + return color; + } + // If we are called as a function, call using new instead + if (!(this instanceof tinycolor)) { + return new tinycolor(color, opts); + } + + var rgb = inputToRGB(color); + this._originalInput = color, + this._r = rgb.r, + this._g = rgb.g, + this._b = rgb.b, + this._a = rgb.a, + this._roundA = mathRound(100*this._a) / 100, + this._format = opts.format || rgb.format; + this._gradientType = opts.gradientType; + + // Don't let the range of [0,255] come back in [0,1]. + // Potentially lose a little bit of precision here, but will fix issues where + // .5 gets interpreted as half of the total, instead of half of 1 + // If it was supposed to be 128, this was already taken care of by inputToRgb + if (this._r < 1) { this._r = mathRound(this._r); } + if (this._g < 1) { this._g = mathRound(this._g); } + if (this._b < 1) { this._b = mathRound(this._b); } + + this._ok = rgb.ok; + this._tc_id = tinyCounter++; +} + +tinycolor.prototype = { + isDark: function() { + return this.getBrightness() < 128; + }, + isLight: function() { + return !this.isDark(); + }, + isValid: function() { + return this._ok; + }, + getOriginalInput: function() { + return this._originalInput; + }, + getFormat: function() { + return this._format; + }, + getAlpha: function() { + return this._a; + }, + getBrightness: function() { + //http://www.w3.org/TR/AERT#color-contrast + var rgb = this.toRgb(); + return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000; + }, + getLuminance: function() { + //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef + var rgb = this.toRgb(); + var RsRGB, GsRGB, BsRGB, R, G, B; + RsRGB = rgb.r/255; + GsRGB = rgb.g/255; + BsRGB = rgb.b/255; + + if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);} + if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);} + if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);} + return (0.2126 * R) + (0.7152 * G) + (0.0722 * B); + }, + setAlpha: function(value) { + this._a = boundAlpha(value); + this._roundA = mathRound(100*this._a) / 100; + return this; + }, + toHsv: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a }; + }, + toHsvString: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); + return (this._a == 1) ? + "hsv(" + h + ", " + s + "%, " + v + "%)" : + "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")"; + }, + toHsl: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a }; + }, + toHslString: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); + return (this._a == 1) ? + "hsl(" + h + ", " + s + "%, " + l + "%)" : + "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")"; + }, + toHex: function(allow3Char) { + return rgbToHex(this._r, this._g, this._b, allow3Char); + }, + toHexString: function(allow3Char) { + return '#' + this.toHex(allow3Char); + }, + toHex8: function(allow4Char) { + return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char); + }, + toHex8String: function(allow4Char) { + return '#' + this.toHex8(allow4Char); + }, + toRgb: function() { + return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a }; + }, + toRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" : + "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")"; + }, + toPercentageRgb: function() { + return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a }; + }, + toPercentageRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" : + "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")"; + }, + toName: function() { + if (this._a === 0) { + return "transparent"; + } + + if (this._a < 1) { + return false; + } + + return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false; + }, + toFilter: function(secondColor) { + var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a); + var secondHex8String = hex8String; + var gradientType = this._gradientType ? "GradientType = 1, " : ""; + + if (secondColor) { + var s = tinycolor(secondColor); + secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a); + } + + return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; + }, + toString: function(format) { + var formatSet = !!format; + format = format || this._format; + + var formattedString = false; + var hasAlpha = this._a < 1 && this._a >= 0; + var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name"); + + if (needsAlphaFormat) { + // Special case for "transparent", all other non-alpha formats + // will return rgba when there is transparency. + if (format === "name" && this._a === 0) { + return this.toName(); + } + return this.toRgbString(); + } + if (format === "rgb") { + formattedString = this.toRgbString(); + } + if (format === "prgb") { + formattedString = this.toPercentageRgbString(); + } + if (format === "hex" || format === "hex6") { + formattedString = this.toHexString(); + } + if (format === "hex3") { + formattedString = this.toHexString(true); + } + if (format === "hex4") { + formattedString = this.toHex8String(true); + } + if (format === "hex8") { + formattedString = this.toHex8String(); + } + if (format === "name") { + formattedString = this.toName(); + } + if (format === "hsl") { + formattedString = this.toHslString(); + } + if (format === "hsv") { + formattedString = this.toHsvString(); + } + + return formattedString || this.toHexString(); + }, + clone: function() { + return tinycolor(this.toString()); + }, + + _applyModification: function(fn, args) { + var color = fn.apply(null, [this].concat([].slice.call(args))); + this._r = color._r; + this._g = color._g; + this._b = color._b; + this.setAlpha(color._a); + return this; + }, + lighten: function() { + return this._applyModification(lighten, arguments); + }, + brighten: function() { + return this._applyModification(brighten, arguments); + }, + darken: function() { + return this._applyModification(darken, arguments); + }, + desaturate: function() { + return this._applyModification(desaturate, arguments); + }, + saturate: function() { + return this._applyModification(saturate, arguments); + }, + greyscale: function() { + return this._applyModification(greyscale, arguments); + }, + spin: function() { + return this._applyModification(spin, arguments); + }, + + _applyCombination: function(fn, args) { + return fn.apply(null, [this].concat([].slice.call(args))); + }, + analogous: function() { + return this._applyCombination(analogous, arguments); + }, + complement: function() { + return this._applyCombination(complement, arguments); + }, + monochromatic: function() { + return this._applyCombination(monochromatic, arguments); + }, + splitcomplement: function() { + return this._applyCombination(splitcomplement, arguments); + }, + triad: function() { + return this._applyCombination(triad, arguments); + }, + tetrad: function() { + return this._applyCombination(tetrad, arguments); + } +}; + +// If input is an object, force 1 into "1.0" to handle ratios properly +// String input requires "1.0" as input, so 1 will be treated as 1 +tinycolor.fromRatio = function(color, opts) { + if (typeof color == "object") { + var newColor = {}; + for (var i in color) { + if (color.hasOwnProperty(i)) { + if (i === "a") { + newColor[i] = color[i]; + } + else { + newColor[i] = convertToPercentage(color[i]); + } + } + } + color = newColor; + } + + return tinycolor(color, opts); +}; + +// Given a string or object, convert that input to RGB +// Possible string inputs: +// +// "red" +// "#f00" or "f00" +// "#ff0000" or "ff0000" +// "#ff000000" or "ff000000" +// "rgb 255 0 0" or "rgb (255, 0, 0)" +// "rgb 1.0 0 0" or "rgb (1, 0, 0)" +// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" +// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" +// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" +// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" +// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" +// +function inputToRGB(color) { + + var rgb = { r: 0, g: 0, b: 0 }; + var a = 1; + var s = null; + var v = null; + var l = null; + var ok = false; + var format = false; + + if (typeof color == "string") { + color = stringInputToObject(color); + } + + if (typeof color == "object") { + if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) { + rgb = rgbToRgb(color.r, color.g, color.b); + ok = true; + format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; + } + else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) { + s = convertToPercentage(color.s); + v = convertToPercentage(color.v); + rgb = hsvToRgb(color.h, s, v); + ok = true; + format = "hsv"; + } + else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) { + s = convertToPercentage(color.s); + l = convertToPercentage(color.l); + rgb = hslToRgb(color.h, s, l); + ok = true; + format = "hsl"; + } + + if (color.hasOwnProperty("a")) { + a = color.a; + } + } + + a = boundAlpha(a); + + return { + ok: ok, + format: color.format || format, + r: mathMin(255, mathMax(rgb.r, 0)), + g: mathMin(255, mathMax(rgb.g, 0)), + b: mathMin(255, mathMax(rgb.b, 0)), + a: a + }; +} + +// Conversion Functions +// -------------------- + +// rgbToHsl, rgbToHsv, hslToRgb, hsvToRgb modified from: +// + +// rgbToRgb +// Handle bounds / percentage checking to conform to CSS color spec +// +// *Assumes:* r, g, b in [0, 255] or [0, 1] +// *Returns:* { r, g, b } in [0, 255] +function rgbToRgb(r, g, b){ + return { + r: bound01(r, 255) * 255, + g: bound01(g, 255) * 255, + b: bound01(b, 255) * 255 + }; +} + +// rgbToHsl +// Converts an RGB color value to HSL. +// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] +// *Returns:* { h, s, l } in [0,1] +function rgbToHsl(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, l = (max + min) / 2; + + if(max == min) { + h = s = 0; // achromatic + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + + h /= 6; + } + + return { h: h, s: s, l: l }; +} + +// hslToRgb +// Converts an HSL color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] +function hslToRgb(h, s, l) { + var r, g, b; + + h = bound01(h, 360); + s = bound01(s, 100); + l = bound01(l, 100); + + function hue2rgb(p, q, t) { + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + if(s === 0) { + r = g = b = l; // achromatic + } + else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// rgbToHsv +// Converts an RGB color value to HSV +// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] +// *Returns:* { h, s, v } in [0,1] +function rgbToHsv(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, v = max; + + var d = max - min; + s = max === 0 ? 0 : d / max; + + if(max == min) { + h = 0; // achromatic + } + else { + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return { h: h, s: s, v: v }; +} + +// hsvToRgb +// Converts an HSV color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] + function hsvToRgb(h, s, v) { + + h = bound01(h, 360) * 6; + s = bound01(s, 100); + v = bound01(v, 100); + + var i = Math.floor(h), + f = h - i, + p = v * (1 - s), + q = v * (1 - f * s), + t = v * (1 - (1 - f) * s), + mod = i % 6, + r = [v, q, p, p, t, v][mod], + g = [t, v, v, q, p, p][mod], + b = [p, p, t, v, v, q][mod]; + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// rgbToHex +// Converts an RGB color to hex +// Assumes r, g, and b are contained in the set [0, 255] +// Returns a 3 or 6 character hex +function rgbToHex(r, g, b, allow3Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + // Return a 3 character hex if possible + if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); + } + + return hex.join(""); +} + +// rgbaToHex +// Converts an RGBA color plus alpha transparency to hex +// Assumes r, g, b are contained in the set [0, 255] and +// a in [0, 1]. Returns a 4 or 8 character rgba hex +function rgbaToHex(r, g, b, a, allow4Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)), + pad2(convertDecimalToHex(a)) + ]; + + // Return a 4 character hex if possible + if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0); + } + + return hex.join(""); +} + +// rgbaToArgbHex +// Converts an RGBA color to an ARGB Hex8 string +// Rarely used, but required for "toFilter()" +function rgbaToArgbHex(r, g, b, a) { + + var hex = [ + pad2(convertDecimalToHex(a)), + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + return hex.join(""); +} + +// equals +// Can be called with any tinycolor input +tinycolor.equals = function (color1, color2) { + if (!color1 || !color2) { return false; } + return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); +}; + +tinycolor.random = function() { + return tinycolor.fromRatio({ + r: mathRandom(), + g: mathRandom(), + b: mathRandom() + }); +}; + +// Modification Functions +// ---------------------- +// Thanks to less.js for some of the basics here +// + +function desaturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s -= amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +} + +function saturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s += amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +} + +function greyscale(color) { + return tinycolor(color).desaturate(100); +} + +function lighten (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l += amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +} + +function brighten(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var rgb = tinycolor(color).toRgb(); + rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100)))); + rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100)))); + rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100)))); + return tinycolor(rgb); +} + +function darken (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l -= amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +} + +// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue. +// Values outside of this range will be wrapped into this range. +function spin(color, amount) { + var hsl = tinycolor(color).toHsl(); + var hue = (hsl.h + amount) % 360; + hsl.h = hue < 0 ? 360 + hue : hue; + return tinycolor(hsl); +} + +// Combination Functions +// --------------------- +// Thanks to jQuery xColor for some of the ideas behind these +// + +function complement(color) { + var hsl = tinycolor(color).toHsl(); + hsl.h = (hsl.h + 180) % 360; + return tinycolor(hsl); +} + +function triad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) + ]; +} + +function tetrad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) + ]; +} + +function splitcomplement(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), + tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) + ]; +} + +function analogous(color, results, slices) { + results = results || 6; + slices = slices || 30; + + var hsl = tinycolor(color).toHsl(); + var part = 360 / slices; + var ret = [tinycolor(color)]; + + for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { + hsl.h = (hsl.h + part) % 360; + ret.push(tinycolor(hsl)); + } + return ret; +} + +function monochromatic(color, results) { + results = results || 6; + var hsv = tinycolor(color).toHsv(); + var h = hsv.h, s = hsv.s, v = hsv.v; + var ret = []; + var modification = 1 / results; + + while (results--) { + ret.push(tinycolor({ h: h, s: s, v: v})); + v = (v + modification) % 1; + } + + return ret; +} + +// Utility Functions +// --------------------- + +tinycolor.mix = function(color1, color2, amount) { + amount = (amount === 0) ? 0 : (amount || 50); + + var rgb1 = tinycolor(color1).toRgb(); + var rgb2 = tinycolor(color2).toRgb(); + + var p = amount / 100; + + var rgba = { + r: ((rgb2.r - rgb1.r) * p) + rgb1.r, + g: ((rgb2.g - rgb1.g) * p) + rgb1.g, + b: ((rgb2.b - rgb1.b) * p) + rgb1.b, + a: ((rgb2.a - rgb1.a) * p) + rgb1.a + }; + + return tinycolor(rgba); +}; + +// Readability Functions +// --------------------- +// false +// tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false +tinycolor.isReadable = function(color1, color2, wcag2) { + var readability = tinycolor.readability(color1, color2); + var wcag2Parms, out; + + out = false; + + wcag2Parms = validateWCAG2Parms(wcag2); + switch (wcag2Parms.level + wcag2Parms.size) { + case "AAsmall": + case "AAAlarge": + out = readability >= 4.5; + break; + case "AAlarge": + out = readability >= 3; + break; + case "AAAsmall": + out = readability >= 7; + break; + } + return out; + +}; + +// mostReadable +// Given a base color and a list of possible foreground or background +// colors for that base, returns the most readable color. +// Optionally returns Black or White if the most readable color is unreadable. +// *Example* +// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255" +// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff" +// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3" +// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff" +tinycolor.mostReadable = function(baseColor, colorList, args) { + var bestColor = null; + var bestScore = 0; + var readability; + var includeFallbackColors, level, size ; + args = args || {}; + includeFallbackColors = args.includeFallbackColors ; + level = args.level; + size = args.size; + + for (var i= 0; i < colorList.length ; i++) { + readability = tinycolor.readability(baseColor, colorList[i]); + if (readability > bestScore) { + bestScore = readability; + bestColor = tinycolor(colorList[i]); + } + } + + if (tinycolor.isReadable(baseColor, bestColor, {"level":level,"size":size}) || !includeFallbackColors) { + return bestColor; + } + else { + args.includeFallbackColors=false; + return tinycolor.mostReadable(baseColor,["#fff", "#000"],args); + } +}; + +// Big List of Colors +// ------------------ +// +var names = tinycolor.names = { + aliceblue: "f0f8ff", + antiquewhite: "faebd7", + aqua: "0ff", + aquamarine: "7fffd4", + azure: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "000", + blanchedalmond: "ffebcd", + blue: "00f", + blueviolet: "8a2be2", + brown: "a52a2a", + burlywood: "deb887", + burntsienna: "ea7e5d", + cadetblue: "5f9ea0", + chartreuse: "7fff00", + chocolate: "d2691e", + coral: "ff7f50", + cornflowerblue: "6495ed", + cornsilk: "fff8dc", + crimson: "dc143c", + cyan: "0ff", + darkblue: "00008b", + darkcyan: "008b8b", + darkgoldenrod: "b8860b", + darkgray: "a9a9a9", + darkgreen: "006400", + darkgrey: "a9a9a9", + darkkhaki: "bdb76b", + darkmagenta: "8b008b", + darkolivegreen: "556b2f", + darkorange: "ff8c00", + darkorchid: "9932cc", + darkred: "8b0000", + darksalmon: "e9967a", + darkseagreen: "8fbc8f", + darkslateblue: "483d8b", + darkslategray: "2f4f4f", + darkslategrey: "2f4f4f", + darkturquoise: "00ced1", + darkviolet: "9400d3", + deeppink: "ff1493", + deepskyblue: "00bfff", + dimgray: "696969", + dimgrey: "696969", + dodgerblue: "1e90ff", + firebrick: "b22222", + floralwhite: "fffaf0", + forestgreen: "228b22", + fuchsia: "f0f", + gainsboro: "dcdcdc", + ghostwhite: "f8f8ff", + gold: "ffd700", + goldenrod: "daa520", + gray: "808080", + green: "008000", + greenyellow: "adff2f", + grey: "808080", + honeydew: "f0fff0", + hotpink: "ff69b4", + indianred: "cd5c5c", + indigo: "4b0082", + ivory: "fffff0", + khaki: "f0e68c", + lavender: "e6e6fa", + lavenderblush: "fff0f5", + lawngreen: "7cfc00", + lemonchiffon: "fffacd", + lightblue: "add8e6", + lightcoral: "f08080", + lightcyan: "e0ffff", + lightgoldenrodyellow: "fafad2", + lightgray: "d3d3d3", + lightgreen: "90ee90", + lightgrey: "d3d3d3", + lightpink: "ffb6c1", + lightsalmon: "ffa07a", + lightseagreen: "20b2aa", + lightskyblue: "87cefa", + lightslategray: "789", + lightslategrey: "789", + lightsteelblue: "b0c4de", + lightyellow: "ffffe0", + lime: "0f0", + limegreen: "32cd32", + linen: "faf0e6", + magenta: "f0f", + maroon: "800000", + mediumaquamarine: "66cdaa", + mediumblue: "0000cd", + mediumorchid: "ba55d3", + mediumpurple: "9370db", + mediumseagreen: "3cb371", + mediumslateblue: "7b68ee", + mediumspringgreen: "00fa9a", + mediumturquoise: "48d1cc", + mediumvioletred: "c71585", + midnightblue: "191970", + mintcream: "f5fffa", + mistyrose: "ffe4e1", + moccasin: "ffe4b5", + navajowhite: "ffdead", + navy: "000080", + oldlace: "fdf5e6", + olive: "808000", + olivedrab: "6b8e23", + orange: "ffa500", + orangered: "ff4500", + orchid: "da70d6", + palegoldenrod: "eee8aa", + palegreen: "98fb98", + paleturquoise: "afeeee", + palevioletred: "db7093", + papayawhip: "ffefd5", + peachpuff: "ffdab9", + peru: "cd853f", + pink: "ffc0cb", + plum: "dda0dd", + powderblue: "b0e0e6", + purple: "800080", + rebeccapurple: "663399", + red: "f00", + rosybrown: "bc8f8f", + royalblue: "4169e1", + saddlebrown: "8b4513", + salmon: "fa8072", + sandybrown: "f4a460", + seagreen: "2e8b57", + seashell: "fff5ee", + sienna: "a0522d", + silver: "c0c0c0", + skyblue: "87ceeb", + slateblue: "6a5acd", + slategray: "708090", + slategrey: "708090", + snow: "fffafa", + springgreen: "00ff7f", + steelblue: "4682b4", + tan: "d2b48c", + teal: "008080", + thistle: "d8bfd8", + tomato: "ff6347", + turquoise: "40e0d0", + violet: "ee82ee", + wheat: "f5deb3", + white: "fff", + whitesmoke: "f5f5f5", + yellow: "ff0", + yellowgreen: "9acd32" +}; + +// Make it easy to access colors via hexNames[hex] +var hexNames = tinycolor.hexNames = flip(names); + +// Utilities +// --------- + +// { 'name1': 'val1' } becomes { 'val1': 'name1' } +function flip(o) { + var flipped = { }; + for (var i in o) { + if (o.hasOwnProperty(i)) { + flipped[o[i]] = i; + } + } + return flipped; +} + +// Return a valid alpha value [0,1] with all invalid values being set to 1 +function boundAlpha(a) { + a = parseFloat(a); + + if (isNaN(a) || a < 0 || a > 1) { + a = 1; + } + + return a; +} + +// Take input from [0, n] and return it as [0, 1] +function bound01(n, max) { + if (isOnePointZero(n)) { n = "100%"; } + + var processPercent = isPercentage(n); + n = mathMin(max, mathMax(0, parseFloat(n))); + + // Automatically convert percentage into number + if (processPercent) { + n = parseInt(n * max, 10) / 100; + } + + // Handle floating point rounding errors + if ((Math.abs(n - max) < 0.000001)) { + return 1; + } + + // Convert into [0, 1] range if it isn't already + return (n % max) / parseFloat(max); +} + +// Force a number between 0 and 1 +function clamp01(val) { + return mathMin(1, mathMax(0, val)); +} + +// Parse a base-16 hex value into a base-10 integer +function parseIntFromHex(val) { + return parseInt(val, 16); +} + +// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 +// +function isOnePointZero(n) { + return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; +} + +// Check to see if string passed in is a percentage +function isPercentage(n) { + return typeof n === "string" && n.indexOf('%') != -1; +} + +// Force a hex value to have 2 characters +function pad2(c) { + return c.length == 1 ? '0' + c : '' + c; +} + +// Replace a decimal with it's percentage value +function convertToPercentage(n) { + if (n <= 1) { + n = (n * 100) + "%"; + } + + return n; +} + +// Converts a decimal to a hex value +function convertDecimalToHex(d) { + return Math.round(parseFloat(d) * 255).toString(16); +} +// Converts a hex value to a decimal +function convertHexToDecimal(h) { + return (parseIntFromHex(h) / 255); +} + +var matchers = (function() { + + // + var CSS_INTEGER = "[-\\+]?\\d+%?"; + + // + var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; + + // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. + var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; + + // Actual matching. + // Parentheses and commas are optional, but not required. + // Whitespace can take the place of commas or opening paren + var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + + return { + CSS_UNIT: new RegExp(CSS_UNIT), + rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), + rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), + hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), + hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), + hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), + hsva: new RegExp("hsva" + PERMISSIVE_MATCH4), + hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, + hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ + }; +})(); + +// isValidCSSUnit +// Take in a single string / number and check to see if it looks like a CSS unit +// (see matchers above for definition). +function isValidCSSUnit(color) { + return !!matchers.CSS_UNIT.exec(color); +} + +// stringInputToObject +// Permissive string parsing. Take in a number of formats, and output an object +// based on detected format. Returns { r, g, b } or { h, s, l } or { h, s, v} +function stringInputToObject(color) { + + color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase(); + var named = false; + if (names[color]) { + color = names[color]; + named = true; + } + else if (color == 'transparent') { + return { r: 0, g: 0, b: 0, a: 0, format: "name" }; + } + + // Try to match string input using regular expressions. + // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] + // Just return an object and let the conversion functions handle that. + // This way the result will be the same whether the tinycolor is initialized with string or object. + var match; + if ((match = matchers.rgb.exec(color))) { + return { r: match[1], g: match[2], b: match[3] }; + } + if ((match = matchers.rgba.exec(color))) { + return { r: match[1], g: match[2], b: match[3], a: match[4] }; + } + if ((match = matchers.hsl.exec(color))) { + return { h: match[1], s: match[2], l: match[3] }; + } + if ((match = matchers.hsla.exec(color))) { + return { h: match[1], s: match[2], l: match[3], a: match[4] }; + } + if ((match = matchers.hsv.exec(color))) { + return { h: match[1], s: match[2], v: match[3] }; + } + if ((match = matchers.hsva.exec(color))) { + return { h: match[1], s: match[2], v: match[3], a: match[4] }; + } + if ((match = matchers.hex8.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + a: convertHexToDecimal(match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex6.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + format: named ? "name" : "hex" + }; + } + if ((match = matchers.hex4.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + a: convertHexToDecimal(match[4] + '' + match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex3.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + format: named ? "name" : "hex" + }; + } + + return false; +} + +function validateWCAG2Parms(parms) { + // return valid WCAG2 parms for isReadable. + // If input parms are invalid, return {"level":"AA", "size":"small"} + var level, size; + parms = parms || {"level":"AA", "size":"small"}; + level = (parms.level || "AA").toUpperCase(); + size = (parms.size || "small").toLowerCase(); + if (level !== "AA" && level !== "AAA") { + level = "AA"; + } + if (size !== "small" && size !== "large") { + size = "small"; + } + return {"level":level, "size":size}; +} + +this.tinycolor = tinycolor; + +})()`; +} +// It is hacky way to make this function will be compiled preferentially by less +// resolve error: `ReferenceError: colorPalette is not defined` +// https://github.com/ant-design/ant-motion/issues/44 +.tinyColorMixin(); + +// We create a very complex algorithm which take the place of original tint/shade color system +// to make sure no one can understand it 👻 +// and create an entire color palette magicly by inputing just a single primary color. +// We are using bezier-curve easing function and some color manipulations like tint/shade/darken/spin +.colorPaletteMixin() { + @functions: ~`(function() { + var hueStep = 2; + var saturationStep = 16; + var saturationStep2 = 5; + var brightnessStep1 = 5; + var brightnessStep2 = 15; + var lightColorCount = 5; + var darkColorCount = 4; + + var getHue = function(hsv, i, isLight) { + var hue; + if (hsv.h >= 60 && hsv.h <= 240) { + hue = isLight ? hsv.h - hueStep * i : hsv.h + hueStep * i; + } else { + hue = isLight ? hsv.h + hueStep * i : hsv.h - hueStep * i; + } + if (hue < 0) { + hue += 360; + } else if (hue >= 360) { + hue -= 360; + } + return Math.round(hue); + }; + var getSaturation = function(hsv, i, isLight) { + var saturation; + if (isLight) { + saturation = Math.round(hsv.s * 100) - saturationStep * i; + } else if (i == darkColorCount) { + saturation = Math.round(hsv.s * 100) + saturationStep; + } else { + saturation = Math.round(hsv.s * 100) + saturationStep2 * i; + } + if (saturation > 100) { + saturation = 100; + } + if (isLight && i === lightColorCount && saturation > 10) { + saturation = 10; + } + if (saturation < 6) { + saturation = 6; + } + return Math.round(saturation); + }; + var getValue = function(hsv, i, isLight) { + if (isLight) { + return Math.round(hsv.v * 100) + brightnessStep1 * i; + } + return Math.round(hsv.v * 100) - brightnessStep2 * i; + }; + + this.colorPalette = function(color, index) { + var isLight = index <= 6; + var hsv = tinycolor(color).toHsv(); + var i = isLight ? lightColorCount + 1 - index : index - lightColorCount - 1; + return tinycolor({ + h: getHue(hsv, i, isLight), + s: getSaturation(hsv, i, isLight), + v: getValue(hsv, i, isLight), + }).toHexString(); + }; +})()`; +} +// It is hacky way to make this function will be compiled preferentially by less +// resolve error: `ReferenceError: colorPalette is not defined` +// https://github.com/ant-design/ant-motion/issues/44 +.colorPaletteMixin(); + +// color palettes +@blue-1: color(~`colorPalette("@{blue-6}", 1)`); +@blue-2: color(~`colorPalette("@{blue-6}", 2)`); +@blue-3: color(~`colorPalette("@{blue-6}", 3)`); +@blue-4: color(~`colorPalette("@{blue-6}", 4)`); +@blue-5: color(~`colorPalette("@{blue-6}", 5)`); +@blue-6: #1890ff; +@blue-7: color(~`colorPalette("@{blue-6}", 7)`); +@blue-8: color(~`colorPalette("@{blue-6}", 8)`); +@blue-9: color(~`colorPalette("@{blue-6}", 9)`); +@blue-10: color(~`colorPalette("@{blue-6}", 10)`); + +@purple-1: color(~`colorPalette("@{purple-6}", 1)`); +@purple-2: color(~`colorPalette("@{purple-6}", 2)`); +@purple-3: color(~`colorPalette("@{purple-6}", 3)`); +@purple-4: color(~`colorPalette("@{purple-6}", 4)`); +@purple-5: color(~`colorPalette("@{purple-6}", 5)`); +@purple-6: #722ed1; +@purple-7: color(~`colorPalette("@{purple-6}", 7)`); +@purple-8: color(~`colorPalette("@{purple-6}", 8)`); +@purple-9: color(~`colorPalette("@{purple-6}", 9)`); +@purple-10: color(~`colorPalette("@{purple-6}", 10)`); + +@cyan-1: color(~`colorPalette("@{cyan-6}", 1)`); +@cyan-2: color(~`colorPalette("@{cyan-6}", 2)`); +@cyan-3: color(~`colorPalette("@{cyan-6}", 3)`); +@cyan-4: color(~`colorPalette("@{cyan-6}", 4)`); +@cyan-5: color(~`colorPalette("@{cyan-6}", 5)`); +@cyan-6: #13c2c2; +@cyan-7: color(~`colorPalette("@{cyan-6}", 7)`); +@cyan-8: color(~`colorPalette("@{cyan-6}", 8)`); +@cyan-9: color(~`colorPalette("@{cyan-6}", 9)`); +@cyan-10: color(~`colorPalette("@{cyan-6}", 10)`); + +@green-1: color(~`colorPalette("@{green-6}", 1)`); +@green-2: color(~`colorPalette("@{green-6}", 2)`); +@green-3: color(~`colorPalette("@{green-6}", 3)`); +@green-4: color(~`colorPalette("@{green-6}", 4)`); +@green-5: color(~`colorPalette("@{green-6}", 5)`); +@green-6: #52c41a; +@green-7: color(~`colorPalette("@{green-6}", 7)`); +@green-8: color(~`colorPalette("@{green-6}", 8)`); +@green-9: color(~`colorPalette("@{green-6}", 9)`); +@green-10: color(~`colorPalette("@{green-6}", 10)`); + +@magenta-1: color(~`colorPalette("@{magenta-6}", 1)`); +@magenta-2: color(~`colorPalette("@{magenta-6}", 2)`); +@magenta-3: color(~`colorPalette("@{magenta-6}", 3)`); +@magenta-4: color(~`colorPalette("@{magenta-6}", 4)`); +@magenta-5: color(~`colorPalette("@{magenta-6}", 5)`); +@magenta-6: #eb2f96; +@magenta-7: color(~`colorPalette("@{magenta-6}", 7)`); +@magenta-8: color(~`colorPalette("@{magenta-6}", 8)`); +@magenta-9: color(~`colorPalette("@{magenta-6}", 9)`); +@magenta-10: color(~`colorPalette("@{magenta-6}", 10)`); + +// alias of magenta +@pink-1: color(~`colorPalette("@{pink-6}", 1)`); +@pink-2: color(~`colorPalette("@{pink-6}", 2)`); +@pink-3: color(~`colorPalette("@{pink-6}", 3)`); +@pink-4: color(~`colorPalette("@{pink-6}", 4)`); +@pink-5: color(~`colorPalette("@{pink-6}", 5)`); +@pink-6: #eb2f96; +@pink-7: color(~`colorPalette("@{pink-6}", 7)`); +@pink-8: color(~`colorPalette("@{pink-6}", 8)`); +@pink-9: color(~`colorPalette("@{pink-6}", 9)`); +@pink-10: color(~`colorPalette("@{pink-6}", 10)`); + +@red-1: color(~`colorPalette("@{red-6}", 1)`); +@red-2: color(~`colorPalette("@{red-6}", 2)`); +@red-3: color(~`colorPalette("@{red-6}", 3)`); +@red-4: color(~`colorPalette("@{red-6}", 4)`); +@red-5: color(~`colorPalette("@{red-6}", 5)`); +@red-6: #f5222d; +@red-7: color(~`colorPalette("@{red-6}", 7)`); +@red-8: color(~`colorPalette("@{red-6}", 8)`); +@red-9: color(~`colorPalette("@{red-6}", 9)`); +@red-10: color(~`colorPalette("@{red-6}", 10)`); + +@orange-1: color(~`colorPalette("@{orange-6}", 1)`); +@orange-2: color(~`colorPalette("@{orange-6}", 2)`); +@orange-3: color(~`colorPalette("@{orange-6}", 3)`); +@orange-4: color(~`colorPalette("@{orange-6}", 4)`); +@orange-5: color(~`colorPalette("@{orange-6}", 5)`); +@orange-6: #fa8c16; +@orange-7: color(~`colorPalette("@{orange-6}", 7)`); +@orange-8: color(~`colorPalette("@{orange-6}", 8)`); +@orange-9: color(~`colorPalette("@{orange-6}", 9)`); +@orange-10: color(~`colorPalette("@{orange-6}", 10)`); + +@yellow-1: color(~`colorPalette("@{yellow-6}", 1)`); +@yellow-2: color(~`colorPalette("@{yellow-6}", 2)`); +@yellow-3: color(~`colorPalette("@{yellow-6}", 3)`); +@yellow-4: color(~`colorPalette("@{yellow-6}", 4)`); +@yellow-5: color(~`colorPalette("@{yellow-6}", 5)`); +@yellow-6: #fadb14; +@yellow-7: color(~`colorPalette("@{yellow-6}", 7)`); +@yellow-8: color(~`colorPalette("@{yellow-6}", 8)`); +@yellow-9: color(~`colorPalette("@{yellow-6}", 9)`); +@yellow-10: color(~`colorPalette("@{yellow-6}", 10)`); + +@volcano-1: color(~`colorPalette("@{volcano-6}", 1)`); +@volcano-2: color(~`colorPalette("@{volcano-6}", 2)`); +@volcano-3: color(~`colorPalette("@{volcano-6}", 3)`); +@volcano-4: color(~`colorPalette("@{volcano-6}", 4)`); +@volcano-5: color(~`colorPalette("@{volcano-6}", 5)`); +@volcano-6: #fa541c; +@volcano-7: color(~`colorPalette("@{volcano-6}", 7)`); +@volcano-8: color(~`colorPalette("@{volcano-6}", 8)`); +@volcano-9: color(~`colorPalette("@{volcano-6}", 9)`); +@volcano-10: color(~`colorPalette("@{volcano-6}", 10)`); + +@geekblue-1: color(~`colorPalette("@{geekblue-6}", 1)`); +@geekblue-2: color(~`colorPalette("@{geekblue-6}", 2)`); +@geekblue-3: color(~`colorPalette("@{geekblue-6}", 3)`); +@geekblue-4: color(~`colorPalette("@{geekblue-6}", 4)`); +@geekblue-5: color(~`colorPalette("@{geekblue-6}", 5)`); +@geekblue-6: #2f54eb; +@geekblue-7: color(~`colorPalette("@{geekblue-6}", 7)`); +@geekblue-8: color(~`colorPalette("@{geekblue-6}", 8)`); +@geekblue-9: color(~`colorPalette("@{geekblue-6}", 9)`); +@geekblue-10: color(~`colorPalette("@{geekblue-6}", 10)`); + +@lime-1: color(~`colorPalette("@{lime-6}", 1)`); +@lime-2: color(~`colorPalette("@{lime-6}", 2)`); +@lime-3: color(~`colorPalette("@{lime-6}", 3)`); +@lime-4: color(~`colorPalette("@{lime-6}", 4)`); +@lime-5: color(~`colorPalette("@{lime-6}", 5)`); +@lime-6: #a0d911; +@lime-7: color(~`colorPalette("@{lime-6}", 7)`); +@lime-8: color(~`colorPalette("@{lime-6}", 8)`); +@lime-9: color(~`colorPalette("@{lime-6}", 9)`); +@lime-10: color(~`colorPalette("@{lime-6}", 10)`); + +@gold-1: color(~`colorPalette("@{gold-6}", 1)`); +@gold-2: color(~`colorPalette("@{gold-6}", 2)`); +@gold-3: color(~`colorPalette("@{gold-6}", 3)`); +@gold-4: color(~`colorPalette("@{gold-6}", 4)`); +@gold-5: color(~`colorPalette("@{gold-6}", 5)`); +@gold-6: #faad14; +@gold-7: color(~`colorPalette("@{gold-6}", 7)`); +@gold-8: color(~`colorPalette("@{gold-6}", 8)`); +@gold-9: color(~`colorPalette("@{gold-6}", 9)`); +@gold-10: color(~`colorPalette("@{gold-6}", 10)`); + +// The prefix to use on all css classes from ant. +@ant-prefix : ant; + +// -------- Colors ----------- + +@info-color : @blue-6; +@success-color : @green-6; +@processing-color : @blue-6; +@error-color : @red-6; +@highlight-color : @red-6; +@warning-color : @gold-6; +@normal-color : #d9d9d9; + +// Color used by default to control hover and active backgrounds and for +// alert info backgrounds. +@primary-1: color(~`colorPalette("@{primary-color}", 1)`); // replace tint(@primary-color, 90%) +@primary-2: color(~`colorPalette("@{primary-color}", 2)`); // replace tint(@primary-color, 80%) +@primary-3: color(~`colorPalette("@{primary-color}", 3)`); // unused +@primary-4: color(~`colorPalette("@{primary-color}", 4)`); // unused +@primary-5: color(~`colorPalette("@{primary-color}", 5)`); // color used to control the text color in many active and hover states, replace tint(@primary-color, 20%) +@primary-6: @primary-color; // color used to control the text color of active buttons, don't use, use @primary-color +@primary-7: color(~`colorPalette("@{primary-color}", 7)`); // replace shade(@primary-color, 5%) +@primary-8: color(~`colorPalette("@{primary-color}", 8)`); // unused +@primary-9: color(~`colorPalette("@{primary-color}", 9)`); // unused +@primary-10: color(~`colorPalette("@{primary-color}", 10)`); // unused + +// Base Scaffolding Variables +// --- + +// Background color for `` +@body-background : #fff; +// Base background color for most components +@component-background : #fff; +@font-family : "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, +"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; +@code-family : "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; +@heading-color : fade(#000, 85%); +@text-color : fade(#000, 65%); +@text-color-secondary : fade(#000, 45%); +@heading-color-dark : fade(#fff, 100%); +@text-color-dark : fade(#fff, 85%); +@text-color-secondary-dark: fade(#fff, 65%); +@font-size-base : 14px; +@font-size-lg : @font-size-base + 2px; +@font-size-sm : 12px; +@line-height-base : 1.5; +@border-radius-base : 4px; +@border-radius-sm : 2px; + +// vertical paddings +@padding-lg : 24px; // containers +@padding-md : 16px; // small containers and buttons +@padding-sm : 12px; // Form controls and items +@padding-xs : 8px; // small items + +// vertical padding for all form controls +@control-padding-horizontal: @padding-sm; +@control-padding-horizontal-sm: @padding-xs; + +// The background colors for active and hover states for things like +// list items or table cells. +@item-active-bg : @primary-1; +@item-hover-bg : @primary-1; + +// ICONFONT +@iconfont-css-prefix : anticon; + +// LINK +@link-color : @primary-color; +@link-hover-color : color(~`colorPalette("@{link-color}", 5)`); +@link-active-color : color(~`colorPalette("@{link-color}", 7)`); +@link-decoration : none; +@link-hover-decoration : none; + +// Animation +@ease-base-out : cubic-bezier(0.7, 0.3, 0.1, 1); +@ease-base-in : cubic-bezier(0.9, 0, 0.3, 0.7); +@ease-out : cubic-bezier(0.215, 0.61, 0.355, 1); +@ease-in : cubic-bezier(0.55, 0.055, 0.675, 0.19); +@ease-in-out : cubic-bezier(0.645, 0.045, 0.355, 1); +@ease-out-back : cubic-bezier(0.12, 0.4, 0.29, 1.46); +@ease-in-back : cubic-bezier(0.71, -0.46, 0.88, 0.6); +@ease-in-out-back : cubic-bezier(0.71, -0.46, 0.29, 1.46); +@ease-out-circ : cubic-bezier(0.08, 0.82, 0.17, 1); +@ease-in-circ : cubic-bezier(0.6, 0.04, 0.98, 0.34); +@ease-in-out-circ : cubic-bezier(0.78, 0.14, 0.15, 0.86); +@ease-out-quint : cubic-bezier(0.23, 1, 0.32, 1); +@ease-in-quint : cubic-bezier(0.755, 0.05, 0.855, 0.06); +@ease-in-out-quint : cubic-bezier(0.86, 0, 0.07, 1); + +// Border color +@border-color-base : hsv(0, 0, 85%); // base border outline a component +@border-color-split : hsv(0, 0, 91%); // split border inside a component +@border-width-base : 1px; // width of the border for a component +@border-style-base : solid; // style of a components border + +// Outline +@outline-blur-size : 0; +@outline-width : 2px; +@outline-color : @primary-color; + +@background-color-light : hsv(0, 0, 98%); // background of header and selected item +@background-color-base : hsv(0, 0, 96%); // Default grey background color + +// Disabled states +@disabled-color : fade(#000, 25%); +@disabled-bg : @background-color-base; +@disabled-color-dark : fade(#fff, 35%); + +// Shadow +@shadow-color : rgba(0, 0, 0, .15); +@box-shadow-base : @shadow-1-down; +@shadow-1-up : 0 -2px 8px @shadow-color; +@shadow-1-down : 0 2px 8px @shadow-color; +@shadow-1-left : -2px 0 8px @shadow-color; +@shadow-1-right : 2px 0 8px @shadow-color; +@shadow-2 : 0 4px 12px @shadow-color; + +// Buttons +@btn-font-weight : 400; +@btn-border-radius-base : @border-radius-base; +@btn-border-radius-sm : @border-radius-base; + +@btn-primary-color : #fff; +@btn-primary-bg : @primary-color; + +@btn-default-color : @text-color; +@btn-default-bg : #fff; +@btn-default-border : @border-color-base; + +@btn-danger-color : @error-color; +@btn-danger-bg : @background-color-base; +@btn-danger-border : @border-color-base; + +@btn-disable-color : @disabled-color; +@btn-disable-bg : @disabled-bg; +@btn-disable-border : @border-color-base; + +@btn-padding-base : 0 @padding-md - 1px; +@btn-font-size-lg : @font-size-lg; +@btn-font-size-sm : @font-size-base; +@btn-padding-lg : @btn-padding-base; +@btn-padding-sm : 0 @padding-xs - 1px; + +@btn-height-base : 32px; +@btn-height-lg : 40px; +@btn-height-sm : 24px; + +@btn-circle-size : @btn-height-base; +@btn-circle-size-lg : @btn-height-lg; +@btn-circle-size-sm : @btn-height-sm; + +@btn-group-border : @primary-5; + +// Checkbox +@checkbox-size : 16px; +@checkbox-color : @primary-color; +@checkbox-check-color : #fff; + +// Radio +@radio-size : 16px; +@radio-dot-color : @primary-color; + +// Radio buttons +@radio-button-bg : @btn-default-bg; +@radio-button-color : @btn-default-color; +@radio-button-hover-color : @primary-5; +@radio-button-active-color : @primary-7; + +// Media queries breakpoints +// Extra small screen / phone +@screen-xs : 480px; +@screen-xs-min : @screen-xs; + +// Small screen / tablet +@screen-sm : 576px; +@screen-sm-min : @screen-sm; + +// Medium screen / desktop +@screen-md : 768px; +@screen-md-min : @screen-md; + +// Large screen / wide desktop +@screen-lg : 992px; +@screen-lg-min : @screen-lg; + +// Extra large screen / full hd +@screen-xl : 1200px; +@screen-xl-min : @screen-xl; + +// Extra extra large screen / large descktop +@screen-xxl : 1600px; +@screen-xxl-min : @screen-xxl; + +// provide a maximum +@screen-xs-max : (@screen-sm-min - 1px); +@screen-sm-max : (@screen-md-min - 1px); +@screen-md-max : (@screen-lg-min - 1px); +@screen-lg-max : (@screen-xl-min - 1px); +@screen-xl-max : (@screen-xxl-min - 1px); + +// Grid system +@grid-columns : 24; +@grid-gutter-width : 0; + +// Layout +@layout-body-background : #f0f2f5; +@layout-header-background : #001529; +@layout-footer-background : @layout-body-background; +@layout-header-height : 64px; +@layout-header-padding : 0 50px; +@layout-footer-padding : 24px 50px; +@layout-sider-background : @layout-header-background; +@layout-trigger-height : 48px; +@layout-trigger-background : #002140; +@layout-trigger-color : #fff; +@layout-zero-trigger-width : 36px; +@layout-zero-trigger-height : 42px; +// Layout light theme +@layout-sider-background-light : #fff; +@layout-trigger-background-light: #fff; +@layout-trigger-color-light : @text-color; + +// z-index list +@zindex-affix : 10; +@zindex-back-top : 10; +@zindex-modal-mask : 1000; +@zindex-modal : 1000; +@zindex-notification : 1010; +@zindex-message : 1010; +@zindex-popover : 1030; +@zindex-picker : 1050; +@zindex-dropdown : 1050; +@zindex-tooltip : 1060; + +// Animation +@animation-duration-slow: .3s; // Modal +@animation-duration-base: .2s; +@animation-duration-fast: .1s; // Tooltip + +// Form +// --- +@label-required-color : @highlight-color; +@label-color : @heading-color; +@form-item-margin-bottom : 24px; +@form-item-trailing-colon : true; +@form-vertical-label-padding : 0 0 8px; +@form-vertical-label-margin : 0; + +// Input +// --- +@input-height-base : 32px; +@input-height-lg : 40px; +@input-height-sm : 24px; +@input-padding-horizontal : @control-padding-horizontal - 1px; +@input-padding-horizontal-base: @input-padding-horizontal; +@input-padding-horizontal-sm : @control-padding-horizontal-sm - 1px; +@input-padding-horizontal-lg : @input-padding-horizontal; +@input-padding-vertical-base : 4px; +@input-padding-vertical-sm : 1px; +@input-padding-vertical-lg : 6px; +@input-placeholder-color : hsv(0, 0, 75%); +@input-color : @text-color; +@input-border-color : @border-color-base; +@input-bg : #fff; +@input-addon-bg : @background-color-light; +@input-hover-border-color : @primary-color; +@input-disabled-bg : @disabled-bg; +@input-outline-offset : 0 0; + +// Tooltip +// --- +//* Tooltip max width +@tooltip-max-width: 250px; +//** Tooltip text color +@tooltip-color: #fff; +//** Tooltip background color +@tooltip-bg: rgba(0, 0, 0, .75); +//** Tooltip arrow width +@tooltip-arrow-width: 5px; +//** Tooltip distance with trigger +@tooltip-distance: @tooltip-arrow-width - 1px + 4px; +//** Tooltip arrow color +@tooltip-arrow-color: @tooltip-bg; + +// Popover +// --- +//** Popover body background color +@popover-bg: #fff; +//** Popover text color +@popover-color: @text-color; +//** Popover maximum width +@popover-min-width: 177px; +//** Popover arrow width +@popover-arrow-width: 6px; +//** Popover arrow color +@popover-arrow-color: @popover-bg; +//** Popover outer arrow width +//** Popover outer arrow color +@popover-arrow-outer-color: @popover-bg; +//** Popover distance with trigger +@popover-distance: @popover-arrow-width + 4px; + +// Modal +// -- +@modal-mask-bg: rgba(0, 0, 0, 0.65); + +// Progress +// -- +@progress-default-color: @processing-color; +@progress-remaining-color: @background-color-base; +@progress-text-color: @text-color; + +// Menu +// --- +@menu-inline-toplevel-item-height: 40px; +@menu-item-height: 40px; +@menu-collapsed-width: 80px; +@menu-bg: @component-background; +@menu-item-color: @text-color; +@menu-highlight-color: @primary-color; +@menu-item-active-bg: @item-active-bg; +@menu-item-active-border-width: 3px; +@menu-item-group-title-color: @text-color-secondary; +// dark theme +@menu-dark-color: @text-color-secondary-dark; +@menu-dark-bg: @layout-header-background; +@menu-dark-arrow-color: #fff; +@menu-dark-submenu-bg: #000c17; +@menu-dark-highlight-color: #fff; +@menu-dark-item-active-bg: @primary-color; + +// Spin +// --- +@spin-dot-size-sm: 14px; +@spin-dot-size: 20px; +@spin-dot-size-lg: 32px; + +// Table +// -- +@table-header-bg: @background-color-light; +@table-header-color: @heading-color; +@table-header-sort-bg: @background-color-base; +@table-body-sort-bg: rgba(0, 0, 0, .01); +@table-row-hover-bg: @primary-1; +@table-selected-row-bg: #fafafa; +@table-expanded-row-bg: #fbfbfb; +@table-padding-vertical: 16px; +@table-padding-horizontal: 16px; + +// Tag +// -- +@tag-default-bg: @background-color-light; +@tag-default-color: @text-color; +@tag-font-size: @font-size-sm; + +// TimePicker +// --- +@time-picker-panel-column-width: 56px; +@time-picker-panel-width: @time-picker-panel-column-width * 3; +@time-picker-selected-bg: @background-color-base; + +// Carousel +// --- +@carousel-dot-width: 16px; +@carousel-dot-height: 3px; +@carousel-dot-active-width: 24px; + +// Badge +// --- +@badge-height: 20px; +@badge-dot-size: 6px; +@badge-font-size: @font-size-sm; +@badge-font-weight: normal; +@badge-status-size: 6px; + +// Rate +// --- +@rate-star-color: @yellow-6; +@rate-star-bg: @border-color-split; + +// Card +// --- +@card-head-color: @heading-color; +@card-head-background: transparent; +@card-head-padding: 16px; +@card-inner-head-padding: 12px; +@card-padding-base: 24px; +@card-padding-wider: 32px; +@card-actions-background: @background-color-light; +@card-shadow: 0 2px 8px rgba(0, 0, 0, .09); + +// Tabs +// --- +@tabs-card-head-background: @background-color-light; +@tabs-card-height: 40px; +@tabs-card-active-color: @primary-color; +@tabs-title-font-size: @font-size-base; +@tabs-title-font-size-lg: @font-size-lg; +@tabs-title-font-size-sm: @font-size-base; +@tabs-ink-bar-color: @primary-color; +@tabs-bar-margin: 0 0 16px 0; +@tabs-horizontal-margin: 0 32px 0 0; +@tabs-horizontal-padding: 12px 16px; +@tabs-vertical-padding: 8px 24px; +@tabs-vertical-margin: 0 0 16px 0; +@tabs-scrolling-size: 32px; +@tabs-highlight-color: @primary-color; +@tabs-hover-color: @primary-5; +@tabs-active-color: @primary-7; + +// BackTop +// --- +@back-top-color: #fff; +@back-top-bg: @text-color-secondary; +@back-top-hover-bg: @text-color; + +// Avatar +// --- +@avatar-size-base: 32px; +@avatar-size-lg: 40px; +@avatar-size-sm: 24px; +@avatar-font-size-base: 18px; +@avatar-font-size-lg: 24px; +@avatar-font-size-sm: 14px; +@avatar-bg: #ccc; +@avatar-color: #fff; +@avatar-border-radius: @border-radius-base; + +// Switch +// --- +@switch-height: 22px; +@switch-sm-height: 16px; +@switch-sm-checked-margin-left: -(@switch-sm-height - 3px); +@switch-disabled-opacity: 0.4; +@switch-color: @primary-color; + +// Pagination +// --- +@pagination-item-size: 32px; +@pagination-item-size-sm: 24px; +@pagination-font-family: Arial; +@pagination-font-weight-active: 500; + +// Breadcrumb +// --- +@breadcrumb-base-color: @text-color-secondary; +@breadcrumb-last-item-color: @text-color; +@breadcrumb-font-size: @font-size-base; +@breadcrumb-icon-font-size: @font-size-base; +@breadcrumb-link-color: @text-color-secondary; +@breadcrumb-link-color-hover: @primary-5; +@breadcrumb-separator-color: @text-color-secondary; +@breadcrumb-separator-margin: 0 @padding-xs; + +// Slider +// --- +@slider-margin: 14px 6px 10px; +@slider-rail-background-color: @background-color-base; +@slider-rail-background-color-hover: #e1e1e1; +@slider-track-background-color: @primary-3; +@slider-track-background-color-hover: @primary-4; +@slider-handle-color: @primary-3; +@slider-handle-color-hover: @primary-4; +@slider-handle-color-focus: tint(@primary-color, 20%); +@slider-handle-color-focus-shadow: tint(@primary-color, 50%); +@slider-handle-color-tooltip-open: @primary-color; +@slider-dot-border-color: @border-color-split; +@slider-dot-border-color-active: tint(@primary-color, 50%); +@slider-disabled-color: @disabled-color; +@slider-disabled-background-color: @component-background; + +// Tree +// --- +@tree-title-height: 24px; +@tree-child-padding: 18px; +@tree-directory-selected-color: #fff; +@tree-directory-selected-bg: @primary-color; + +// Collapse +// --- +@collapse-header-padding: 12px 0 12px 40px; +@collapse-header-bg: @background-color-light; +@collapse-content-padding: @padding-md; +@collapse-content-bg: @component-background; + +// Skeleton +// --- +@skeleton-color: #f2f2f2; + +// Transfer +// --- +@transfer-disabled-bg: @disabled-bg; + +// Message +// --- +@message-notice-content-padding: 10px 16px; + +// Motion +// --- +@wave-animation-width: 6px; + +// Alert +// --- +@alert-success-border-color: ~`colorPalette("@{success-color}", 3)`; +@alert-success-bg-color: ~`colorPalette("@{success-color}", 1)`; +@alert-success-icon-color: @success-color; +@alert-info-border-color: ~`colorPalette("@{info-color}", 3)`; +@alert-info-bg-color: ~`colorPalette("@{info-color}", 1)`; +@alert-info-icon-color: @info-color; +@alert-warning-border-color: ~`colorPalette("@{warning-color}", 3)`; +@alert-warning-bg-color: ~`colorPalette("@{warning-color}", 1)`; +@alert-warning-icon-color: @warning-color; +@alert-error-border-color: ~`colorPalette("@{error-color}", 3)`; +@alert-error-bg-color: ~`colorPalette("@{error-color}", 1)`; +@alert-error-icon-color: @error-color; + +// List +// --- +@list-empty-text-padding: @padding-md; +@list-item-padding: @padding-sm 0; +@list-item-content-margin: 0 0 @padding-md 0; +@list-item-meta-margin-bottom: @padding-md; +@list-item-meta-avatar-margin-right: @padding-md; +@list-item-meta-title-margin-bottom: @padding-sm; + +// Menu +@menu-dark-item-selected-bg: @menu-dark-item-active-bg; + +// Tabs +@tab-bar-margin: @tabs-bar-margin; +@tab-horizontal-margin: @tabs-horizontal-margin; +@tab-vertical-margin: @tabs-vertical-margin; +@tab-horizontal-padding: @tabs-horizontal-padding; +@tab-vertical-padding: @tabs-vertical-padding; +@tab-scrolling-size: @tabs-scrolling-size; +@tab-highlight-color: @tabs-highlight-color; +@tab-hover-color: @tabs-hover-color; +@tab-active-color: @tabs-active-color; +@tabs-ink-bar-bg-color: @tabs-ink-bar-color; + +.listContent .extra { + color: rgba(0, 0, 0, 0.45); +} +.listContent .extra > em { + color: rgba(0, 0, 0, 0.25); +} +.avatarItem :global .ant-avatar { + border: 1px solid #fff; +} +.chartCard .avatar img { + border-radius: 100%; +} +.chartCard .meta { + color: rgba(0, 0, 0, 0.45); +} +.chartCard .total { + color: rgba(0, 0, 0, 0.85); +} +.chartCard .footer { + border-top: 1px solid #e8e8e8; +} +.field span:last-child { + color: rgba(0, 0, 0, 0.85); +} +.miniProgress .progressWrap { + background-color: #f5f5f5; +} +.miniProgress .progress { + border-radius: 1px 0 0 1px; + background-color: @primary-color; +} +.miniProgress .target span { + border-radius: 100px; +} +.pie .dot { + border-radius: 8px; +} +.pie .line { + background-color: #e8e8e8; +} +.pie .legendTitle { + color: rgba(0, 0, 0, 0.65); +} +.pie .percent { + color: rgba(0, 0, 0, 0.45); +} +.pie .total > h4 { + color: rgba(0, 0, 0, 0.45); +} +.pie .total > p { + color: rgba(0, 0, 0, 0.85); +} +.radar .legend .legendItem { + color: rgba(0, 0, 0, 0.45); +} +.radar .legend .legendItem h6 { + color: rgba(0, 0, 0, 0.85); +} +.radar .legend .legendItem:after { + background-color: #e8e8e8; +} +.radar .legend .dot { + border-radius: 6px; +} + +.timelineChart { + background: #fff; +} +.waterWave .text span { + color: rgba(0, 0, 0, 0.45); +} +.waterWave .text h4 { + color: rgba(0, 0, 0, 0.85); +} +.descriptionList .title { + color: rgba(0, 0, 0, 0.85); +} +.descriptionList .term { + color: rgba(0, 0, 0, 0.85); +} +.descriptionList .detail { + color: rgba(0, 0, 0, 0.65); +} +.descriptionList.small .title { + color: rgba(0, 0, 0, 0.65); +} +.linkGroup > a { + color: rgba(0, 0, 0, 0.65); +} +.linkGroup > a:hover { + color: @primary-color; +} +.lines .shadow { + color: transparent; +} +.exception .imgEle { + background-repeat: no-repeat; + background-position: 50% 50%; + background-size: contain; +} +.exception .content h1 { + color: #434e59; +} +.exception .content .desc { + color: rgba(0, 0, 0, 0.45); +} +.toolbar { + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.03); + background: #fff; + border-top: 1px solid #e8e8e8; +} +.globalFooter .links a { + color: rgba(0, 0, 0, 0.45); +} +.globalFooter .links a:hover { + color: rgba(0, 0, 0, 0.65); +} +.globalFooter .copyright { + color: rgba(0, 0, 0, 0.45); +} +.header { + background: #fff; + box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); +} +i.trigger:hover { + background: rgba(0, 0, 0, 0.025); +} +.right .action > i { + color: rgba(0, 0, 0, 0.65); +} +.right .action:hover { + background: rgba(0, 0, 0, 0.025); +} +:global(.right .action.ant-popover-open) { + background: rgba(0, 0, 0, 0.025); +} +.right .search:hover { + background: transparent; +} +.right .account .avatar { + color: @primary-color; + background: rgba(255, 255, 255, 0.85); +} +.dark .action { + color: rgba(255, 255, 255, 0.85); +} +.dark .action > i { + color: rgba(255, 255, 255, 0.85); +} +.dark .action:hover, +.dark .action:global(.ant-popover-open) { + background: @primary-color; +} +.dark .action :global(.ant-badge) { + color: rgba(255, 255, 255, 0.85); +} +.headerSearch .input { + background: transparent; + border-radius: 0; +} +.headerSearch .input :global(.ant-select-selection) { + background: transparent; +} +.headerSearch .input input { + border: 0; + box-shadow: none !important; +} +.headerSearch .input, +.headerSearch .input:hover, +.headerSearch .input:focus { + border-bottom: 1px solid #d9d9d9; +} +.login :global .ant-tabs .ant-tabs-bar { + border-bottom: 0; +} +.login .icon { + color: rgba(0, 0, 0, 0.2); +} +.login .icon:hover { + color: @primary-color; +} +.login .prefixIcon { + color: rgba(0, 0, 0, 0.25); +} +.list .item .avatar { + background: #fff; +} +.list .item:last-child { + border-bottom: 0; +} +.list .item:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.list .item .extra { + color: rgba(0, 0, 0, 0.45); +} +.notFound { + color: rgba(0, 0, 0, 0.45); +} +.clear { + color: rgba(0, 0, 0, 0.65); + border-radius: 0 0 4px 4px; + border-top: 1px solid #e8e8e8; +} +.clear:hover { + color: rgba(0, 0, 0, 0.85); +} +.numberInfo .suffix { + color: rgba(0, 0, 0, 0.65); +} +.numberInfo .numberInfoTitle { + color: rgba(0, 0, 0, 0.65); +} +.numberInfo .numberInfoSubTitle { + color: rgba(0, 0, 0, 0.45); +} +.numberInfo .numberInfoValue > span { + color: rgba(0, 0, 0, 0.85); +} +.numberInfo .numberInfoValue .subTotal { + color: rgba(0, 0, 0, 0.45); +} +.numberInfo .numberInfoValue .subTotal :global .anticon-caret-up { + color: #f5222d; +} +.numberInfo .numberInfoValue .subTotal :global .anticon-caret-down { + color: #52c41a; +} +.numberInfolight .numberInfoValue > span { + color: rgba(0, 0, 0, 0.65); +} +.pageHeader { + background: #fff; + border-bottom: 1px solid #e8e8e8; +} +.pageHeader .tabs :global .ant-tabs-bar { + border-bottom: 1px solid #e8e8e8; +} +.pageHeader .logo > img { + border-radius: 4px; +} +.pageHeader .title { + color: rgba(0, 0, 0, 0.85); +} +.result .icon > .success { + color: #52c41a; +} +.result .icon > .error { + color: #f5222d; +} +.result .title { + color: rgba(0, 0, 0, 0.85); +} +.result .description { + color: rgba(0, 0, 0, 0.45); +} +.result .extra { + background: #fafafa; + border-radius: 2px; +} +.blockChecbox .item { + border-radius: 4px; +} +.blockChecbox .selectIcon { + color: @primary-color; +} +.color_block { + border-radius: 4px; +} +.title { + color: rgba(0, 0, 0, 0.85); +} +.handle { + background: @primary-color; + border-radius: 4px 0 0 4px; +} +.setting-drawer-index-handle { + /* 暂时不知道放哪解决 */ + background: @primary-color !important; +} +.themeColor .title { + color: rgba(0, 0, 0, 0.65); +} +.themeColor .colorBlock { + border-radius: 2px; + color: #fff; +} +.logo { +} +.logo h1 { + color: white; +} +.sider { + box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); +} +.sider.light { + box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05); + background-color: white; +} +.sider.light .logo { + background: white; + box-shadow: 1px 1px 0 0 #e8e8e8; +} +.sider.light .logo h1 { + color: @primary-color; +} +.sider.light :global(.ant-menu-light) { + border-right-color: transparent; +} +:global .drawer .drawer-content { + background: #001529; +} +.standardFormRow { + border-bottom: 1px dashed #e8e8e8; +} +.standardFormRow :global .ant-form-item-label label { + color: rgba(0, 0, 0, 0.65); +} +.standardFormRow .label { + color: rgba(0, 0, 0, 0.85); +} +.standardFormRowLast { + border: none; +} + +.head { + box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); +} +.head.light { + background-color: #fff; +} +.logo h1 { + color: #fff; +} +.light h1 { + color: #002140; +} +.trendItem .up { + color: #f5222d; +} +.trendItem .down { + color: #52c41a; +} +.trendItem.trendItemGrey .up, +.trendItem.trendItemGrey .down { + color: rgba(0, 0, 0, 0.65); +} +.trendItem.reverseColor .up { + color: #52c41a; +} +.trendItem.reverseColor .down { + color: #f5222d; +} +.container { + background: #f0f2f5; +} +.title { + color: rgba(0, 0, 0, 0.85); +} +.desc { + color: rgba(0, 0, 0, 0.45); +} +a.listItemMetaTitle { + color: rgba(0, 0, 0, 0.85); +} +.baseView .right .avatar_title { + color: rgba(0, 0, 0, 0.85); +} +.main { + background-color: #fff; +} +.main .leftmenu { + border-right: 1px solid #e8e8e8; +} +.main .leftmenu :global .ant-menu-inline { + border: none; +} +.main .right .title { + color: rgba(0, 0, 0, 0.85); +} +.main :global .ant-list-split .ant-list-item:last-child { + border-bottom: 1px solid #e8e8e8; +} +:global .ant-list-item-meta .taobao { + color: #ff4000; + border-radius: 4px; +} +:global .ant-list-item-meta .dingding { + background-color: #2eabff; + color: #fff; + border-radius: 4px; +} +:global .ant-list-item-meta .alipay { + color: #2eabff; + border-radius: 4px; +} +:global font.strong { + color: #52c41a; +} +:global font.medium { + color: #faad14; +} +:global font.weak { + color: #f5222d; +} + + + + +.trigger { + background: 'red'; +} +.desc { + color: rgba(0, 0, 0, 0.45); +} +.desc h3 { + color: rgba(0, 0, 0, 0.45); +} +.desc h4 { + color: rgba(0, 0, 0, 0.45); +} +.information .label { + color: rgba(0, 0, 0, 0.85); +} +.errorIcon { + color: #f5222d; +} +.errorListItem { + border-bottom: 1px solid #e8e8e8; +} +.errorListItem:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.errorListItem:last-child { + border: 0; +} +.errorListItem .errorIcon { + color: #f5222d; +} +.errorListItem .errorField { + color: rgba(0, 0, 0, 0.45); +} +.optional { + color: rgba(0, 0, 0, 0.45); +} +a.listItemMetaTitle { + color: rgba(0, 0, 0, 0.85); +} +.noData { + color: rgba(0, 0, 0, 0.25); +} +.heading { + color: rgba(0, 0, 0, 0.85); +} +.textSecondary { + color: rgba(0, 0, 0, 0.45); +} +.title { + color: rgba(0, 0, 0, 0.85); +} +.main .icon { + color: rgba(0, 0, 0, 0.2); +} +.main .icon:hover { + color: @primary-color; +} +.success { + color: #52c41a; +} +.warning { + color: #faad14; +} +.error { + color: #f5222d; +} +.progress-pass > .progress :global .ant-progress-bg { + background-color: #faad14; +} +html { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; +} +h1, +h2, +h3, +h4, +h5, +h6 { + color: rgba(0, 0, 0, 0.85); +} +abbr[title], +abbr[data-original-title] { + border-bottom: 0; +} +a { + color: @primary-color; + background-color: transparent; +} +a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +a:active { + color: color(~`colorPalette("@{primary-color}", 7)`); +} +a[disabled] { + color: rgba(0, 0, 0, 0.25); +} +img { + border-style: none; +} +table { + border-collapse: collapse; +} +caption { + color: rgba(0, 0, 0, 0.45); +} +input, +button, +select, +optgroup, +textarea { + color: inherit; +} +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; +} +fieldset { + border: 0; +} +legend { + color: inherit; +} +mark { + background-color: #feffe6; +} +::selection { + background: @primary-color; + color: #fff; +} +[ant-click-animating-without-extra-node]:after, +.ant-click-animating-node { + border-radius: inherit; + border: 0 solid @primary-color; +} +.ant-alert { + color: rgba(0, 0, 0, 0.65); + border-radius: 4px; +} +.ant-alert-success { + border: 1px solid #b7eb8f; + background-color: #f6ffed; +} +.ant-alert-success .ant-alert-icon { + color: #52c41a; +} +.ant-alert-info { + border: 1px solid color(~`colorPalette("@{primary-color}", 3)`); + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-alert-info .ant-alert-icon { + color: @primary-color; +} +.ant-alert-warning { + border: 1px solid #ffe58f; + background-color: #fffbe6; +} +.ant-alert-warning .ant-alert-icon { + color: #faad14; +} +.ant-alert-error { + border: 1px solid #ffa39e; + background-color: #fff1f0; +} +.ant-alert-error .ant-alert-icon { + color: #f5222d; +} +.ant-alert-close-icon .anticon-close { + color: rgba(0, 0, 0, 0.45); +} +.ant-alert-close-icon .anticon-close:hover { + color: #404040; +} +.ant-alert-with-description { + border-radius: 4px; + color: rgba(0, 0, 0, 0.65); +} +.ant-alert-with-description .ant-alert-message { + color: rgba(0, 0, 0, 0.85); +} +.ant-alert-banner { + border-radius: 0; + border: 0; +} +.ant-anchor { + color: rgba(0, 0, 0, 0.65); +} +.ant-anchor-wrapper { + background-color: #fff; +} +.ant-anchor-ink:before { + background-color: #e8e8e8; +} +.ant-anchor-ink-ball { + border-radius: 8px; + border: 2px solid @primary-color; + background-color: #fff; +} +.ant-anchor-link-title { + color: rgba(0, 0, 0, 0.65); +} +.ant-anchor-link-active > .ant-anchor-link-title { + color: @primary-color; +} +.ant-select-auto-complete { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-auto-complete.ant-select .ant-select-selection { + border: 0; + box-shadow: none; +} +.ant-select-auto-complete.ant-select .ant-input { + background: transparent; + border-width: 1px; +} +.ant-select-auto-complete.ant-select .ant-input:focus, +.ant-select-auto-complete.ant-select .ant-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-avatar { + color: rgba(0, 0, 0, 0.65); + background: #ccc; + color: #fff; + border-radius: 50%; +} +.ant-avatar-image { + background: transparent; +} +.ant-avatar-lg { + border-radius: 50%; +} +.ant-avatar-sm { + border-radius: 50%; +} +.ant-avatar-square { + border-radius: 4px; +} +.ant-back-top { + color: rgba(0, 0, 0, 0.65); +} +.ant-back-top-content { + border-radius: 20px; + background-color: rgba(0, 0, 0, 0.45); + color: #fff; +} +.ant-back-top-content:hover { + background-color: rgba(0, 0, 0, 0.65); +} +.ant-back-top-icon { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAoCAYAAACWwljjAAAABGdBTUEAALGPC/xhBQAAAbtJREFUWAntmMtKw0AUhhMvS5cuxILgQlRUpIggIoKIIoigG1eC+AA+jo+i6FIXBfeuXIgoeKVeitVWJX5HWhhDksnUpp3FDPyZk3Nm5nycmZKkXhAEOXSA3lG7muTeRzmfy6HneUvIhnYkQK+Q9NhAA0Opg0vBEhjBKHiyb8iGMyQMOYuK41BcBSypAL+MYXSKjtFAW7EAGEO3qN4uMQbbAkXiSfRQJ1H6a+yhlkKRcAoVFYiweYNjtCVQJJpBz2GCiPt7fBOZQpFgDpUikse5HgnkM4Fi4QX0Fpc5wf9EbLqpUCy4jMoJSXWhFwbMNgWKhVbRhy5jirhs9fy/oFhgHVVTJEs7RLZ8sSEoJm6iz7SZDMbJ+/OKERQTttCXQRLToRUmrKWCYuA2+jbN0MB4OQobYShfdTCgn/sL1K36M7TLrN3n+758aPy2rrpR6+/od5E8tf/A1uLS9aId5T7J3CNYihkQ4D9PiMdMC7mp4rjB9kjFjZp8BlnVHJBuO1yFXIV0FdDF3RlyFdJVQBdv5AxVdIsq8apiZ2PyYO1EVykesGfZEESsCkweyR8MUW+V8uJ1gkYipmpdP1pm2aJVPEGzAAAAAElFTkSuQmCC) 100%/100% no-repeat; +} +.ant-badge { + color: rgba(0, 0, 0, 0.65); + color: unset; +} +.ant-badge-count { + border-radius: 10px; + background: #f5222d; + color: #fff; + box-shadow: 0 0 0 1px #fff; +} +.ant-badge-count a, +.ant-badge-count a:hover { + color: #fff; +} +.ant-badge-dot { + border-radius: 100%; + background: #f5222d; + box-shadow: 0 0 0 1px #fff; +} +.ant-badge-status-dot { + border-radius: 50%; +} +.ant-badge-status-success { + background-color: #52c41a; +} +.ant-badge-status-processing { + background-color: @primary-color; +} +.ant-badge-status-processing:after { + border-radius: 50%; + border: 1px solid @primary-color; +} +.ant-badge-status-default { + background-color: #d9d9d9; +} +.ant-badge-status-error { + background-color: #f5222d; +} +.ant-badge-status-warning { + background-color: #faad14; +} +.ant-badge-status-text { + color: rgba(0, 0, 0, 0.65); +} +.ant-breadcrumb { + color: rgba(0, 0, 0, 0.65); + color: rgba(0, 0, 0, 0.45); +} +.ant-breadcrumb a { + color: rgba(0, 0, 0, 0.45); +} +.ant-breadcrumb a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-breadcrumb > span:last-child { + color: rgba(0, 0, 0, 0.65); +} +.ant-breadcrumb-separator { + color: rgba(0, 0, 0, 0.45); +} +.ant-btn { + background-image: none; + border: 1px solid transparent; + border-radius: 4px; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border-color: #d9d9d9; +} +.ant-btn:not([disabled]):active { + box-shadow: none; +} +.ant-btn-lg { + border-radius: 4px; +} +.ant-btn-sm { + border-radius: 4px; +} +.ant-btn > a:only-child { + color: currentColor; +} +.ant-btn > a:only-child:after { + background: transparent; +} +.ant-btn:hover, +.ant-btn:focus { + color: color(~`colorPalette("@{primary-color}", 5)`); + background-color: #fff; + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn:hover > a:only-child, +.ant-btn:focus > a:only-child { + color: currentColor; +} +.ant-btn:hover > a:only-child:after, +.ant-btn:focus > a:only-child:after { + background: transparent; +} +.ant-btn:active, +.ant-btn.active { + color: color(~`colorPalette("@{primary-color}", 7)`); + background-color: #fff; + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-btn:active > a:only-child, +.ant-btn.active > a:only-child { + color: currentColor; +} +.ant-btn:active > a:only-child:after, +.ant-btn.active > a:only-child:after { + background: transparent; +} +.ant-btn.disabled, +.ant-btn[disabled], +.ant-btn.disabled:hover, +.ant-btn[disabled]:hover, +.ant-btn.disabled:focus, +.ant-btn[disabled]:focus, +.ant-btn.disabled:active, +.ant-btn[disabled]:active, +.ant-btn.disabled.active, +.ant-btn[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn.disabled > a:only-child, +.ant-btn[disabled] > a:only-child, +.ant-btn.disabled:hover > a:only-child, +.ant-btn[disabled]:hover > a:only-child, +.ant-btn.disabled:focus > a:only-child, +.ant-btn[disabled]:focus > a:only-child, +.ant-btn.disabled:active > a:only-child, +.ant-btn[disabled]:active > a:only-child, +.ant-btn.disabled.active > a:only-child, +.ant-btn[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn.disabled > a:only-child:after, +.ant-btn[disabled] > a:only-child:after, +.ant-btn.disabled:hover > a:only-child:after, +.ant-btn[disabled]:hover > a:only-child:after, +.ant-btn.disabled:focus > a:only-child:after, +.ant-btn[disabled]:focus > a:only-child:after, +.ant-btn.disabled:active > a:only-child:after, +.ant-btn[disabled]:active > a:only-child:after, +.ant-btn.disabled.active > a:only-child:after, +.ant-btn[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn:hover, +.ant-btn:focus, +.ant-btn:active, +.ant-btn.active { + background: #fff; +} +.ant-btn-primary { + color: #fff; + background-color: @primary-color; + border-color: @primary-color; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035); +} +.ant-btn-primary > a:only-child { + color: currentColor; +} +.ant-btn-primary > a:only-child:after { + background: transparent; +} +.ant-btn-primary:hover, +.ant-btn-primary:focus { + color: #fff; + background-color: color(~`colorPalette("@{primary-color}", 5)`); + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-primary:hover > a:only-child, +.ant-btn-primary:focus > a:only-child { + color: currentColor; +} +.ant-btn-primary:hover > a:only-child:after, +.ant-btn-primary:focus > a:only-child:after { + background: transparent; +} +.ant-btn-primary:active, +.ant-btn-primary.active { + color: #fff; + background-color: color(~`colorPalette("@{primary-color}", 7)`); + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-btn-primary:active > a:only-child, +.ant-btn-primary.active > a:only-child { + color: currentColor; +} +.ant-btn-primary:active > a:only-child:after, +.ant-btn-primary.active > a:only-child:after { + background: transparent; +} +.ant-btn-primary.disabled, +.ant-btn-primary[disabled], +.ant-btn-primary.disabled:hover, +.ant-btn-primary[disabled]:hover, +.ant-btn-primary.disabled:focus, +.ant-btn-primary[disabled]:focus, +.ant-btn-primary.disabled:active, +.ant-btn-primary[disabled]:active, +.ant-btn-primary.disabled.active, +.ant-btn-primary[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-primary.disabled > a:only-child, +.ant-btn-primary[disabled] > a:only-child, +.ant-btn-primary.disabled:hover > a:only-child, +.ant-btn-primary[disabled]:hover > a:only-child, +.ant-btn-primary.disabled:focus > a:only-child, +.ant-btn-primary[disabled]:focus > a:only-child, +.ant-btn-primary.disabled:active > a:only-child, +.ant-btn-primary[disabled]:active > a:only-child, +.ant-btn-primary.disabled.active > a:only-child, +.ant-btn-primary[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-primary.disabled > a:only-child:after, +.ant-btn-primary[disabled] > a:only-child:after, +.ant-btn-primary.disabled:hover > a:only-child:after, +.ant-btn-primary[disabled]:hover > a:only-child:after, +.ant-btn-primary.disabled:focus > a:only-child:after, +.ant-btn-primary[disabled]:focus > a:only-child:after, +.ant-btn-primary.disabled:active > a:only-child:after, +.ant-btn-primary[disabled]:active > a:only-child:after, +.ant-btn-primary.disabled.active > a:only-child:after, +.ant-btn-primary[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child) { + border-right-color: color(~`colorPalette("@{primary-color}", 5)`); + border-left-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled { + border-color: #d9d9d9; +} +.ant-btn-group .ant-btn-primary:first-child:not(:last-child) { + border-right-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled] { + border-right-color: #d9d9d9; +} +.ant-btn-group .ant-btn-primary:last-child:not(:first-child), +.ant-btn-group .ant-btn-primary + .ant-btn-primary { + border-left-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled], +.ant-btn-group .ant-btn-primary + .ant-btn-primary[disabled] { + border-left-color: #d9d9d9; +} +.ant-btn-ghost { + color: rgba(0, 0, 0, 0.65); + background-color: transparent; + border-color: #d9d9d9; +} +.ant-btn-ghost > a:only-child { + color: currentColor; +} +.ant-btn-ghost > a:only-child:after { + background: transparent; +} +.ant-btn-ghost:hover, +.ant-btn-ghost:focus { + color: color(~`colorPalette("@{primary-color}", 5)`); + background-color: transparent; + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-ghost:hover > a:only-child, +.ant-btn-ghost:focus > a:only-child { + color: currentColor; +} +.ant-btn-ghost:hover > a:only-child:after, +.ant-btn-ghost:focus > a:only-child:after { + background: transparent; +} +.ant-btn-ghost:active, +.ant-btn-ghost.active { + color: color(~`colorPalette("@{primary-color}", 7)`); + background-color: transparent; + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-btn-ghost:active > a:only-child, +.ant-btn-ghost.active > a:only-child { + color: currentColor; +} +.ant-btn-ghost:active > a:only-child:after, +.ant-btn-ghost.active > a:only-child:after { + background: transparent; +} +.ant-btn-ghost.disabled, +.ant-btn-ghost[disabled], +.ant-btn-ghost.disabled:hover, +.ant-btn-ghost[disabled]:hover, +.ant-btn-ghost.disabled:focus, +.ant-btn-ghost[disabled]:focus, +.ant-btn-ghost.disabled:active, +.ant-btn-ghost[disabled]:active, +.ant-btn-ghost.disabled.active, +.ant-btn-ghost[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-ghost.disabled > a:only-child, +.ant-btn-ghost[disabled] > a:only-child, +.ant-btn-ghost.disabled:hover > a:only-child, +.ant-btn-ghost[disabled]:hover > a:only-child, +.ant-btn-ghost.disabled:focus > a:only-child, +.ant-btn-ghost[disabled]:focus > a:only-child, +.ant-btn-ghost.disabled:active > a:only-child, +.ant-btn-ghost[disabled]:active > a:only-child, +.ant-btn-ghost.disabled.active > a:only-child, +.ant-btn-ghost[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-ghost.disabled > a:only-child:after, +.ant-btn-ghost[disabled] > a:only-child:after, +.ant-btn-ghost.disabled:hover > a:only-child:after, +.ant-btn-ghost[disabled]:hover > a:only-child:after, +.ant-btn-ghost.disabled:focus > a:only-child:after, +.ant-btn-ghost[disabled]:focus > a:only-child:after, +.ant-btn-ghost.disabled:active > a:only-child:after, +.ant-btn-ghost[disabled]:active > a:only-child:after, +.ant-btn-ghost.disabled.active > a:only-child:after, +.ant-btn-ghost[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn-dashed { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border-color: #d9d9d9; + border-style: dashed; +} +.ant-btn-dashed > a:only-child { + color: currentColor; +} +.ant-btn-dashed > a:only-child:after { + background: transparent; +} +.ant-btn-dashed:hover, +.ant-btn-dashed:focus { + color: color(~`colorPalette("@{primary-color}", 5)`); + background-color: #fff; + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-dashed:hover > a:only-child, +.ant-btn-dashed:focus > a:only-child { + color: currentColor; +} +.ant-btn-dashed:hover > a:only-child:after, +.ant-btn-dashed:focus > a:only-child:after { + background: transparent; +} +.ant-btn-dashed:active, +.ant-btn-dashed.active { + color: color(~`colorPalette("@{primary-color}", 7)`); + background-color: #fff; + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-btn-dashed:active > a:only-child, +.ant-btn-dashed.active > a:only-child { + color: currentColor; +} +.ant-btn-dashed:active > a:only-child:after, +.ant-btn-dashed.active > a:only-child:after { + background: transparent; +} +.ant-btn-dashed.disabled, +.ant-btn-dashed[disabled], +.ant-btn-dashed.disabled:hover, +.ant-btn-dashed[disabled]:hover, +.ant-btn-dashed.disabled:focus, +.ant-btn-dashed[disabled]:focus, +.ant-btn-dashed.disabled:active, +.ant-btn-dashed[disabled]:active, +.ant-btn-dashed.disabled.active, +.ant-btn-dashed[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-dashed.disabled > a:only-child, +.ant-btn-dashed[disabled] > a:only-child, +.ant-btn-dashed.disabled:hover > a:only-child, +.ant-btn-dashed[disabled]:hover > a:only-child, +.ant-btn-dashed.disabled:focus > a:only-child, +.ant-btn-dashed[disabled]:focus > a:only-child, +.ant-btn-dashed.disabled:active > a:only-child, +.ant-btn-dashed[disabled]:active > a:only-child, +.ant-btn-dashed.disabled.active > a:only-child, +.ant-btn-dashed[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-dashed.disabled > a:only-child:after, +.ant-btn-dashed[disabled] > a:only-child:after, +.ant-btn-dashed.disabled:hover > a:only-child:after, +.ant-btn-dashed[disabled]:hover > a:only-child:after, +.ant-btn-dashed.disabled:focus > a:only-child:after, +.ant-btn-dashed[disabled]:focus > a:only-child:after, +.ant-btn-dashed.disabled:active > a:only-child:after, +.ant-btn-dashed[disabled]:active > a:only-child:after, +.ant-btn-dashed.disabled.active > a:only-child:after, +.ant-btn-dashed[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn-danger { + color: #f5222d; + background-color: #f5f5f5; + border-color: #d9d9d9; +} +.ant-btn-danger > a:only-child { + color: currentColor; +} +.ant-btn-danger > a:only-child:after { + background: transparent; +} +.ant-btn-danger:hover { + color: #fff; + background-color: #ff4d4f; + border-color: #ff4d4f; +} +.ant-btn-danger:hover > a:only-child { + color: currentColor; +} +.ant-btn-danger:hover > a:only-child:after { + background: transparent; +} +.ant-btn-danger:focus { + color: #ff4d4f; + background-color: #fff; + border-color: #ff4d4f; +} +.ant-btn-danger:focus > a:only-child { + color: currentColor; +} +.ant-btn-danger:focus > a:only-child:after { + background: transparent; +} +.ant-btn-danger:active, +.ant-btn-danger.active { + color: #fff; + background-color: #cf1322; + border-color: #cf1322; +} +.ant-btn-danger:active > a:only-child, +.ant-btn-danger.active > a:only-child { + color: currentColor; +} +.ant-btn-danger:active > a:only-child:after, +.ant-btn-danger.active > a:only-child:after { + background: transparent; +} +.ant-btn-danger.disabled, +.ant-btn-danger[disabled], +.ant-btn-danger.disabled:hover, +.ant-btn-danger[disabled]:hover, +.ant-btn-danger.disabled:focus, +.ant-btn-danger[disabled]:focus, +.ant-btn-danger.disabled:active, +.ant-btn-danger[disabled]:active, +.ant-btn-danger.disabled.active, +.ant-btn-danger[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-danger.disabled > a:only-child, +.ant-btn-danger[disabled] > a:only-child, +.ant-btn-danger.disabled:hover > a:only-child, +.ant-btn-danger[disabled]:hover > a:only-child, +.ant-btn-danger.disabled:focus > a:only-child, +.ant-btn-danger[disabled]:focus > a:only-child, +.ant-btn-danger.disabled:active > a:only-child, +.ant-btn-danger[disabled]:active > a:only-child, +.ant-btn-danger.disabled.active > a:only-child, +.ant-btn-danger[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-danger.disabled > a:only-child:after, +.ant-btn-danger[disabled] > a:only-child:after, +.ant-btn-danger.disabled:hover > a:only-child:after, +.ant-btn-danger[disabled]:hover > a:only-child:after, +.ant-btn-danger.disabled:focus > a:only-child:after, +.ant-btn-danger[disabled]:focus > a:only-child:after, +.ant-btn-danger.disabled:active > a:only-child:after, +.ant-btn-danger[disabled]:active > a:only-child:after, +.ant-btn-danger.disabled.active > a:only-child:after, +.ant-btn-danger[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn-circle, +.ant-btn-circle-outline { + border-radius: 50%; +} +.ant-btn-circle.ant-btn-lg, +.ant-btn-circle-outline.ant-btn-lg { + border-radius: 50%; +} +.ant-btn-circle.ant-btn-sm, +.ant-btn-circle-outline.ant-btn-sm { + border-radius: 50%; +} +.ant-btn:before { + background: #fff; + border-radius: inherit; +} +.ant-btn-group-lg > .ant-btn, +.ant-btn-group-lg > span > .ant-btn { + border-radius: 0; +} +.ant-btn-group-sm > .ant-btn, +.ant-btn-group-sm > span > .ant-btn { + border-radius: 0; +} +.ant-btn-group .ant-btn-primary + .ant-btn:not(.ant-btn-primary):not([disabled]) { + border-left-color: transparent; +} +.ant-btn-group .ant-btn { + border-radius: 0; +} +.ant-btn-group > .ant-btn:only-child { + border-radius: 4px; +} +.ant-btn-group > span:only-child > .ant-btn { + border-radius: 4px; +} +.ant-btn-group > .ant-btn:first-child:not(:last-child), +.ant-btn-group > span:first-child:not(:last-child) > .ant-btn { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.ant-btn-group > .ant-btn:last-child:not(:first-child), +.ant-btn-group > span:last-child:not(:first-child) > .ant-btn { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.ant-btn-group-sm > .ant-btn:only-child { + border-radius: 4px; +} +.ant-btn-group-sm > span:only-child > .ant-btn { + border-radius: 4px; +} +.ant-btn-group-sm > .ant-btn:first-child:not(:last-child), +.ant-btn-group-sm > span:first-child:not(:last-child) > .ant-btn { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.ant-btn-group-sm > .ant-btn:last-child:not(:first-child), +.ant-btn-group-sm > span:last-child:not(:first-child) > .ant-btn { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.ant-btn-group > .ant-btn-group:not(:first-child):not(:last-child) > .ant-btn { + border-radius: 0; +} +.ant-btn-group > .ant-btn-group:first-child:not(:last-child) > .ant-btn:last-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ant-btn-group > .ant-btn-group:last-child:not(:first-child) > .ant-btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-btn-background-ghost { + background: transparent !important; + border-color: #fff; + color: #fff; +} +.ant-btn-background-ghost.ant-btn-primary { + color: @primary-color; + background-color: transparent; + border-color: @primary-color; +} +.ant-btn-background-ghost.ant-btn-primary > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-primary:hover, +.ant-btn-background-ghost.ant-btn-primary:focus { + color: color(~`colorPalette("@{primary-color}", 5)`); + background-color: transparent; + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-primary:active, +.ant-btn-background-ghost.ant-btn-primary.active { + color: color(~`colorPalette("@{primary-color}", 7)`); + background-color: transparent; + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-btn-background-ghost.ant-btn-primary:active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.active > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-primary.disabled, +.ant-btn-background-ghost.ant-btn-primary[disabled], +.ant-btn-background-ghost.ant-btn-primary.disabled:hover, +.ant-btn-background-ghost.ant-btn-primary[disabled]:hover, +.ant-btn-background-ghost.ant-btn-primary.disabled:focus, +.ant-btn-background-ghost.ant-btn-primary[disabled]:focus, +.ant-btn-background-ghost.ant-btn-primary.disabled:active, +.ant-btn-background-ghost.ant-btn-primary[disabled]:active, +.ant-btn-background-ghost.ant-btn-primary.disabled.active, +.ant-btn-background-ghost.ant-btn-primary[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-background-ghost.ant-btn-primary.disabled > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled:active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled.active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary.disabled > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled.active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger { + color: #f5222d; + background-color: transparent; + border-color: #f5222d; +} +.ant-btn-background-ghost.ant-btn-danger > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger:hover, +.ant-btn-background-ghost.ant-btn-danger:focus { + color: #ff4d4f; + background-color: transparent; + border-color: #ff4d4f; +} +.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger:active, +.ant-btn-background-ghost.ant-btn-danger.active { + color: #cf1322; + background-color: transparent; + border-color: #cf1322; +} +.ant-btn-background-ghost.ant-btn-danger:active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.active > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger.disabled, +.ant-btn-background-ghost.ant-btn-danger[disabled], +.ant-btn-background-ghost.ant-btn-danger.disabled:hover, +.ant-btn-background-ghost.ant-btn-danger[disabled]:hover, +.ant-btn-background-ghost.ant-btn-danger.disabled:focus, +.ant-btn-background-ghost.ant-btn-danger[disabled]:focus, +.ant-btn-background-ghost.ant-btn-danger.disabled:active, +.ant-btn-background-ghost.ant-btn-danger[disabled]:active, +.ant-btn-background-ghost.ant-btn-danger.disabled.active, +.ant-btn-background-ghost.ant-btn-danger[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-background-ghost.ant-btn-danger.disabled > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled:active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled.active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger.disabled > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled.active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled].active > a:only-child:after { + background: transparent; +} +.christmas.ant-btn-primary:before { + background: url(data:image/png;base64,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) no-repeat 50% 0; + background-size: 64px; +} +.christmas.ant-btn-primary.ant-btn-lg:before { + background-size: 72px; +} +.christmas.ant-btn-primary.ant-btn-sm:before { + background-size: 56px; +} +.ant-fullcalendar { + color: rgba(0, 0, 0, 0.65); + border-top: 1px solid #d9d9d9; +} +.ant-fullcalendar table { + border-collapse: collapse; + background-color: transparent; +} +.ant-fullcalendar table, +.ant-fullcalendar th, +.ant-fullcalendar td { + border: 0; +} +.ant-fullcalendar-calendar-table { + border-spacing: 0; +} +.ant-fullcalendar-value { + color: rgba(0, 0, 0, 0.65); + border-radius: 2px; + background: transparent; +} +.ant-fullcalendar-value:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-fullcalendar-value:active { + background: @primary-color; + color: #fff; +} +.ant-fullcalendar-today .ant-fullcalendar-value, +.ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value { + box-shadow: 0 0 0 1px @primary-color inset; +} +.ant-fullcalendar-selected-day .ant-fullcalendar-value, +.ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value { + background: @primary-color; + color: #fff; +} +.ant-fullcalendar-disabled-cell-first-of-row .ant-fullcalendar-value { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.ant-fullcalendar-disabled-cell-last-of-row .ant-fullcalendar-value { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.ant-fullcalendar-last-month-cell .ant-fullcalendar-value, +.ant-fullcalendar-next-month-btn-day .ant-fullcalendar-value { + color: rgba(0, 0, 0, 0.25); +} +.ant-fullcalendar-month-panel-table { + border-collapse: separate; +} +.ant-fullcalendar-fullscreen { + border-top: 0; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month, +.ant-fullcalendar-fullscreen .ant-fullcalendar-date { + color: rgba(0, 0, 0, 0.65); + border-top: 2px solid #e8e8e8; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month:hover, +.ant-fullcalendar-fullscreen .ant-fullcalendar-date:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month:active, +.ant-fullcalendar-fullscreen .ant-fullcalendar-date:active { + background: color(~`colorPalette("@{primary-color}", 2)`); +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-value { + background: transparent; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value { + color: rgba(0, 0, 0, 0.65); +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-month, +.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-date { + border-top-color: @primary-color; + background: transparent; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value, +.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value { + box-shadow: none; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-month, +.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-date { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value, +.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-value { + color: @primary-color; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-last-month-cell .ant-fullcalendar-date, +.ant-fullcalendar-fullscreen .ant-fullcalendar-next-month-btn-day .ant-fullcalendar-date { + color: rgba(0, 0, 0, 0.25); +} +.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date, +.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date:hover { + background: transparent; +} +.ant-fullcalendar-disabled-cell .ant-fullcalendar-value { + color: rgba(0, 0, 0, 0.25); + border-radius: 0; +} +.ant-card { + color: rgba(0, 0, 0, 0.65); + background: #fff; + border-radius: 2px; +} +.ant-card-hoverable:hover { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09); + border-color: rgba(0, 0, 0, 0.09); +} +.ant-card-bordered { + border: 1px solid #e8e8e8; +} +.ant-card-head { + background: transparent; + border-bottom: 1px solid #e8e8e8; + border-radius: 2px 2px 0 0; + color: rgba(0, 0, 0, 0.85); +} +.ant-card-head .ant-tabs { + color: rgba(0, 0, 0, 0.65); +} +.ant-card-head .ant-tabs-bar { + border-bottom: 1px solid #e8e8e8; +} +.ant-card-extra { + color: rgba(0, 0, 0, 0.65); +} +.ant-card-grid { + border-radius: 0; + border: 0; + box-shadow: 1px 0 0 0 #e8e8e8, 0 1px 0 0 #e8e8e8, 1px 1px 0 0 #e8e8e8, 1px 0 0 0 #e8e8e8 inset, 0 1px 0 0 #e8e8e8 inset; +} +.ant-card-grid:hover { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-card-cover img { + border-radius: 2px 2px 0 0; +} +.ant-card-actions { + border-top: 1px solid #e8e8e8; + background: #fafafa; +} +.ant-card-actions > li { + color: rgba(0, 0, 0, 0.45); +} +.ant-card-actions > li > span:hover { + color: @primary-color; +} +.ant-card-actions > li > span a { + color: rgba(0, 0, 0, 0.45); +} +.ant-card-actions > li > span a:hover { + color: @primary-color; +} +.ant-card-actions > li:not(:last-child) { + border-right: 1px solid #e8e8e8; +} +.ant-card-type-inner .ant-card-head { + background: #fafafa; +} +.ant-card-meta-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-card-meta-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-card-loading-block { + border-radius: 2px; + background: linear-gradient(90deg, rgba(207, 216, 220, 0.2), rgba(207, 216, 220, 0.4), rgba(207, 216, 220, 0.2)); + background-size: 600% 600%; +} +.ant-carousel { + color: rgba(0, 0, 0, 0.65); +} +.ant-carousel .slick-slider { + -webkit-tap-highlight-color: transparent; +} +.ant-carousel .slick-vertical .slick-slide { + border: 1px solid transparent; +} +.ant-carousel .slick-prev, +.ant-carousel .slick-next { + background: transparent; + color: transparent; + border: 0; +} +.ant-carousel .slick-prev:hover, +.ant-carousel .slick-next:hover, +.ant-carousel .slick-prev:focus, +.ant-carousel .slick-next:focus { + background: transparent; + color: transparent; +} +.ant-carousel .slick-dots li button { + border: 0; + background: #fff; + border-radius: 1px; + color: transparent; +} +.ant-carousel .slick-dots li.slick-active button { + background: #fff; +} +.ant-cascader { + color: rgba(0, 0, 0, 0.65); +} +.ant-cascader-input.ant-input { + background-color: transparent !important; +} +.ant-cascader-picker { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border-radius: 4px; +} +.ant-cascader-picker-with-value .ant-cascader-picker-label { + color: transparent; +} +.ant-cascader-picker-disabled { + background: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-picker:focus .ant-cascader-input { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-cascader-picker-show-search.ant-cascader-picker-focused { + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-picker-clear { + background: #fff; + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-picker-clear:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-cascader-picker-arrow { + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-menus { + background: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-cascader-menu { + border-right: 1px solid #e8e8e8; +} +.ant-cascader-menu:first-child { + border-radius: 4px 0 0 4px; +} +.ant-cascader-menu:last-child { + border-right-color: transparent; + border-radius: 0 4px 4px 0; +} +.ant-cascader-menu:only-child { + border-radius: 4px; +} +.ant-cascader-menu-item:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-cascader-menu-item-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-menu-item-disabled:hover { + background: transparent; +} +.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled), +.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover { + background: #f5f5f5; +} +.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon, +.ant-cascader-menu-item-expand .ant-cascader-menu-item-loading-icon { + color: rgba(0, 0, 0, 0.45); +} +.ant-cascader-menu-item .ant-cascader-menu-item-keyword { + color: #f5222d; +} +.ant-checkbox { + color: rgba(0, 0, 0, 0.65); +} +.ant-checkbox-wrapper:hover .ant-checkbox-inner, +.ant-checkbox:hover .ant-checkbox-inner, +.ant-checkbox-input:focus + .ant-checkbox-inner { + border-color: @primary-color; +} +.ant-checkbox-checked:after { + border-radius: 2px; + border: 1px solid @primary-color; +} +.ant-checkbox-inner { + border: 1px solid #d9d9d9; + border-radius: 2px; + background-color: #fff; +} +.ant-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-checkbox-indeterminate .ant-checkbox-inner:after { + border: 0; + background-color: @primary-color; +} +.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-checkbox-checked .ant-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-checkbox-checked .ant-checkbox-inner { + background-color: @primary-color; + border-color: @primary-color; +} +.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-checkbox-disabled .ant-checkbox-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-checkbox-disabled .ant-checkbox-inner:after { + border-color: #f5f5f5; +} +.ant-checkbox-disabled + span { + color: rgba(0, 0, 0, 0.25); +} +.ant-checkbox-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-checkbox-group { + color: rgba(0, 0, 0, 0.65); +} +.ant-collapse { + color: rgba(0, 0, 0, 0.65); + background-color: #fafafa; + border-radius: 4px; + border: 1px solid #d9d9d9; + border-bottom: 0; +} +.ant-collapse > .ant-collapse-item { + border-bottom: 1px solid #d9d9d9; +} +.ant-collapse > .ant-collapse-item:last-child, +.ant-collapse > .ant-collapse-item:last-child > .ant-collapse-header { + border-radius: 0 0 4px 4px; +} +.ant-collapse > .ant-collapse-item > .ant-collapse-header { + color: rgba(0, 0, 0, 0.85); +} +.ant-collapse-content { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border-top: 1px solid #d9d9d9; +} +.ant-collapse-item:last-child > .ant-collapse-content { + border-radius: 0 0 4px 4px; +} +.ant-collapse-borderless { + background-color: #fff; + border: 0; +} +.ant-collapse-borderless > .ant-collapse-item { + border-bottom: 1px solid #d9d9d9; +} +.ant-collapse-borderless > .ant-collapse-item:last-child, +.ant-collapse-borderless > .ant-collapse-item:last-child .ant-collapse-header { + border-radius: 0; +} +.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content { + background-color: transparent; + border-top: 0; +} +.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header, +.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header > .arrow { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-picker-container { + color: rgba(0, 0, 0, 0.65); +} +.ant-calendar-picker { + color: rgba(0, 0, 0, 0.65); +} +.ant-calendar-picker:hover .ant-calendar-picker-input:not(.ant-input-disabled) { + border-color: @primary-color; +} +.ant-calendar-picker:focus .ant-calendar-picker-input:not(.ant-input-disabled) { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-calendar-picker-clear { + color: rgba(0, 0, 0, 0.25); + background: #fff; +} +.ant-calendar-picker-clear:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-picker-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar { + border: 1px solid #fff; + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + background-clip: padding-box; +} +.ant-calendar-input-wrap { + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-input { + border: 0; + color: rgba(0, 0, 0, 0.65); + background: #fff; +} +.ant-calendar-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-calendar-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-header { + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-header a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar-header .ant-calendar-century-select, +.ant-calendar-header .ant-calendar-decade-select, +.ant-calendar-header .ant-calendar-year-select, +.ant-calendar-header .ant-calendar-month-select { + color: rgba(0, 0, 0, 0.85); +} +.ant-calendar-header .ant-calendar-prev-century-btn, +.ant-calendar-header .ant-calendar-next-century-btn, +.ant-calendar-header .ant-calendar-prev-decade-btn, +.ant-calendar-header .ant-calendar-next-decade-btn, +.ant-calendar-header .ant-calendar-prev-month-btn, +.ant-calendar-header .ant-calendar-next-month-btn, +.ant-calendar-header .ant-calendar-prev-year-btn, +.ant-calendar-header .ant-calendar-next-year-btn { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar table { + border-collapse: collapse; + background-color: transparent; +} +.ant-calendar table, +.ant-calendar th, +.ant-calendar td { + border: 0; +} +.ant-calendar-calendar-table { + border-spacing: 0; +} +.ant-calendar-date { + color: rgba(0, 0, 0, 0.65); + border-radius: 2px; + border: 1px solid transparent; + background: transparent; +} +.ant-calendar-date:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-calendar-date:active { + color: #fff; + background: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar-today .ant-calendar-date { + border-color: @primary-color; + color: @primary-color; +} +.ant-calendar-last-month-cell .ant-calendar-date, +.ant-calendar-next-month-btn-day .ant-calendar-date { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-selected-day .ant-calendar-date { + background: #d1e9ff; +} +.ant-calendar-selected-date .ant-calendar-date, +.ant-calendar-selected-start-date .ant-calendar-date, +.ant-calendar-selected-end-date .ant-calendar-date { + background: @primary-color; + color: #fff; + border: 1px solid transparent; +} +.ant-calendar-selected-date .ant-calendar-date:hover, +.ant-calendar-selected-start-date .ant-calendar-date:hover, +.ant-calendar-selected-end-date .ant-calendar-date:hover { + background: @primary-color; +} +.ant-calendar-disabled-cell .ant-calendar-date { + color: #bcbcbc; + background: #f5f5f5; + border-radius: 0; + border: 1px solid transparent; +} +.ant-calendar-disabled-cell .ant-calendar-date:hover { + background: #f5f5f5; +} +.ant-calendar-disabled-cell.ant-calendar-today .ant-calendar-date:before { + border: 1px solid #bcbcbc; + border-radius: 2px; +} +.ant-calendar-disabled-cell-first-of-row .ant-calendar-date { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.ant-calendar-disabled-cell-last-of-row .ant-calendar-date { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.ant-calendar-footer { + border-top: 1px solid #e8e8e8; +} +.ant-calendar-footer:empty { + border-top: 0; +} +.ant-calendar .ant-calendar-today-btn-disabled, +.ant-calendar .ant-calendar-clear-btn-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar .ant-calendar-clear-btn:after { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar .ant-calendar-clear-btn:hover:after { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar .ant-calendar-ok-btn { + background-image: none; + border: 1px solid transparent; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); + color: #fff; + background-color: @primary-color; + border-color: @primary-color; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035); + border-radius: 4px; +} +.ant-calendar .ant-calendar-ok-btn:not([disabled]):active { + box-shadow: none; +} +.ant-calendar .ant-calendar-ok-btn-lg { + border-radius: 4px; +} +.ant-calendar .ant-calendar-ok-btn-sm { + border-radius: 4px; +} +.ant-calendar .ant-calendar-ok-btn > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn > a:only-child:after { + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn:hover, +.ant-calendar .ant-calendar-ok-btn:focus { + color: #fff; + background-color: color(~`colorPalette("@{primary-color}", 5)`); + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar .ant-calendar-ok-btn:hover > a:only-child, +.ant-calendar .ant-calendar-ok-btn:focus > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn:hover > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn:focus > a:only-child:after { + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn:active, +.ant-calendar .ant-calendar-ok-btn.active { + color: #fff; + background-color: color(~`colorPalette("@{primary-color}", 7)`); + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-calendar .ant-calendar-ok-btn:active > a:only-child, +.ant-calendar .ant-calendar-ok-btn.active > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn:active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.active > a:only-child:after { + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn.disabled, +.ant-calendar .ant-calendar-ok-btn[disabled], +.ant-calendar .ant-calendar-ok-btn.disabled:hover, +.ant-calendar .ant-calendar-ok-btn[disabled]:hover, +.ant-calendar .ant-calendar-ok-btn.disabled:focus, +.ant-calendar .ant-calendar-ok-btn[disabled]:focus, +.ant-calendar .ant-calendar-ok-btn.disabled:active, +.ant-calendar .ant-calendar-ok-btn[disabled]:active, +.ant-calendar .ant-calendar-ok-btn.disabled.active, +.ant-calendar .ant-calendar-ok-btn[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-calendar .ant-calendar-ok-btn.disabled > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled] > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled:hover > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled]:hover > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled:focus > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled]:focus > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled:active > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled]:active > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled.active > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled].active > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn.disabled > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled] > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled:hover > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled]:hover > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled:focus > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled]:focus > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled:active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled]:active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled.active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled].active > a:only-child:after { + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn-disabled { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; +} +.ant-calendar .ant-calendar-ok-btn-disabled > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn-disabled > a:only-child:after { + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; +} +.ant-calendar .ant-calendar-ok-btn-disabled:hover > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn-disabled:hover > a:only-child:after { + background: transparent; +} +.ant-calendar-range-picker-input { + background-color: transparent; + border: 0; +} +.ant-calendar-range-picker-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-calendar-range-picker-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range-picker-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range-picker-separator { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-range-left .ant-calendar-time-picker-inner { + border-right: 1px solid #e8e8e8; +} +.ant-calendar-range-right .ant-calendar-time-picker-inner { + border-left: 1px solid #e8e8e8; +} +.ant-calendar-range-middle { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-range .ant-calendar-input, +.ant-calendar-range .ant-calendar-time-picker-input { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; + border: 0; + box-shadow: none; +} +.ant-calendar-range .ant-calendar-input::-moz-placeholder, +.ant-calendar-range .ant-calendar-time-picker-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-calendar-range .ant-calendar-input:-ms-input-placeholder, +.ant-calendar-range .ant-calendar-time-picker-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range .ant-calendar-input::-webkit-input-placeholder, +.ant-calendar-range .ant-calendar-time-picker-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range .ant-calendar-input:hover, +.ant-calendar-range .ant-calendar-time-picker-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-calendar-range .ant-calendar-input:focus, +.ant-calendar-range .ant-calendar-time-picker-input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-calendar-range .ant-calendar-input-disabled, +.ant-calendar-range .ant-calendar-time-picker-input-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-range .ant-calendar-input-disabled:hover, +.ant-calendar-range .ant-calendar-time-picker-input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-calendar-range .ant-calendar-input:focus, +.ant-calendar-range .ant-calendar-time-picker-input:focus { + box-shadow: none; +} +.ant-calendar-range .ant-calendar-in-range-cell { + border-radius: 0; +} +.ant-calendar-range .ant-calendar-in-range-cell:before { + background: color(~`colorPalette("@{primary-color}", 1)`); + border-radius: 0; + border: 0; +} +.ant-calendar-range .ant-calendar-header, +.ant-calendar-range .ant-calendar-month-panel-header, +.ant-calendar-range .ant-calendar-year-panel-header { + border-bottom: 0; +} +.ant-calendar-range .ant-calendar-body, +.ant-calendar-range .ant-calendar-month-panel-body, +.ant-calendar-range .ant-calendar-year-panel-body { + border-top: 1px solid #e8e8e8; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-inner { + background: none; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-combobox { + background-color: #fff; + border-top: 1px solid #e8e8e8; +} +.ant-calendar-range.ant-calendar-show-time-picker .ant-calendar-body { + border-top-color: transparent; +} +.ant-calendar-time-picker { + background-color: #fff; +} +.ant-calendar-time-picker-inner { + background-color: #fff; + background-clip: padding-box; +} +.ant-calendar-time-picker-select { + border-right: 1px solid #e8e8e8; +} +.ant-calendar-time-picker-select:first-child { + border-left: 0; +} +.ant-calendar-time-picker-select:last-child { + border-right: 0; +} +.ant-calendar-time-picker-select li:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +li.ant-calendar-time-picker-select-option-selected { + background: #f5f5f5; +} +li.ant-calendar-time-picker-select-option-disabled { + color: rgba(0, 0, 0, 0.25); +} +li.ant-calendar-time-picker-select-option-disabled:hover { + background: transparent; +} +.ant-calendar-time .ant-calendar-day-select { + color: rgba(0, 0, 0, 0.85); +} +.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-month-panel { + border-radius: 4px; + background: #fff; +} +.ant-calendar-month-panel-header { + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-month-panel-header a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select, +.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select, +.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select, +.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select { + color: rgba(0, 0, 0, 0.85); +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-month-panel-table { + border-collapse: separate; +} +.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month { + background: @primary-color; + color: #fff; +} +.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month:hover { + background: @primary-color; + color: #fff; +} +.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month, +.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month:hover { + color: #bcbcbc; + background: #f5f5f5; +} +.ant-calendar-month-panel-month { + color: rgba(0, 0, 0, 0.65); + background: transparent; + border-radius: 2px; +} +.ant-calendar-month-panel-month:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-calendar-year-panel { + border-radius: 4px; + background: #fff; +} +.ant-calendar-year-panel-header { + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-year-panel-header a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select, +.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select, +.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select, +.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select { + color: rgba(0, 0, 0, 0.85); +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-year-panel-table { + border-collapse: separate; +} +.ant-calendar-year-panel-year { + color: rgba(0, 0, 0, 0.65); + background: transparent; + border-radius: 2px; +} +.ant-calendar-year-panel-year:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year { + background: @primary-color; + color: #fff; +} +.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year:hover { + background: @primary-color; + color: #fff; +} +.ant-calendar-year-panel-last-decade-cell .ant-calendar-year-panel-year, +.ant-calendar-year-panel-next-decade-cell .ant-calendar-year-panel-year { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-decade-panel { + background: #fff; + border-radius: 4px; +} +.ant-calendar-decade-panel-header { + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-decade-panel-header a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select { + color: rgba(0, 0, 0, 0.85); +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-decade-panel-table { + border-collapse: separate; +} +.ant-calendar-decade-panel-decade { + color: rgba(0, 0, 0, 0.65); + background: transparent; + border-radius: 2px; +} +.ant-calendar-decade-panel-decade:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade { + background: @primary-color; + color: #fff; +} +.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade:hover { + background: @primary-color; + color: #fff; +} +.ant-calendar-decade-panel-last-century-cell .ant-calendar-decade-panel-decade, +.ant-calendar-decade-panel-next-century-cell .ant-calendar-decade-panel-decade { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-week-number .ant-calendar-body tr:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-calendar-week-number .ant-calendar-body tr.ant-calendar-active-week { + background: color(~`colorPalette("@{primary-color}", 2)`); +} +.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day .ant-calendar-date, +.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day:hover .ant-calendar-date { + background: transparent; + color: rgba(0, 0, 0, 0.65); +} +.ant-divider { + color: rgba(0, 0, 0, 0.65); + background: #e8e8e8; +} +.ant-divider-horizontal.ant-divider-with-text, +.ant-divider-horizontal.ant-divider-with-text-left, +.ant-divider-horizontal.ant-divider-with-text-right { + background: transparent; + color: rgba(0, 0, 0, 0.85); +} +.ant-divider-horizontal.ant-divider-with-text:before, +.ant-divider-horizontal.ant-divider-with-text-left:before, +.ant-divider-horizontal.ant-divider-with-text-right:before, +.ant-divider-horizontal.ant-divider-with-text:after, +.ant-divider-horizontal.ant-divider-with-text-left:after, +.ant-divider-horizontal.ant-divider-with-text-right:after { + border-top: 1px solid #e8e8e8; +} +.ant-divider-dashed { + background: none; + border-top: 1px dashed #e8e8e8; +} +.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed, +.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed, +.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed { + border-top: 0; +} +.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:before, +.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:before, +.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:before, +.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:after, +.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:after, +.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:after { + border-style: dashed none none; +} +.ant-drawer-left.ant-drawer-open .ant-drawer-content-wrapper { + box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer-right.ant-drawer-open .ant-drawer-content-wrapper { + box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer-top.ant-drawer-open .ant-drawer-content-wrapper { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer-bottom.ant-drawer-open .ant-drawer-content-wrapper { + box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-drawer-content { + background-color: #fff; + border: 0; + background-clip: padding-box; +} +.ant-drawer-close { + border: 0; + background: transparent; + color: rgba(0, 0, 0, 0.45); +} +.ant-drawer-close:focus, +.ant-drawer-close:hover { + color: #444; +} +.ant-drawer-header { + border-radius: 4px 4px 0 0; + background: #fff; + color: rgba(0, 0, 0, 0.65); + border-bottom: 1px solid #e8e8e8; +} +.ant-drawer-mask { + background-color: rgba(0, 0, 0, 0.65); +} +.ant-drawer-open-content { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} +.ant-dropdown { + color: rgba(0, 0, 0, 0.65); +} +.ant-dropdown-menu { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + background-clip: padding-box; +} +.ant-dropdown-menu-item-group-title { + color: rgba(0, 0, 0, 0.45); +} +.ant-dropdown-menu-item, +.ant-dropdown-menu-submenu-title { + color: rgba(0, 0, 0, 0.65); +} +.ant-dropdown-menu-item > a, +.ant-dropdown-menu-submenu-title > a { + color: rgba(0, 0, 0, 0.65); +} +.ant-dropdown-menu-item-selected, +.ant-dropdown-menu-submenu-title-selected, +.ant-dropdown-menu-item-selected > a, +.ant-dropdown-menu-submenu-title-selected > a { + color: @primary-color; + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-dropdown-menu-item:hover, +.ant-dropdown-menu-submenu-title:hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-dropdown-menu-item-disabled, +.ant-dropdown-menu-submenu-title-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-dropdown-menu-item-disabled:hover, +.ant-dropdown-menu-submenu-title-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #fff; +} +.ant-dropdown-menu-item-divider, +.ant-dropdown-menu-submenu-title-divider { + background-color: #e8e8e8; +} +.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow-icon, +.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon { + color: rgba(0, 0, 0, 0.45); +} +.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title, +.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-dropdown-menu-dark, +.ant-dropdown-menu-dark .ant-dropdown-menu { + background: #001529; +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item, +.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title, +.ant-dropdown-menu-dark .ant-dropdown-menu-item > a { + color: rgba(255, 255, 255, 0.65); +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after, +.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after, +.ant-dropdown-menu-dark .ant-dropdown-menu-item > a .ant-dropdown-menu-submenu-arrow:after { + color: rgba(255, 255, 255, 0.65); +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover, +.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover, +.ant-dropdown-menu-dark .ant-dropdown-menu-item > a:hover { + color: #fff; + background: transparent; +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected, +.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover, +.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected > a { + background: @primary-color; + color: #fff; +} +.ant-form { + color: rgba(0, 0, 0, 0.65); +} +.ant-form legend { + color: rgba(0, 0, 0, 0.45); + border: 0; + border-bottom: 1px solid #d9d9d9; +} +.ant-form output { + color: rgba(0, 0, 0, 0.65); +} +.ant-form-item-required:before { + color: #f5222d; +} +.ant-form-item { + color: rgba(0, 0, 0, 0.65); +} +.ant-form-item-label label { + color: rgba(0, 0, 0, 0.85); +} +.ant-form-explain, +.ant-form-extra { + color: rgba(0, 0, 0, 0.45); +} +form .ant-upload { + background: transparent; +} +.ant-input-group-wrap .ant-select-selection { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group-wrap .ant-select-selection:hover { + border-color: #d9d9d9; +} +.ant-input-group-wrap .ant-select-selection--single { + background-color: #eee; +} +.ant-input-group-wrap .ant-select-open .ant-select-selection { + border-color: #d9d9d9; + box-shadow: none; +} +.has-success.has-feedback .ant-form-item-children-icon { + color: #52c41a; +} +.has-warning .ant-form-explain, +.has-warning .ant-form-split { + color: #faad14; +} +.has-warning .ant-input, +.has-warning .ant-input:hover { + border-color: #faad14; +} +.has-warning .ant-input:focus { + border-color: #ffc53d; + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-input:not([disabled]):hover { + border-color: #faad14; +} +.has-warning .ant-calendar-picker-open .ant-calendar-picker-input { + border-color: #ffc53d; + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-input-prefix { + color: #faad14; +} +.has-warning .ant-input-group-addon { + color: #faad14; + border-color: #faad14; + background-color: #fff; +} +.has-warning .has-feedback { + color: #faad14; +} +.has-warning.has-feedback .ant-form-item-children-icon { + color: #faad14; +} +.has-warning .ant-select-selection { + border-color: #faad14; +} +.has-warning .ant-select-open .ant-select-selection, +.has-warning .ant-select-focused .ant-select-selection { + border-color: #ffc53d; + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-calendar-picker-icon:after, +.has-warning .ant-time-picker-icon:after, +.has-warning .ant-picker-icon:after, +.has-warning .ant-select-arrow, +.has-warning .ant-cascader-picker-arrow { + color: #faad14; +} +.has-warning .ant-input-number, +.has-warning .ant-time-picker-input { + border-color: #faad14; +} +.has-warning .ant-input-number-focused, +.has-warning .ant-time-picker-input-focused, +.has-warning .ant-input-number:focus, +.has-warning .ant-time-picker-input:focus { + border-color: #ffc53d; + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-input-number:not([disabled]):hover, +.has-warning .ant-time-picker-input:not([disabled]):hover { + border-color: #faad14; +} +.has-warning .ant-cascader-picker:focus .ant-cascader-input { + border-color: #ffc53d; + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-form-explain, +.has-error .ant-form-split { + color: #f5222d; +} +.has-error .ant-input, +.has-error .ant-input:hover { + border-color: #f5222d; +} +.has-error .ant-input:focus { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-input:not([disabled]):hover { + border-color: #f5222d; +} +.has-error .ant-calendar-picker-open .ant-calendar-picker-input { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-input-prefix { + color: #f5222d; +} +.has-error .ant-input-group-addon { + color: #f5222d; + border-color: #f5222d; + background-color: #fff; +} +.has-error .has-feedback { + color: #f5222d; +} +.has-error.has-feedback .ant-form-item-children-icon { + color: #f5222d; +} +.has-error .ant-select-selection { + border-color: #f5222d; +} +.has-error .ant-select-open .ant-select-selection, +.has-error .ant-select-focused .ant-select-selection { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-select.ant-select-auto-complete .ant-input:focus { + border-color: #f5222d; +} +.has-error .ant-input-group-addon .ant-select-selection { + border-color: transparent; + box-shadow: none; +} +.has-error .ant-calendar-picker-icon:after, +.has-error .ant-time-picker-icon:after, +.has-error .ant-picker-icon:after, +.has-error .ant-select-arrow, +.has-error .ant-cascader-picker-arrow { + color: #f5222d; +} +.has-error .ant-input-number, +.has-error .ant-time-picker-input { + border-color: #f5222d; +} +.has-error .ant-input-number-focused, +.has-error .ant-time-picker-input-focused, +.has-error .ant-input-number:focus, +.has-error .ant-time-picker-input:focus { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-input-number:not([disabled]):hover, +.has-error .ant-time-picker-input:not([disabled]):hover { + border-color: #f5222d; +} +.has-error .ant-mention-wrapper .ant-mention-editor, +.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):hover { + border-color: #f5222d; +} +.has-error .ant-mention-wrapper.ant-mention-active:not([disabled]) .ant-mention-editor, +.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):focus { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-cascader-picker:focus .ant-cascader-input { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.is-validating.has-feedback .ant-form-item-children-icon { + color: @primary-color; +} +.ant-input-number { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-input-number::-moz-placeholder { + color: #bfbfbf; +} +.ant-input-number:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-input-number::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-input-number:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-number:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-number-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-input-number-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-input-number-handler { + color: rgba(0, 0, 0, 0.45); +} +.ant-input-number-handler:active { + background: #f4f4f4; +} +.ant-input-number-handler:hover .ant-input-number-handler-up-inner, +.ant-input-number-handler:hover .ant-input-number-handler-down-inner { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-input-number-handler-up-inner, +.ant-input-number-handler-down-inner { + color: rgba(0, 0, 0, 0.45); +} +.ant-input-number:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-number-focused { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-number-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-input-number-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-input-number-input { + background-color: transparent; + border: 0; + border-radius: 4px; +} +.ant-input-number-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-input-number-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-input-number-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-input-number-handler-wrap { + border-left: 1px solid #d9d9d9; + background: #fff; + border-radius: 0 4px 4px 0; +} +.ant-input-number-handler-down { + border-top: 1px solid #d9d9d9; +} +.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner, +.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner { + color: rgba(0, 0, 0, 0.25); +} +.ant-input { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-input-group { + color: rgba(0, 0, 0, 0.65); + border-collapse: separate; + border-spacing: 0; +} +.ant-input-group-addon:not(:first-child):not(:last-child), +.ant-input-group-wrap:not(:first-child):not(:last-child), +.ant-input-group > .ant-input:not(:first-child):not(:last-child) { + border-radius: 0; +} +.ant-input-group .ant-input:focus { + border-right-width: 1px; +} +.ant-input-group .ant-input:hover { + border-right-width: 1px; +} +.ant-input-group-addon { + color: rgba(0, 0, 0, 0.65); + background-color: #fafafa; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-input-group-addon .ant-select .ant-select-selection { + background-color: inherit; + border: 1px solid transparent; + box-shadow: none; +} +.ant-input-group-addon .ant-select-open .ant-select-selection, +.ant-input-group-addon .ant-select-focused .ant-select-selection { + color: @primary-color; +} +.ant-input-group > .ant-input:first-child, +.ant-input-group-addon:first-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ant-input-group > .ant-input:first-child .ant-select .ant-select-selection, +.ant-input-group-addon:first-child .ant-select .ant-select-selection { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ant-input-group > .ant-input-affix-wrapper:not(:first-child) .ant-input { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group > .ant-input-affix-wrapper:not(:last-child) .ant-input { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ant-input-group-addon:first-child { + border-right: 0; +} +.ant-input-group-addon:last-child { + border-left: 0; +} +.ant-input-group > .ant-input:last-child, +.ant-input-group-addon:last-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group > .ant-input:last-child .ant-select .ant-select-selection, +.ant-input-group-addon:last-child .ant-select .ant-select-selection { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child), +.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child), +.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child) { + border-right-width: 1px; + border-right-color: transparent; +} +.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):hover, +.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):hover, +.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):focus, +.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):focus, +.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact > * { + border-radius: 0; + border-right-width: 0; +} +.ant-input-group.ant-input-group-compact > span:not(:last-child) > .ant-input { + border-right-width: 0; +} +.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selection, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor, +.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input { + border-radius: 0; + border-right-width: 1px; + border-right-color: transparent; +} +.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selection:hover, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor:hover, +.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selection:focus, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor:focus, +.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact > *:first-child, +.ant-input-group.ant-input-group-compact > .ant-select:first-child > .ant-select-selection, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:first-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:first-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:first-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:first-child .ant-mention-editor, +.ant-input-group.ant-input-group-compact > .ant-time-picker:first-child .ant-time-picker-input { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.ant-input-group.ant-input-group-compact > *:last-child, +.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor, +.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-right-width: 1px; + border-right-color: #d9d9d9; +} +.ant-input-group.ant-input-group-compact > *:last-child:hover, +.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection:hover, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor:hover, +.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact > *:last-child:focus, +.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection:focus, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor:focus, +.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact > *:last-child:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input:focus .ant-cascader-input { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-affix-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-input-affix-wrapper:hover .ant-input:not(.ant-input-disabled) { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-affix-wrapper .ant-input-prefix, +.ant-input-affix-wrapper .ant-input-suffix { + color: rgba(0, 0, 0, 0.65); +} +.ant-input-search-icon { + color: rgba(0, 0, 0, 0.45); +} +.ant-input-search-icon:hover { + color: #333; +} +.ant-input-search > .ant-input-suffix > .ant-input-search-button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.ant-layout { + background: #f0f2f5; +} +.ant-layout-header { + background: #001529; +} +.ant-layout-footer { + background: #f0f2f5; + color: rgba(0, 0, 0, 0.65); +} +.ant-layout-sider { + background: #001529; +} +.ant-layout-sider-trigger { + color: #fff; + background: #002140; +} +.ant-layout-sider-zero-width-trigger { + background: #001529; + color: #fff; + border-radius: 0 4px 4px 0; +} +.ant-layout-sider-zero-width-trigger:hover { + background: #192c3e; +} +.ant-layout-sider-light { + background: #fff; +} +.ant-layout-sider-light .ant-layout-sider-trigger { + color: rgba(0, 0, 0, 0.65); + background: #fff; +} +.ant-layout-sider-light .ant-layout-sider-zero-width-trigger { + color: rgba(0, 0, 0, 0.65); + background: #fff; +} +.ant-list { + color: rgba(0, 0, 0, 0.65); +} +.ant-list-empty-text { + color: rgba(0, 0, 0, 0.45); +} +.ant-list-item-meta-title { + color: rgba(0, 0, 0, 0.65); +} +.ant-list-item-meta-title > a { + color: rgba(0, 0, 0, 0.65); +} +.ant-list-item-meta-title > a:hover { + color: @primary-color; +} +.ant-list-item-meta-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-list-item-action > li { + color: rgba(0, 0, 0, 0.45); +} +.ant-list-item-action-split { + background-color: #e8e8e8; +} +.ant-list-empty { + color: rgba(0, 0, 0, 0.45); +} +.ant-list-split .ant-list-item { + border-bottom: 1px solid #e8e8e8; +} +.ant-list-split .ant-list-item:last-child { + border-bottom: none; +} +.ant-list-split .ant-list-header { + border-bottom: 1px solid #e8e8e8; +} +.ant-list-something-after-last-item .ant-spin-container > .ant-list-item:last-child { + border-bottom: 1px solid #e8e8e8; +} +.ant-list-vertical .ant-list-item-meta-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-list-vertical .ant-list-item-content { + color: rgba(0, 0, 0, 0.65); +} +.ant-list-grid .ant-list-item { + border-bottom: none; +} +.ant-list-bordered { + border-radius: 4px; + border: 1px solid #d9d9d9; +} +.ant-list-bordered .ant-list-item { + border-bottom: 1px solid #e8e8e8; +} +.ant-mention-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-mention-wrapper .ant-mention-editor { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-mention-wrapper .ant-mention-editor::-moz-placeholder { + color: #bfbfbf; +} +.ant-mention-wrapper .ant-mention-editor:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-mention-wrapper .ant-mention-editor::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-mention-wrapper .ant-mention-editor:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-mention-wrapper .ant-mention-editor:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-mention-wrapper .ant-mention-editor-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-mention-wrapper .ant-mention-editor-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-mention-wrapper.ant-mention-active:not(.disabled) .ant-mention-editor { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-mention-wrapper.disabled .ant-mention-editor { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-mention-wrapper.disabled .ant-mention-editor:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-mention-wrapper .public-DraftEditorPlaceholder-root .public-DraftEditorPlaceholder-inner { + color: #bfbfbf; +} +.ant-mention-dropdown { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + border-radius: 4px; +} +.ant-mention-dropdown-notfound.ant-mention-dropdown-item { + color: rgba(0, 0, 0, 0.25); +} +.ant-mention-dropdown-notfound.ant-mention-dropdown-item .anticon-loading { + color: @primary-color; +} +.ant-mention-dropdown-item { + color: rgba(0, 0, 0, 0.65); +} +.ant-mention-dropdown-item:hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-mention-dropdown-item.focus, +.ant-mention-dropdown-item-active { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-mention-dropdown-item-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-mention-dropdown-item-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #fff; +} +.ant-mention-dropdown-item-selected, +.ant-mention-dropdown-item-selected:hover { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.65); +} +.ant-mention-dropdown-item-divider { + background-color: #e8e8e8; +} +.ant-menu { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + color: rgba(0, 0, 0, 0.65); + background: #fff; +} +.ant-menu-item-group-title { + color: rgba(0, 0, 0, 0.45); +} +.ant-menu-item:active, +.ant-menu-submenu-title:active { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-menu-item > a { + color: rgba(0, 0, 0, 0.65); +} +.ant-menu-item > a:hover { + color: @primary-color; +} +.ant-menu-item > a:before { + background-color: transparent; +} +.ant-menu-item-divider { + background-color: #e8e8e8; +} +.ant-menu-item:hover, +.ant-menu-item-active, +.ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open, +.ant-menu-submenu-active, +.ant-menu-submenu-title:hover { + color: @primary-color; +} +.ant-menu-horizontal > .ant-menu-item:hover, +.ant-menu-horizontal > .ant-menu-item-active, +.ant-menu-horizontal > .ant-menu-submenu .ant-menu-submenu-title:hover { + background-color: transparent; +} +.ant-menu-item-selected { + color: @primary-color; +} +.ant-menu-item-selected > a, +.ant-menu-item-selected > a:hover { + color: @primary-color; +} +.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-menu-inline, +.ant-menu-vertical, +.ant-menu-vertical-left { + border-right: 1px solid #e8e8e8; +} +.ant-menu-vertical-right { + border-left: 1px solid #e8e8e8; +} +.ant-menu-vertical.ant-menu-sub, +.ant-menu-vertical-left.ant-menu-sub, +.ant-menu-vertical-right.ant-menu-sub { + border-right: 0; +} +.ant-menu-vertical.ant-menu-sub .ant-menu-item, +.ant-menu-vertical-left.ant-menu-sub .ant-menu-item, +.ant-menu-vertical-right.ant-menu-sub .ant-menu-item { + border-right: 0; +} +.ant-menu-vertical.ant-menu-sub .ant-menu-item:after, +.ant-menu-vertical-left.ant-menu-sub .ant-menu-item:after, +.ant-menu-vertical-right.ant-menu-sub .ant-menu-item:after { + border-right: 0; +} +.ant-menu > .ant-menu-item-divider { + background-color: #e8e8e8; +} +.ant-menu-submenu-popup { + border-radius: 4px; +} +.ant-menu-submenu > .ant-menu { + background-color: #fff; + border-radius: 4px; +} +.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:after { + background: #fff; + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.65), rgba(0, 0, 0, 0.65)); + border-radius: 2px; +} +.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before, +.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before { + background: linear-gradient(to right, @primary-color, @primary-color); +} +.ant-menu-vertical .ant-menu-submenu-selected, +.ant-menu-vertical-left .ant-menu-submenu-selected, +.ant-menu-vertical-right .ant-menu-submenu-selected { + color: @primary-color; +} +.ant-menu-vertical .ant-menu-submenu-selected > a, +.ant-menu-vertical-left .ant-menu-submenu-selected > a, +.ant-menu-vertical-right .ant-menu-submenu-selected > a { + color: @primary-color; +} +.ant-menu-horizontal { + border: 0; + border-bottom: 1px solid #e8e8e8; + box-shadow: none; +} +.ant-menu-horizontal > .ant-menu-item, +.ant-menu-horizontal > .ant-menu-submenu { + border-bottom: 2px solid transparent; +} +.ant-menu-horizontal > .ant-menu-item:hover, +.ant-menu-horizontal > .ant-menu-submenu:hover, +.ant-menu-horizontal > .ant-menu-item-active, +.ant-menu-horizontal > .ant-menu-submenu-active, +.ant-menu-horizontal > .ant-menu-item-open, +.ant-menu-horizontal > .ant-menu-submenu-open, +.ant-menu-horizontal > .ant-menu-item-selected, +.ant-menu-horizontal > .ant-menu-submenu-selected { + border-bottom: 2px solid @primary-color; + color: @primary-color; +} +.ant-menu-horizontal > .ant-menu-item > a { + color: rgba(0, 0, 0, 0.65); +} +.ant-menu-horizontal > .ant-menu-item > a:hover { + color: @primary-color; +} +.ant-menu-horizontal > .ant-menu-item-selected > a { + color: @primary-color; +} +.ant-menu-vertical .ant-menu-item:after, +.ant-menu-vertical-left .ant-menu-item:after, +.ant-menu-vertical-right .ant-menu-item:after, +.ant-menu-inline .ant-menu-item:after { + border-right: 3px solid @primary-color; +} +.ant-menu-inline-collapsed-tooltip a { + color: rgba(255, 255, 255, 0.85); +} +.ant-menu-root.ant-menu-vertical, +.ant-menu-root.ant-menu-vertical-left, +.ant-menu-root.ant-menu-vertical-right, +.ant-menu-root.ant-menu-inline { + box-shadow: none; +} +.ant-menu-sub.ant-menu-inline { + border: 0; + box-shadow: none; + border-radius: 0; +} +.ant-menu-item-disabled, +.ant-menu-submenu-disabled { + color: rgba(0, 0, 0, 0.25) !important; + background: none; + border-color: transparent !important; +} +.ant-menu-item-disabled > a, +.ant-menu-submenu-disabled > a { + color: rgba(0, 0, 0, 0.25) !important; +} +.ant-menu-item-disabled > .ant-menu-submenu-title, +.ant-menu-submenu-disabled > .ant-menu-submenu-title { + color: rgba(0, 0, 0, 0.25) !important; +} +.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after { + background: rgba(0, 0, 0, 0.25) !important; +} +.ant-menu-dark, +.ant-menu-dark .ant-menu-sub { + color: rgba(255, 255, 255, 0.65); + background: #001529; +} +.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before { + background: #fff; +} +.ant-menu-dark.ant-menu-submenu-popup { + background: transparent; +} +.ant-menu-dark .ant-menu-inline.ant-menu-sub { + background: #000c17; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.45) inset; +} +.ant-menu-dark.ant-menu-horizontal { + border-bottom: 0; +} +.ant-menu-dark.ant-menu-horizontal > .ant-menu-item, +.ant-menu-dark.ant-menu-horizontal > .ant-menu-submenu { + border-color: #001529; + border-bottom: 0; +} +.ant-menu-dark .ant-menu-item, +.ant-menu-dark .ant-menu-item-group-title, +.ant-menu-dark .ant-menu-item > a { + color: rgba(255, 255, 255, 0.65); +} +.ant-menu-dark.ant-menu-inline, +.ant-menu-dark.ant-menu-vertical, +.ant-menu-dark.ant-menu-vertical-left, +.ant-menu-dark.ant-menu-vertical-right { + border-right: 0; +} +.ant-menu-dark.ant-menu-inline .ant-menu-item, +.ant-menu-dark.ant-menu-vertical .ant-menu-item, +.ant-menu-dark.ant-menu-vertical-left .ant-menu-item, +.ant-menu-dark.ant-menu-vertical-right .ant-menu-item { + border-right: 0; +} +.ant-menu-dark.ant-menu-inline .ant-menu-item:after, +.ant-menu-dark.ant-menu-vertical .ant-menu-item:after, +.ant-menu-dark.ant-menu-vertical-left .ant-menu-item:after, +.ant-menu-dark.ant-menu-vertical-right .ant-menu-item:after { + border-right: 0; +} +.ant-menu-dark .ant-menu-item:hover, +.ant-menu-dark .ant-menu-item-active, +.ant-menu-dark .ant-menu-submenu-active, +.ant-menu-dark .ant-menu-submenu-open, +.ant-menu-dark .ant-menu-submenu-selected, +.ant-menu-dark .ant-menu-submenu-title:hover { + background-color: transparent; + color: #fff; +} +.ant-menu-dark .ant-menu-item:hover > a, +.ant-menu-dark .ant-menu-item-active > a, +.ant-menu-dark .ant-menu-submenu-active > a, +.ant-menu-dark .ant-menu-submenu-open > a, +.ant-menu-dark .ant-menu-submenu-selected > a, +.ant-menu-dark .ant-menu-submenu-title:hover > a { + color: #fff; +} +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before { + background: #fff; +} +.ant-menu-dark .ant-menu-item-selected { + border-right: 0; + color: #fff; +} +.ant-menu-dark .ant-menu-item-selected:after { + border-right: 0; +} +.ant-menu-dark .ant-menu-item-selected > a, +.ant-menu-dark .ant-menu-item-selected > a:hover { + color: #fff; +} +.ant-menu.ant-menu-dark .ant-menu-item-selected, +.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected { + background-color: @primary-color; +} +.ant-menu-dark .ant-menu-item-disabled, +.ant-menu-dark .ant-menu-submenu-disabled, +.ant-menu-dark .ant-menu-item-disabled > a, +.ant-menu-dark .ant-menu-submenu-disabled > a { + color: rgba(255, 255, 255, 0.35) !important; +} +.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title, +.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title { + color: rgba(255, 255, 255, 0.35) !important; +} +.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after { + background: rgba(255, 255, 255, 0.35) !important; +} +.ant-message { + color: rgba(0, 0, 0, 0.65); +} +.ant-message-notice-content { + border-radius: 4px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + background: #fff; +} +.ant-message-success .anticon { + color: #52c41a; +} +.ant-message-error .anticon { + color: #f5222d; +} +.ant-message-warning .anticon { + color: #faad14; +} +.ant-message-info .anticon, +.ant-message-loading .anticon { + color: @primary-color; +} +.ant-modal { + color: rgba(0, 0, 0, 0.65); +} +.ant-modal-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-modal-content { + background-color: #fff; + border: 0; + border-radius: 4px; + background-clip: padding-box; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} +.ant-modal-close { + border: 0; + background: transparent; + color: rgba(0, 0, 0, 0.45); +} +.ant-modal-close:focus, +.ant-modal-close:hover { + color: #444; +} +.ant-modal-header { + border-radius: 4px 4px 0 0; + background: #fff; + color: rgba(0, 0, 0, 0.65); + border-bottom: 1px solid #e8e8e8; +} +.ant-modal-footer { + border-top: 1px solid #e8e8e8; + border-radius: 0 0 4px 4px; +} +.ant-modal-mask { + background-color: rgba(0, 0, 0, 0.65); +} +.ant-confirm-body .ant-confirm-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-confirm-body .ant-confirm-content { + color: rgba(0, 0, 0, 0.65); +} +.ant-confirm-error .ant-confirm-body > .anticon { + color: #f5222d; +} +.ant-confirm-warning .ant-confirm-body > .anticon, +.ant-confirm-confirm .ant-confirm-body > .anticon { + color: #faad14; +} +.ant-confirm-info .ant-confirm-body > .anticon { + color: @primary-color; +} +.ant-confirm-success .ant-confirm-body > .anticon { + color: #52c41a; +} +.ant-notification { + color: rgba(0, 0, 0, 0.65); +} +.ant-notification-notice { + border-radius: 4px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + background: #fff; +} +.ant-notification-notice-message { + color: rgba(0, 0, 0, 0.85); +} +.ant-notification-notice-message-single-line-auto-margin { + background-color: transparent; +} +.ant-notification-notice-icon-success { + color: #52c41a; +} +.ant-notification-notice-icon-info { + color: @primary-color; +} +.ant-notification-notice-icon-warning { + color: #faad14; +} +.ant-notification-notice-icon-error { + color: #f5222d; +} +.ant-notification-notice-close { + color: rgba(0, 0, 0, 0.45); +} +.ant-notification-notice-close:hover { + color: rgba(0, 0, 0, 0.67); +} +.ant-pagination { + color: rgba(0, 0, 0, 0.65); +} +.ant-pagination-item { + border-radius: 4px; + border: 1px solid #d9d9d9; + background-color: #fff; +} +.ant-pagination-item a { + color: rgba(0, 0, 0, 0.65); +} +.ant-pagination-item:focus, +.ant-pagination-item:hover { + border-color: @primary-color; +} +.ant-pagination-item:focus a, +.ant-pagination-item:hover a { + color: @primary-color; +} +.ant-pagination-item-active { + border-color: @primary-color; +} +.ant-pagination-item-active a { + color: @primary-color; +} +.ant-pagination-item-active:focus, +.ant-pagination-item-active:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-pagination-item-active:focus a, +.ant-pagination-item-active:hover a { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon, +.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon { + color: @primary-color; +} +.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis, +.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis { + color: rgba(0, 0, 0, 0.25); +} +.ant-pagination-prev, +.ant-pagination-next, +.ant-pagination-jump-prev, +.ant-pagination-jump-next { + color: rgba(0, 0, 0, 0.65); + border-radius: 4px; +} +.ant-pagination-prev a, +.ant-pagination-next a { + color: rgba(0, 0, 0, 0.65); +} +.ant-pagination-prev:hover a, +.ant-pagination-next:hover a { + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-pagination-prev .ant-pagination-item-link, +.ant-pagination-next .ant-pagination-item-link { + border: 1px solid #d9d9d9; + background-color: #fff; + border-radius: 4px; +} +.ant-pagination-prev:focus .ant-pagination-item-link, +.ant-pagination-next:focus .ant-pagination-item-link, +.ant-pagination-prev:hover .ant-pagination-item-link, +.ant-pagination-next:hover .ant-pagination-item-link { + border-color: @primary-color; + color: @primary-color; +} +.ant-pagination-disabled a, +.ant-pagination-disabled:hover a, +.ant-pagination-disabled:focus a, +.ant-pagination-disabled .ant-pagination-item-link, +.ant-pagination-disabled:hover .ant-pagination-item-link, +.ant-pagination-disabled:focus .ant-pagination-item-link { + border-color: #d9d9d9; + color: rgba(0, 0, 0, 0.25); +} +.ant-pagination-options-quick-jumper input { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-pagination-options-quick-jumper input::-moz-placeholder { + color: #bfbfbf; +} +.ant-pagination-options-quick-jumper input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-pagination-options-quick-jumper input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-pagination-options-quick-jumper input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-pagination-options-quick-jumper input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-pagination-options-quick-jumper input-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-pagination-options-quick-jumper input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link, +.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link { + border: 0; +} +.ant-pagination-simple .ant-pagination-simple-pager input { + background-color: #fff; + border-radius: 4px; + border: 1px solid #d9d9d9; +} +.ant-pagination-simple .ant-pagination-simple-pager input:hover { + border-color: @primary-color; +} +.ant-pagination.mini .ant-pagination-item:not(.ant-pagination-item-active) { + background: transparent; + border-color: transparent; +} +.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link, +.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link { + border-color: transparent; + background: transparent; +} +.ant-popover { + color: rgba(0, 0, 0, 0.65); +} +.ant-popover:after { + background: rgba(255, 255, 255, 0.01); +} +.ant-popover-inner { + background-color: #fff; + background-clip: padding-box; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-popover-title { + border-bottom: 1px solid #e8e8e8; + color: rgba(0, 0, 0, 0.85); +} +.ant-popover-inner-content { + color: rgba(0, 0, 0, 0.65); +} +.ant-popover-message { + color: rgba(0, 0, 0, 0.65); +} +.ant-popover-message > .anticon { + color: #faad14; +} +.ant-popover-arrow { + background: #fff; + border-color: transparent; + border-style: solid; +} +.ant-popover-placement-top > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-topLeft > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-topRight > .ant-popover-content > .ant-popover-arrow { + box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07); +} +.ant-popover-placement-right > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-rightTop > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-rightBottom > .ant-popover-content > .ant-popover-arrow { + box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07); +} +.ant-popover-placement-bottom > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-bottomLeft > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-bottomRight > .ant-popover-content > .ant-popover-arrow { + box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.06); +} +.ant-popover-placement-left > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-leftTop > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-leftBottom > .ant-popover-content > .ant-popover-arrow { + box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07); +} +.ant-progress { + color: rgba(0, 0, 0, 0.65); +} +.ant-progress-inner { + background-color: #f5f5f5; + border-radius: 100px; +} +.ant-progress-success-bg, +.ant-progress-bg { + background-color: @primary-color; +} +.ant-progress-success-bg { + background-color: #52c41a; +} +.ant-progress-text { + color: rgba(0, 0, 0, 0.45); +} +.ant-progress-status-active .ant-progress-bg:before { + background: #fff; + border-radius: 10px; +} +.ant-progress-status-exception .ant-progress-bg { + background-color: #f5222d; +} +.ant-progress-status-exception .ant-progress-text { + color: #f5222d; +} +.ant-progress-status-success .ant-progress-bg { + background-color: #52c41a; +} +.ant-progress-status-success .ant-progress-text { + color: #52c41a; +} +.ant-progress-circle .ant-progress-inner { + background-color: transparent; +} +.ant-progress-circle .ant-progress-text { + color: rgba(0, 0, 0, 0.65); +} +.ant-progress-circle.ant-progress-status-exception .ant-progress-text { + color: #f5222d; +} +.ant-progress-circle.ant-progress-status-success .ant-progress-text { + color: #52c41a; +} +.ant-radio-group { + color: rgba(0, 0, 0, 0.65); +} +.ant-radio-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-radio { + color: rgba(0, 0, 0, 0.65); +} +.ant-radio-wrapper:hover .ant-radio .ant-radio-inner, +.ant-radio:hover .ant-radio-inner, +.ant-radio-focused .ant-radio-inner { + border-color: @primary-color; +} +.ant-radio-checked:after { + border-radius: 50%; + border: 1px solid @primary-color; +} +.ant-radio-inner { + border-width: 1px; + border-style: solid; + border-radius: 100px; + border-color: #d9d9d9; + background-color: #fff; +} +.ant-radio-inner:after { + border-radius: 8px; + border-top: 0; + border-left: 0; + background-color: @primary-color; +} +.ant-radio-checked .ant-radio-inner { + border-color: @primary-color; +} +.ant-radio-disabled .ant-radio-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-radio-disabled .ant-radio-inner:after { + background-color: #ccc; +} +.ant-radio-disabled + span { + color: rgba(0, 0, 0, 0.25); +} +.ant-radio-button-wrapper { + color: rgba(0, 0, 0, 0.65); + border: 1px solid #d9d9d9; + border-left: 0; + border-top-width: 1.02px; + background: #fff; +} +.ant-radio-button-wrapper a { + color: rgba(0, 0, 0, 0.65); +} +.ant-radio-button-wrapper:not(:first-child)::before { + background-color: #d9d9d9; +} +.ant-radio-button-wrapper:first-child { + border-radius: 4px 0 0 4px; + border-left: 1px solid #d9d9d9; +} +.ant-radio-button-wrapper:last-child { + border-radius: 0 4px 4px 0; +} +.ant-radio-button-wrapper:first-child:last-child { + border-radius: 4px; +} +.ant-radio-button-wrapper:hover, +.ant-radio-button-wrapper-focused { + color: @primary-color; +} +.ant-radio-button-wrapper-checked { + background: #fff; + border-color: @primary-color; + color: @primary-color; + box-shadow: -1px 0 0 0 @primary-color; +} +.ant-radio-button-wrapper-checked::before { + background-color: @primary-color !important; +} +.ant-radio-button-wrapper-checked:first-child { + border-color: @primary-color; + box-shadow: none !important; +} +.ant-radio-button-wrapper-checked:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: -1px 0 0 0 color(~`colorPalette("@{primary-color}", 5)`); + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-radio-button-wrapper-checked:active { + border-color: color(~`colorPalette("@{primary-color}", 7)`); + box-shadow: -1px 0 0 0 color(~`colorPalette("@{primary-color}", 7)`); + color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) { + background: @primary-color; + border-color: @primary-color; + color: #fff; +} +.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + background: color(~`colorPalette("@{primary-color}", 5)`); + color: #fff; +} +.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active { + border-color: color(~`colorPalette("@{primary-color}", 7)`); + background: color(~`colorPalette("@{primary-color}", 7)`); + color: #fff; +} +.ant-radio-button-wrapper-disabled { + border-color: #d9d9d9; + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-radio-button-wrapper-disabled:first-child, +.ant-radio-button-wrapper-disabled:hover { + border-color: #d9d9d9; + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-radio-button-wrapper-disabled:first-child { + border-left-color: #d9d9d9; +} +.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked { + color: #fff; + background-color: #e6e6e6; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-rate { + color: rgba(0, 0, 0, 0.65); + color: #fadb14; +} +.ant-rate-star { + color: inherit; +} +.ant-rate-star-first, +.ant-rate-star-second { + color: #e8e8e8; +} +.ant-rate-star-half .ant-rate-star-first, +.ant-rate-star-full .ant-rate-star-second { + color: inherit; +} +.ant-select { + color: rgba(0, 0, 0, 0.65); +} +.ant-select > ul > li > a { + background-color: #fff; +} +.ant-select-arrow { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-selection { + background-color: #fff; + border-radius: 4px; + border: 1px solid #d9d9d9; + border-top-width: 1.02px; +} +.ant-select-selection:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-select-focused .ant-select-selection, +.ant-select-selection:focus, +.ant-select-selection:active { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-select-selection__clear { + background: #fff; + color: rgba(0, 0, 0, 0.25); +} +.ant-select-selection__clear:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-select-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-disabled .ant-select-selection { + background: #f5f5f5; +} +.ant-select-disabled .ant-select-selection:hover, +.ant-select-disabled .ant-select-selection:focus, +.ant-select-disabled .ant-select-selection:active { + border-color: #d9d9d9; + box-shadow: none; +} +.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice { + background: #f5f5f5; + color: #aaa; +} +.ant-select-disabled .ant-select-selection__choice__remove { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-disabled .ant-select-selection__choice__remove:hover { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-selection__placeholder, +.ant-select-search__field__placeholder { + color: #bfbfbf; +} +.ant-select-search--inline .ant-select-search__field { + border-width: 0; + background: transparent; + border-radius: 4px; +} +.ant-select-selection--multiple .ant-select-selection__choice { + color: rgba(0, 0, 0, 0.65); + background-color: #fafafa; + border: 1px solid #e8e8e8; + border-radius: 2px; +} +.ant-select-selection--multiple .ant-select-selection__choice__remove { + color: rgba(0, 0, 0, 0.45); +} +.ant-select-selection--multiple .ant-select-selection__choice__remove:hover { + color: #404040; +} +.ant-select-open .ant-select-selection { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-select-combobox .ant-select-search__field { + box-shadow: none; +} +.ant-select-dropdown { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + border-radius: 4px; +} +.ant-select-dropdown-menu-item-group-title { + color: rgba(0, 0, 0, 0.45); +} +.ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:first-child:not(:last-child), +.ant-select-dropdown-menu-item-group:not(:last-child) .ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:last-child { + border-radius: 0; +} +.ant-select-dropdown-menu-item { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-dropdown-menu-item:hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-select-dropdown-menu-item:first-child { + border-radius: 4px 4px 0 0; +} +.ant-select-dropdown-menu-item:last-child { + border-radius: 0 0 4px 4px; +} +.ant-select-dropdown-menu-item-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-dropdown-menu-item-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #fff; +} +.ant-select-dropdown-menu-item-selected, +.ant-select-dropdown-menu-item-selected:hover { + background-color: #fafafa; + color: rgba(0, 0, 0, 0.65); +} +.ant-select-dropdown-menu-item-active { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-select-dropdown-menu-item-divider { + background-color: #e8e8e8; +} +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item .ant-select-selected-icon { + color: transparent; +} +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:hover .ant-select-selected-icon { + color: #ddd; +} +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected .ant-select-selected-icon, +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected:hover .ant-select-selected-icon { + color: @primary-color; +} +.ant-skeleton-header .ant-skeleton-avatar { + background: #f2f2f2; +} +.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle { + border-radius: 50%; +} +.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle { + border-radius: 50%; +} +.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle { + border-radius: 50%; +} +.ant-skeleton-content .ant-skeleton-title { + background: #f2f2f2; +} +.ant-skeleton-content .ant-skeleton-paragraph > li { + background: #f2f2f2; +} +.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title, +.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph > li { + background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); + background-size: 400% 100%; +} +.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar { + background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); + background-size: 400% 100%; +} +.ant-slider { + color: rgba(0, 0, 0, 0.65); +} +.ant-slider-rail { + border-radius: 2px; + background-color: #f5f5f5; +} +.ant-slider-track { + border-radius: 4px; + background-color: color(~`colorPalette("@{primary-color}", 3)`); +} +.ant-slider-handle { + border-radius: 50%; + border: solid 2px color(~`colorPalette("@{primary-color}", 3)`); + background-color: #fff; +} +.ant-slider-handle:focus { + border-color: #46a6ff; + box-shadow: 0 0 0 5px #8cc8ff; +} +.ant-slider-handle.ant-tooltip-open { + border-color: @primary-color; +} +.ant-slider:hover .ant-slider-rail { + background-color: #e1e1e1; +} +.ant-slider:hover .ant-slider-track { + background-color: color(~`colorPalette("@{primary-color}", 4)`); +} +.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open) { + border-color: color(~`colorPalette("@{primary-color}", 4)`); +} +.ant-slider-mark-text { + color: rgba(0, 0, 0, 0.45); +} +.ant-slider-mark-text-active { + color: rgba(0, 0, 0, 0.65); +} +.ant-slider-step { + background: transparent; +} +.ant-slider-dot { + border: 2px solid #e8e8e8; + background-color: #fff; + border-radius: 50%; +} +.ant-slider-dot-active { + border-color: #8cc8ff; +} +.ant-slider-disabled .ant-slider-track { + background-color: rgba(0, 0, 0, 0.25) !important; +} +.ant-slider-disabled .ant-slider-handle, +.ant-slider-disabled .ant-slider-dot { + border-color: rgba(0, 0, 0, 0.25) !important; + background-color: #fff; + box-shadow: none; +} +.ant-spin { + color: rgba(0, 0, 0, 0.65); + color: @primary-color; +} +.ant-spin-blur:after { + background: #fff; +} +.ant-spin-tip { + color: rgba(0, 0, 0, 0.45); +} +.ant-spin-dot i { + border-radius: 100%; + background-color: @primary-color; +} +.ant-steps { + color: rgba(0, 0, 0, 0.65); +} +.ant-steps-item-icon { + border: 1px solid rgba(0, 0, 0, 0.25); + border-radius: 32px; +} +.ant-steps-item-icon > .ant-steps-icon { + color: @primary-color; +} +.ant-steps-item-tail:after { + background: #e8e8e8; + border-radius: 1px; +} +.ant-steps-item-title { + color: rgba(0, 0, 0, 0.65); +} +.ant-steps-item-title:after { + background: #e8e8e8; +} +.ant-steps-item-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-wait .ant-steps-item-icon { + border-color: rgba(0, 0, 0, 0.25); + background-color: #fff; +} +.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: rgba(0, 0, 0, 0.25); +} +.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-title { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: #e8e8e8; +} +.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-wait > .ant-steps-item-tail:after { + background-color: #e8e8e8; +} +.ant-steps-item-process .ant-steps-item-icon { + border-color: @primary-color; + background-color: #fff; +} +.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { + color: @primary-color; +} +.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: @primary-color; +} +.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: #e8e8e8; +} +.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-description { + color: rgba(0, 0, 0, 0.65); +} +.ant-steps-item-process > .ant-steps-item-tail:after { + background-color: #e8e8e8; +} +.ant-steps-item-process .ant-steps-item-icon { + background: @primary-color; +} +.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { + color: #fff; +} +.ant-steps-item-finish .ant-steps-item-icon { + border-color: @primary-color; + background-color: #fff; +} +.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon { + color: @primary-color; +} +.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: @primary-color; +} +.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-title { + color: rgba(0, 0, 0, 0.65); +} +.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: @primary-color; +} +.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-finish > .ant-steps-item-tail:after { + background-color: @primary-color; +} +.ant-steps-item-error .ant-steps-item-icon { + border-color: #f5222d; + background-color: #fff; +} +.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon { + color: #f5222d; +} +.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: #f5222d; +} +.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-title { + color: #f5222d; +} +.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: #e8e8e8; +} +.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-description { + color: #f5222d; +} +.ant-steps-item-error > .ant-steps-item-tail:after { + background-color: #e8e8e8; +} +.ant-steps-item.ant-steps-next-error .ant-steps-item-title:after { + background: #f5222d; +} +.ant-steps-item-custom .ant-steps-item-icon { + background: none; + border: 0; +} +.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { + color: @primary-color; +} +.ant-steps-small .ant-steps-item-icon { + border-radius: 24px; +} +.ant-steps-small .ant-steps-item-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon { + border-radius: 0; + border: 0; + background: none; +} +.ant-steps-dot .ant-steps-item-icon { + border: 0; + background: transparent; +} +.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot { + border-radius: 100px; +} +.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after { + background: rgba(0, 0, 0, 0.001); +} +.ant-switch { + color: rgba(0, 0, 0, 0.65); + border-radius: 100px; + border: 1px solid transparent; + background-color: rgba(0, 0, 0, 0.25); +} +.ant-switch-inner { + color: #fff; +} +.ant-switch-loading-icon, +.ant-switch:after { + border-radius: 18px; + background-color: #fff; +} +.ant-switch:after { + box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2); +} +.ant-switch-loading-icon { + background: transparent; +} +.ant-switch-loading .ant-switch-loading-icon { + color: rgba(0, 0, 0, 0.65); +} +.ant-switch-checked.ant-switch-loading .ant-switch-loading-icon { + color: @primary-color; +} +.ant-switch:focus { + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); +} +.ant-switch:focus:hover { + box-shadow: none; +} +.ant-switch-checked { + background-color: @primary-color; +} +.ant-table { + color: rgba(0, 0, 0, 0.65); +} +.ant-table table { + border-collapse: collapse; + border-radius: 4px 4px 0 0; +} +.ant-table-thead > tr > th { + background: #fafafa; + color: rgba(0, 0, 0, 0.85); + border-bottom: 1px solid #e8e8e8; +} +.ant-table-thead > tr > th .anticon-filter, +.ant-table-thead > tr > th .ant-table-filter-icon { + color: #bfbfbf; +} +.ant-table-thead > tr > th .ant-table-filter-selected.anticon-filter { + color: @primary-color; +} +.ant-table-thead > tr > th .ant-table-column-sorter { + color: #bfbfbf; +} +.ant-table-thead > tr > th .ant-table-column-sorter-up.on, +.ant-table-thead > tr > th .ant-table-column-sorter-down.on { + color: @primary-color; +} +.ant-table-thead > tr > th.ant-table-column-has-actions:hover { + background: #f5f5f5; +} +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .anticon-filter, +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .ant-table-filter-icon { + background: #f5f5f5; +} +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .anticon-filter:hover, +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .ant-table-filter-icon:hover { + color: rgba(0, 0, 0, 0.45); + background: #ebebeb; +} +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .anticon-filter:active, +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .ant-table-filter-icon:active { + color: rgba(0, 0, 0, 0.65); +} +.ant-table-thead > tr > th.ant-table-column-has-actions .anticon-filter.ant-table-filter-open, +.ant-table-thead > tr > th.ant-table-column-has-actions .ant-table-filter-icon.ant-table-filter-open { + color: rgba(0, 0, 0, 0.45); + background: #ebebeb; +} +.ant-table-thead > tr > th.ant-table-column-has-actions:active .ant-table-column-sorter-up:not(.on), +.ant-table-thead > tr > th.ant-table-column-has-actions:active .ant-table-column-sorter-down:not(.on) { + color: rgba(0, 0, 0, 0.45); +} +.ant-table-thead > tr > th .ant-table-column-sorters:before { + background: transparent; +} +.ant-table-thead > tr > th .ant-table-column-sorters:hover:before { + background: rgba(0, 0, 0, 0.04); +} +.ant-table-thead > tr:first-child > th:first-child { + border-top-left-radius: 4px; +} +.ant-table-thead > tr:first-child > th:last-child { + border-top-right-radius: 4px; +} +.ant-table-thead > tr:not(:last-child) > th[colspan] { + border-bottom: 0; +} +.ant-table-tbody > tr > td { + border-bottom: 1px solid #e8e8e8; +} +.ant-table-thead > tr.ant-table-row-hover > td, +.ant-table-tbody > tr.ant-table-row-hover > td, +.ant-table-thead > tr:hover > td, +.ant-table-tbody > tr:hover > td { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-table-thead > tr:hover { + background: none; +} +.ant-table-footer { + background: #fafafa; + border-radius: 0 0 4px 4px; + border-top: 1px solid #e8e8e8; +} +.ant-table-footer:before { + background: #fafafa; +} +.ant-table.ant-table-bordered .ant-table-footer { + border: 1px solid #e8e8e8; +} +.ant-table-title { + border-radius: 4px 4px 0 0; +} +.ant-table.ant-table-bordered .ant-table-title { + border: 1px solid #e8e8e8; +} +.ant-table-title + .ant-table-content { + border-radius: 4px 4px 0 0; +} +.ant-table-bordered .ant-table-title + .ant-table-content, +.ant-table-bordered .ant-table-title + .ant-table-content table, +.ant-table-bordered .ant-table-title + .ant-table-content .ant-table-thead > tr:first-child > th { + border-radius: 0; +} +.ant-table-without-column-header .ant-table-title + .ant-table-content, +.ant-table-without-column-header table { + border-radius: 0; +} +.ant-table-tbody > tr.ant-table-row-selected td { + background: #fafafa; +} +.ant-table-thead > tr > th.ant-table-column-sort { + background: #f5f5f5; +} +.ant-table-tbody > tr > td.ant-table-column-sort { + background: rgba(0, 0, 0, 0.01); +} +.ant-table-header { + background: #fafafa; +} +.ant-table-header table { + border-radius: 4px 4px 0 0; +} +.ant-table-loading .ant-table-body { + background: #fff; +} +.ant-table-bordered .ant-table-header > table, +.ant-table-bordered .ant-table-body > table, +.ant-table-bordered .ant-table-fixed-left table, +.ant-table-bordered .ant-table-fixed-right table { + border: 1px solid #e8e8e8; + border-right: 0; + border-bottom: 0; +} +.ant-table-bordered.ant-table-empty .ant-table-placeholder { + border-left: 1px solid #e8e8e8; + border-right: 1px solid #e8e8e8; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-header > table { + border-bottom: 0; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-body > table { + border-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-body-inner > table { + border-top: 0; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-placeholder { + border: 0; +} +.ant-table-bordered .ant-table-thead > tr:not(:last-child) > th { + border-bottom: 1px solid #e8e8e8; +} +.ant-table-bordered .ant-table-thead > tr > th, +.ant-table-bordered .ant-table-tbody > tr > td { + border-right: 1px solid #e8e8e8; +} +.ant-table-placeholder { + background: #fff; + border-bottom: 1px solid #e8e8e8; + color: rgba(0, 0, 0, 0.45); +} +.ant-table-filter-dropdown { + background: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-table-filter-dropdown .ant-dropdown-menu { + border: 0; + box-shadow: none; + border-radius: 4px 4px 0 0; +} +.ant-table-filter-dropdown .ant-dropdown-menu-sub { + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-table-filter-dropdown .ant-dropdown-menu .ant-dropdown-submenu-contain-selected .ant-dropdown-menu-submenu-title:after { + color: @primary-color; +} +.ant-table-filter-dropdown > .ant-dropdown-menu > .ant-dropdown-menu-item:last-child, +.ant-table-filter-dropdown > .ant-dropdown-menu > .ant-dropdown-menu-submenu:last-child .ant-dropdown-menu-submenu-title { + border-radius: 0; +} +.ant-table-filter-dropdown-btns { + border-top: 1px solid #e8e8e8; +} +.ant-table-filter-dropdown-link { + color: @primary-color; +} +.ant-table-filter-dropdown-link:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-table-filter-dropdown-link:active { + color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-table-selection .anticon-down { + color: #bfbfbf; +} +.ant-table-selection-menu { + background: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-table-selection-menu .ant-action-down { + color: #bfbfbf; +} +.ant-table-selection-down:hover .anticon-down { + color: #666; +} +.ant-table-row-expand-icon { + border: 1px solid #e8e8e8; + background: #fff; +} +tr.ant-table-expanded-row, +tr.ant-table-expanded-row:hover { + background: #fbfbfb; +} +.ant-table-fixed-header > .ant-table-content > .ant-table-scroll > .ant-table-body { + background: #fff; +} +.ant-table-fixed-left, +.ant-table-fixed-right { + border-radius: 0; +} +.ant-table-fixed-left table, +.ant-table-fixed-right table { + background: #fff; +} +.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-outer .ant-table-fixed, +.ant-table-fixed-header .ant-table-fixed-right .ant-table-body-outer .ant-table-fixed { + border-radius: 0; +} +.ant-table-fixed-left { + box-shadow: 6px 0 6px -4px rgba(0, 0, 0, 0.15); +} +.ant-table-fixed-left, +.ant-table-fixed-left table { + border-radius: 4px 0 0 0; +} +.ant-table-fixed-left .ant-table-thead > tr > th:last-child { + border-top-right-radius: 0; +} +.ant-table-fixed-right { + box-shadow: -6px 0 6px -4px rgba(0, 0, 0, 0.15); +} +.ant-table-fixed-right, +.ant-table-fixed-right table { + border-radius: 0 4px 0 0; +} +.ant-table-fixed-right .ant-table-expanded-row { + color: transparent; +} +.ant-table-fixed-right .ant-table-thead > tr > th:first-child { + border-top-left-radius: 0; +} +.ant-table.ant-table-scroll-position-left .ant-table-fixed-left { + box-shadow: none; +} +.ant-table.ant-table-scroll-position-right .ant-table-fixed-right { + box-shadow: none; +} +.ant-table-small { + border: 1px solid #e8e8e8; + border-radius: 4px; +} +.ant-table-small > .ant-table-title { + border-bottom: 1px solid #e8e8e8; +} +.ant-table-small > .ant-table-content > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-body > table, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table { + border: 0; +} +.ant-table-small > .ant-table-content > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th { + background: #fff; + border-bottom: 1px solid #e8e8e8; +} +.ant-table-small > .ant-table-content .ant-table-header { + background: #fff; +} +.ant-table-small > .ant-table-content .ant-table-placeholder, +.ant-table-small > .ant-table-content .ant-table-row:last-child td { + border-bottom: 0; +} +.ant-table-small.ant-table-bordered { + border-right: 0; +} +.ant-table-small.ant-table-bordered .ant-table-title { + border: 0; + border-bottom: 1px solid #e8e8e8; + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-content { + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-footer { + border: 0; + border-top: 1px solid #e8e8e8; + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-placeholder { + border-left: 0; + border-bottom: 0; +} +.ant-table-small.ant-table-bordered .ant-table-thead > tr > th:last-child, +.ant-table-small.ant-table-bordered .ant-table-tbody > tr > td:last-child { + border-right: none; +} +.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-thead > tr > th:last-child, +.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-tbody > tr > td:last-child { + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-fixed-right { + border-right: 1px solid #e8e8e8; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab { + border: 1px solid #e8e8e8; + border-bottom: 0; + border-radius: 4px 4px 0 0; + background: #fafafa; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active { + background: #fff; + border-color: #e8e8e8; + color: @primary-color; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab .ant-tabs-close-x { + color: rgba(0, 0, 0, 0.45); +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab .ant-tabs-close-x:hover { + color: rgba(0, 0, 0, 0.85); +} +.ant-tabs-extra-content .ant-tabs-new-tab { + border-radius: 2px; + border: 1px solid #e8e8e8; + color: rgba(0, 0, 0, 0.65); +} +.ant-tabs-extra-content .ant-tabs-new-tab:hover { + color: @primary-color; + border-color: @primary-color; +} +.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab { + border-bottom: 1px solid #e8e8e8; +} +.ant-tabs-vertical.ant-tabs-card.ant-tabs-left > .ant-tabs-bar .ant-tabs-tab { + border-right: 0; + border-radius: 4px 0 0 4px; +} +.ant-tabs-vertical.ant-tabs-card.ant-tabs-right > .ant-tabs-bar .ant-tabs-tab { + border-left: 0; + border-radius: 0 4px 4px 0; +} +.ant-tabs.ant-tabs-card.ant-tabs-bottom > .ant-tabs-bar .ant-tabs-tab { + border-bottom: 1px solid #e8e8e8; + border-top: 0; + border-radius: 0 0 4px 4px; +} +.ant-tabs.ant-tabs-card.ant-tabs-bottom > .ant-tabs-bar .ant-tabs-tab-active { + color: @primary-color; +} +.ant-tabs { + color: rgba(0, 0, 0, 0.65); +} +.ant-tabs-ink-bar { + background-color: @primary-color; +} +.ant-tabs-bar { + border-bottom: 1px solid #e8e8e8; +} +.ant-tabs-bottom .ant-tabs-bar { + border-bottom: none; + border-top: 1px solid #e8e8e8; +} +.ant-tabs-tab-prev, +.ant-tabs-tab-next { + border: 0; + background-color: transparent; + color: rgba(0, 0, 0, 0.45); +} +.ant-tabs-tab-prev:hover, +.ant-tabs-tab-next:hover { + color: rgba(0, 0, 0, 0.65); +} +.ant-tabs-tab-btn-disabled, +.ant-tabs-tab-btn-disabled:hover { + color: rgba(0, 0, 0, 0.25); +} +.ant-tabs-nav .ant-tabs-tab-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-tabs-nav .ant-tabs-tab:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-tabs-nav .ant-tabs-tab:active { + color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-tabs-nav .ant-tabs-tab-active { + color: @primary-color; +} +.ant-tabs-vertical > .ant-tabs-bar { + border-bottom: 0; +} +.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar { + border-right: 1px solid #e8e8e8; +} +.ant-tabs-vertical.ant-tabs-left > .ant-tabs-content { + border-left: 1px solid #e8e8e8; +} +.ant-tabs-vertical.ant-tabs-right > .ant-tabs-bar { + border-left: 1px solid #e8e8e8; +} +.ant-tabs-vertical.ant-tabs-right > .ant-tabs-content { + border-right: 1px solid #e8e8e8; +} +.ant-tag { + color: rgba(0, 0, 0, 0.65); + border-radius: 4px; + border: 1px solid #d9d9d9; + background: #fafafa; +} +.ant-tag, +.ant-tag a, +.ant-tag a:hover { + color: rgba(0, 0, 0, 0.65); +} +.ant-tag .anticon-close { + color: rgba(0, 0, 0, 0.45); +} +.ant-tag .anticon-close:hover { + color: rgba(0, 0, 0, 0.85); +} +.ant-tag-has-color { + border-color: transparent; +} +.ant-tag-has-color, +.ant-tag-has-color a, +.ant-tag-has-color a:hover, +.ant-tag-has-color .anticon-close, +.ant-tag-has-color .anticon-close:hover { + color: #fff; +} +.ant-tag-checkable { + background-color: transparent; + border-color: transparent; +} +.ant-tag-checkable:not(.ant-tag-checkable-checked):hover { + color: @primary-color; +} +.ant-tag-checkable:active, +.ant-tag-checkable-checked { + color: #fff; +} +.ant-tag-checkable-checked { + background-color: @primary-color; +} +.ant-tag-checkable:active { + background-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-tag-pink { + color: #eb2f96; + background: #fff0f6; + border-color: #ffadd2; +} +.ant-tag-pink-inverse { + background: #eb2f96; + border-color: #eb2f96; + color: #fff; +} +.ant-tag-magenta { + color: #eb2f96; + background: #fff0f6; + border-color: #ffadd2; +} +.ant-tag-magenta-inverse { + background: #eb2f96; + border-color: #eb2f96; + color: #fff; +} +.ant-tag-red { + color: #f5222d; + background: #fff1f0; + border-color: #ffa39e; +} +.ant-tag-red-inverse { + background: #f5222d; + border-color: #f5222d; + color: #fff; +} +.ant-tag-volcano { + color: #fa541c; + background: #fff2e8; + border-color: #ffbb96; +} +.ant-tag-volcano-inverse { + background: #fa541c; + border-color: #fa541c; + color: #fff; +} +.ant-tag-orange { + color: #fa8c16; + background: #fff7e6; + border-color: #ffd591; +} +.ant-tag-orange-inverse { + background: #fa8c16; + border-color: #fa8c16; + color: #fff; +} +.ant-tag-yellow { + color: #fadb14; + background: #feffe6; + border-color: #fffb8f; +} +.ant-tag-yellow-inverse { + background: #fadb14; + border-color: #fadb14; + color: #fff; +} +.ant-tag-gold { + color: #faad14; + background: #fffbe6; + border-color: #ffe58f; +} +.ant-tag-gold-inverse { + background: #faad14; + border-color: #faad14; + color: #fff; +} +.ant-tag-cyan { + color: #13c2c2; + background: #e6fffb; + border-color: #87e8de; +} +.ant-tag-cyan-inverse { + background: #13c2c2; + border-color: #13c2c2; + color: #fff; +} +.ant-tag-lime { + color: #a0d911; + background: #fcffe6; + border-color: #eaff8f; +} +.ant-tag-lime-inverse { + background: #a0d911; + border-color: #a0d911; + color: #fff; +} +.ant-tag-green { + color: #52c41a; + background: #f6ffed; + border-color: #b7eb8f; +} +.ant-tag-green-inverse { + background: #52c41a; + border-color: #52c41a; + color: #fff; +} +.ant-tag-blue { + color: @primary-color; + background: color(~`colorPalette("@{primary-color}", 1)`); + border-color: color(~`colorPalette("@{primary-color}", 3)`); +} +.ant-tag-blue-inverse { + background: @primary-color; + border-color: @primary-color; + color: #fff; +} +.ant-tag-geekblue { + color: #2f54eb; + background: #f0f5ff; + border-color: #adc6ff; +} +.ant-tag-geekblue-inverse { + background: #2f54eb; + border-color: #2f54eb; + color: #fff; +} +.ant-tag-purple { + color: #722ed1; + background: #f9f0ff; + border-color: #d3adf7; +} +.ant-tag-purple-inverse { + background: #722ed1; + border-color: #722ed1; + color: #fff; +} +.ant-time-picker-panel { + color: rgba(0, 0, 0, 0.65); +} +.ant-time-picker-panel-inner { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + background-clip: padding-box; +} +.ant-time-picker-panel-input { + border: 0; +} +.ant-time-picker-panel-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-time-picker-panel-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-panel-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-panel-input-wrap { + border-bottom: 1px solid #e8e8e8; +} +.ant-time-picker-panel-input-invalid { + border-color: red; +} +.ant-time-picker-panel-clear-btn-icon svg { + color: rgba(0, 0, 0, 0.25); +} +.ant-time-picker-panel-clear-btn-icon svg:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-time-picker-panel-select { + border-left: 1px solid #e8e8e8; +} +.ant-time-picker-panel-select:first-child { + border-left: 0; +} +.ant-time-picker-panel-select:last-child { + border-right: 0; +} +.ant-time-picker-panel-select li:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +li.ant-time-picker-panel-select-option-selected { + background: #f5f5f5; +} +li.ant-time-picker-panel-select-option-selected:hover { + background: #f5f5f5; +} +li.ant-time-picker-panel-select-option-disabled { + color: rgba(0, 0, 0, 0.25); +} +li.ant-time-picker-panel-select-option-disabled:hover { + background: transparent; +} +.ant-time-picker-panel-addon { + border-top: 1px solid #e8e8e8; +} +.ant-time-picker { + color: rgba(0, 0, 0, 0.65); +} +.ant-time-picker-input { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-time-picker-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-time-picker-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-time-picker-input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-time-picker-input-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-time-picker-input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-time-picker-input[disabled] { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-time-picker-input[disabled]:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-time-picker-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-time-picker-icon .ant-time-picker-clock-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-timeline { + color: rgba(0, 0, 0, 0.65); +} +.ant-timeline-item-tail { + border-left: 2px solid #e8e8e8; +} +.ant-timeline-item-head { + background-color: #fff; + border-radius: 100px; + border: 2px solid transparent; +} +.ant-timeline-item-head-blue { + border-color: @primary-color; + color: @primary-color; +} +.ant-timeline-item-head-red { + border-color: #f5222d; + color: #f5222d; +} +.ant-timeline-item-head-green { + border-color: #52c41a; + color: #52c41a; +} +.ant-timeline-item-head-custom { + border: 0; + border-radius: 0; +} +.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail { + border-left: 2px dotted #e8e8e8; +} +.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail { + border-left: 2px dotted #e8e8e8; +} +.ant-tooltip { + color: rgba(0, 0, 0, 0.65); +} +.ant-tooltip-inner { + color: #fff; + background-color: rgba(0, 0, 0, 0.75); + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-tooltip-arrow { + border-color: transparent; + border-style: solid; +} +.ant-tooltip-placement-top .ant-tooltip-arrow, +.ant-tooltip-placement-topLeft .ant-tooltip-arrow, +.ant-tooltip-placement-topRight .ant-tooltip-arrow { + border-width: 5px 5px 0; + border-top-color: rgba(0, 0, 0, 0.75); +} +.ant-tooltip-placement-right .ant-tooltip-arrow, +.ant-tooltip-placement-rightTop .ant-tooltip-arrow, +.ant-tooltip-placement-rightBottom .ant-tooltip-arrow { + border-width: 5px 5px 5px 0; + border-right-color: rgba(0, 0, 0, 0.75); +} +.ant-tooltip-placement-left .ant-tooltip-arrow, +.ant-tooltip-placement-leftTop .ant-tooltip-arrow, +.ant-tooltip-placement-leftBottom .ant-tooltip-arrow { + border-width: 5px 0 5px 5px; + border-left-color: rgba(0, 0, 0, 0.75); +} +.ant-tooltip-placement-bottom .ant-tooltip-arrow, +.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow, +.ant-tooltip-placement-bottomRight .ant-tooltip-arrow { + border-width: 0 5px 5px; + border-bottom-color: rgba(0, 0, 0, 0.75); +} +.ant-transfer { + color: rgba(0, 0, 0, 0.65); +} +.ant-transfer-disabled .ant-transfer-list { + background: #f5f5f5; +} +.ant-transfer-list { + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-transfer-list-search-action { + color: rgba(0, 0, 0, 0.25); +} +.ant-transfer-list-search-action .anticon { + color: rgba(0, 0, 0, 0.25); +} +.ant-transfer-list-search-action .anticon:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-transfer-list-header { + border-radius: 4px 4px 0 0; + background: #fff; + color: rgba(0, 0, 0, 0.65); + border-bottom: 1px solid #e8e8e8; +} +.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-transfer-list-content-item-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-transfer-list-body-not-found { + color: rgba(0, 0, 0, 0.25); +} +.ant-transfer-list-footer { + border-top: 1px solid #e8e8e8; + border-radius: 0 0 4px 4px; +} +.ant-select-tree-checkbox { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner, +.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner, +.ant-select-tree-checkbox-input:focus + .ant-select-tree-checkbox-inner { + border-color: @primary-color; +} +.ant-select-tree-checkbox-checked:after { + border-radius: 2px; + border: 1px solid @primary-color; +} +.ant-select-tree-checkbox-inner { + border: 1px solid #d9d9d9; + border-radius: 2px; + background-color: #fff; +} +.ant-select-tree-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner:after { + border: 0; + background-color: @primary-color; +} +.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner { + background-color: @primary-color; + border-color: @primary-color; +} +.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after { + border-color: #f5f5f5; +} +.ant-select-tree-checkbox-disabled + span { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-tree-checkbox-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree-checkbox-group { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree li .ant-select-tree-node-content-wrapper { + border-radius: 2px; + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree li .ant-select-tree-node-content-wrapper:hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-select-tree li .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected { + background-color: color(~`colorPalette("@{primary-color}", 2)`); +} +.ant-select-tree li span.ant-select-tree-switcher, +.ant-select-tree li span.ant-select-tree-iconEle { + border: 0 none; +} +.ant-select-tree li span.ant-select-icon_loading .ant-select-switcher-loading-icon { + color: @primary-color; +} +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-loading-icon, +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-loading-icon { + color: @primary-color; +} +li.ant-select-tree-treenode-disabled > span:not(.ant-select-tree-switcher), +li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper, +li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper span { + color: rgba(0, 0, 0, 0.25); +} +li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper:hover { + background: transparent; +} +.ant-select-tree-dropdown { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree-dropdown .ant-select-dropdown-search .ant-select-search__field { + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-select-tree-dropdown .ant-select-not-found { + color: rgba(0, 0, 0, 0.25); +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper { + border-radius: 0; +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper:hover, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper:hover { + background: transparent; +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper:hover:before, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper:hover:before { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper.ant-tree-node-selected, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper.ant-tree-node-selected { + color: #fff; + background: transparent; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-switcher, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-switcher { + color: #fff; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox .ant-tree-checkbox-inner, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox .ant-tree-checkbox-inner { + border-color: @primary-color; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked:after, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked:after { + border-color: #fff; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner { + background: #fff; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after { + border-color: @primary-color; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-node-content-wrapper:before, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-node-content-wrapper:before { + background: @primary-color; +} +.ant-tree-checkbox { + color: rgba(0, 0, 0, 0.65); +} +.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner, +.ant-tree-checkbox:hover .ant-tree-checkbox-inner, +.ant-tree-checkbox-input:focus + .ant-tree-checkbox-inner { + border-color: @primary-color; +} +.ant-tree-checkbox-checked:after { + border-radius: 2px; + border: 1px solid @primary-color; +} +.ant-tree-checkbox-inner { + border: 1px solid #d9d9d9; + border-radius: 2px; + background-color: #fff; +} +.ant-tree-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after { + border: 0; + background-color: @primary-color; +} +.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-tree-checkbox-checked .ant-tree-checkbox-inner { + background-color: @primary-color; + border-color: @primary-color; +} +.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-tree-checkbox-disabled .ant-tree-checkbox-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after { + border-color: #f5f5f5; +} +.ant-tree-checkbox-disabled + span { + color: rgba(0, 0, 0, 0.25); +} +.ant-tree-checkbox-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-tree-checkbox-group { + color: rgba(0, 0, 0, 0.65); +} +.ant-tree { + color: rgba(0, 0, 0, 0.65); +} +.ant-tree li span[draggable], +.ant-tree li span[draggable="true"] { + border-top: 2px transparent solid; + border-bottom: 2px transparent solid; +} +.ant-tree li.drag-over > span[draggable] { + background-color: @primary-color; + color: white; +} +.ant-tree li.drag-over-gap-top > span[draggable] { + border-top-color: @primary-color; +} +.ant-tree li.drag-over-gap-bottom > span[draggable] { + border-bottom-color: @primary-color; +} +.ant-tree li.filter-node > span { + color: #f5222d !important; +} +.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-loading-icon, +.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-loading-icon { + color: @primary-color; +} +.ant-tree li .ant-tree-node-content-wrapper { + border-radius: 2px; + color: rgba(0, 0, 0, 0.65); +} +.ant-tree li .ant-tree-node-content-wrapper:hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-tree li .ant-tree-node-content-wrapper.ant-tree-node-selected { + background-color: color(~`colorPalette("@{primary-color}", 2)`); +} +.ant-tree li span.ant-tree-switcher, +.ant-tree li span.ant-tree-iconEle { + border: 0 none; +} +li.ant-tree-treenode-disabled > span:not(.ant-tree-switcher), +li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper, +li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper span { + color: rgba(0, 0, 0, 0.25); +} +li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper:hover { + background: transparent; +} +.ant-tree.ant-tree-show-line li span.ant-tree-switcher { + background: #fff; + color: rgba(0, 0, 0, 0.45); +} +.ant-tree.ant-tree-show-line li:not(:last-child):before { + border-left: 1px solid #d9d9d9; +} +.ant-upload { + color: rgba(0, 0, 0, 0.65); +} +.ant-upload.ant-upload-select-picture-card { + border: 1px dashed #d9d9d9; + border-radius: 4px; + background-color: #fafafa; +} +.ant-upload.ant-upload-select-picture-card:hover { + border-color: @primary-color; +} +.ant-upload.ant-upload-drag { + border: 1px dashed #d9d9d9; + border-radius: 4px; + background: #fafafa; +} +.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled) { + border: 2px dashed color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-upload.ant-upload-drag p.ant-upload-text { + color: rgba(0, 0, 0, 0.85); +} +.ant-upload.ant-upload-drag p.ant-upload-hint { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload.ant-upload-drag .anticon-plus { + color: rgba(0, 0, 0, 0.25); +} +.ant-upload.ant-upload-drag .anticon-plus:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload.ant-upload-drag:hover .anticon-plus { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list { + color: rgba(0, 0, 0, 0.65); +} +.ant-upload-list-item-info .anticon-loading, +.ant-upload-list-item-info .anticon-paper-clip { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list-item .anticon-close { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list-item .anticon-close:hover { + color: rgba(0, 0, 0, 0.65); +} +.ant-upload-list-item:hover .ant-upload-list-item-info { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-upload-list-item-error, +.ant-upload-list-item-error .anticon-paper-clip, +.ant-upload-list-item-error .ant-upload-list-item-name { + color: #f5222d; +} +.ant-upload-list-item-error .anticon-close { + color: #f5222d !important; +} +.ant-upload-list-picture .ant-upload-list-item, +.ant-upload-list-picture-card .ant-upload-list-item { + border-radius: 4px; + border: 1px solid #d9d9d9; +} +.ant-upload-list-picture .ant-upload-list-item:hover, +.ant-upload-list-picture-card .ant-upload-list-item:hover { + background: transparent; +} +.ant-upload-list-picture .ant-upload-list-item-error, +.ant-upload-list-picture-card .ant-upload-list-item-error { + border-color: #f5222d; +} +.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info, +.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info { + background: transparent; +} +.ant-upload-list-picture .ant-upload-list-item-uploading, +.ant-upload-list-picture-card .ant-upload-list-item-uploading { + border-style: dashed; +} +.ant-upload-list-picture .ant-upload-list-item-icon, +.ant-upload-list-picture-card .ant-upload-list-item-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-upload-list-picture .ant-upload-list-item-thumbnail.anticon:before, +.ant-upload-list-picture-card .ant-upload-list-item-thumbnail.anticon:before { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list-picture-card .ant-upload-list-item-info:before { + background-color: rgba(0, 0, 0, 0.5); +} +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o, +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete { + color: rgba(255, 255, 255, 0.85); +} +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o:hover, +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover { + color: #fff; +} +.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item { + background-color: #fafafa; +} +.ant-upload-list-picture-card .ant-upload-list-item-uploading-text { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list .ant-upload-success-icon { + color: #52c41a; +} + +.drawer .drawer-content { + background: #001529; +} + +.ant-list-item-meta .taobao { + color: #ff4000; + border-radius: 4px; +} +.ant-list-item-meta .dingding { + background-color: #2eabff; + color: #fff; + border-radius: 4px; +} +.ant-list-item-meta .alipay { + color: #2eabff; + border-radius: 4px; +} +font.strong { + color: #52c41a; +} +font.medium { + color: #faad14; +} +font.weak { + color: #f5222d; +} diff --git a/ui/public/index.html b/ui/public/index.html new file mode 100644 index 0000000..4b516a5 --- /dev/null +++ b/ui/public/index.html @@ -0,0 +1,23 @@ + + + + + + + CMDB + + + + +

+
+
+ +
+
+
+ + + diff --git a/ui/public/loading/loading.css b/ui/public/loading/loading.css new file mode 100644 index 0000000..a899eac --- /dev/null +++ b/ui/public/loading/loading.css @@ -0,0 +1 @@ +#preloadingAnimation{position:fixed;left:0;top:0;height:100%;width:100%;background:#ffffff;user-select:none;z-index: 9999;overflow: hidden}.lds-roller{display:inline-block;position:relative;left:50%;top:50%;transform:translate(-50%,-50%);width:64px;height:64px;}.lds-roller div{animation:lds-roller 1.2s cubic-bezier(0.5,0,0.5,1) infinite;transform-origin:32px 32px;}.lds-roller div:after{content:" ";display:block;position:absolute;width:6px;height:6px;border-radius:50%;background:#13c2c2;margin:-3px 0 0 -3px;}.lds-roller div:nth-child(1){animation-delay:-0.036s;}.lds-roller div:nth-child(1):after{top:50px;left:50px;}.lds-roller div:nth-child(2){animation-delay:-0.072s;}.lds-roller div:nth-child(2):after{top:54px;left:45px;}.lds-roller div:nth-child(3){animation-delay:-0.108s;}.lds-roller div:nth-child(3):after{top:57px;left:39px;}.lds-roller div:nth-child(4){animation-delay:-0.144s;}.lds-roller div:nth-child(4):after{top:58px;left:32px;}.lds-roller div:nth-child(5){animation-delay:-0.18s;}.lds-roller div:nth-child(5):after{top:57px;left:25px;}.lds-roller div:nth-child(6){animation-delay:-0.216s;}.lds-roller div:nth-child(6):after{top:54px;left:19px;}.lds-roller div:nth-child(7){animation-delay:-0.252s;}.lds-roller div:nth-child(7):after{top:50px;left:14px;}.lds-roller div:nth-child(8){animation-delay:-0.288s;}.lds-roller div:nth-child(8):after{top:45px;left:10px;}#preloadingAnimation .load-tips{color: #13c2c2;font-size:2rem;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin-top:80px;text-align:center;width:400px;height:64px;} @keyframes lds-roller{0%{transform:rotate(0deg);} 100%{transform:rotate(360deg);}} \ No newline at end of file diff --git a/ui/public/loading/loading.html b/ui/public/loading/loading.html new file mode 100644 index 0000000..9b93196 --- /dev/null +++ b/ui/public/loading/loading.html @@ -0,0 +1 @@ +
Loading
\ No newline at end of file diff --git a/ui/public/loading/option2/html_code_segment.html b/ui/public/loading/option2/html_code_segment.html new file mode 100644 index 0000000..df81b26 --- /dev/null +++ b/ui/public/loading/option2/html_code_segment.html @@ -0,0 +1,5 @@ +
+
+ +
+
\ No newline at end of file diff --git a/ui/public/loading/option2/loading.css b/ui/public/loading/option2/loading.css new file mode 100644 index 0000000..c35cd73 --- /dev/null +++ b/ui/public/loading/option2/loading.css @@ -0,0 +1 @@ +.preloading-animate{background:#ffffff;width:100%;height:100%;position:fixed;left:0;top:0;z-index:299;}.preloading-animate .preloading-wrapper{position:absolute;width:5rem;height:5rem;left:50%;top:50%;transform:translate(-50%,-50%);}.preloading-animate .preloading-wrapper .preloading-balls{font-size:5rem;} \ No newline at end of file diff --git a/ui/public/loading/option2/loading.svg b/ui/public/loading/option2/loading.svg new file mode 100644 index 0000000..7ff7322 --- /dev/null +++ b/ui/public/loading/option2/loading.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/src/App.vue b/ui/src/App.vue new file mode 100644 index 0000000..baa95ea --- /dev/null +++ b/ui/src/App.vue @@ -0,0 +1,41 @@ + + + + diff --git a/ui/src/EventBus.js b/ui/src/EventBus.js new file mode 100644 index 0000000..8853b4d --- /dev/null +++ b/ui/src/EventBus.js @@ -0,0 +1,3 @@ +import Vue from 'vue' + +export default new Vue() diff --git a/ui/src/api/cmdb/CIRelation.js b/ui/src/api/cmdb/CIRelation.js new file mode 100644 index 0000000..d1e1ed6 --- /dev/null +++ b/ui/src/api/cmdb/CIRelation.js @@ -0,0 +1,15 @@ +import { axios } from '@/utils/request' + +export function getFirstCIs (ciId) { + return axios({ + url: '/v0.1/ci_relations/' + ciId + '/first_cis', + method: 'GET' + }) +} + +export function getSecondCIs (ciId) { + return axios({ + url: '/v0.1/ci_relations/' + ciId + '/second_cis', + method: 'GET' + }) +} diff --git a/ui/src/api/cmdb/CIType.js b/ui/src/api/cmdb/CIType.js new file mode 100644 index 0000000..7ec6137 --- /dev/null +++ b/ui/src/api/cmdb/CIType.js @@ -0,0 +1,111 @@ +import { axios } from '@/utils/request' + +/** + * 获取 所有的 ci_types + * @param parameter + * @returns {AxiosPromise} + */ +export function getCITypes (parameter) { + return axios({ + url: '/v0.1/ci_types', + method: 'GET', + params: parameter + }) +} + +/** + * 获取 某个 ci_types + * @param CITypeName + * @param parameter + * @returns {AxiosPromise} + */ +export function getCIType (CITypeName, parameter) { + return axios({ + url: `/v0.1/ci_types/${CITypeName}`, + method: 'GET', + params: parameter + }) +} + +/** + * 创建 ci_type + * @param data + * @returns {AxiosPromise} + */ +export function createCIType (data) { + return axios({ + url: '/v0.1/ci_types', + method: 'POST', + data: data + }) +} + +/** + * 更新 ci_type + * @param CITypeId + * @param data + * @returns {AxiosPromise} + */ +export function updateCIType (CITypeId, data) { + return axios({ + url: `/v0.1/ci_types/${CITypeId}`, + method: 'PUT', + data: data + }) +} + +/** + * 获取 某个 ci_type 的分组 + * @param CITypeId + * @param parameter + * @returns {AxiosPromise} + */ +export function getCITypeGroupById (CITypeId, data) { + return axios({ + url: `/v0.1/ci_types/${CITypeId}/attribute_groups`, + method: 'GET', + params: data + }) +} + +/** + * 保存 某个 ci_type 的分组 + * @param CITypeId + * @param data + * @returns {AxiosPromise} + */ +export function createCITypeGroupById (CITypeId, data) { + return axios({ + url: `/v0.1/ci_types/${CITypeId}/attribute_groups`, + method: 'POST', + data: data + }) +} + +/** + * 修改 某个 ci_type 的分组 + * @param groupId + * @param data + * @returns {AxiosPromise} + */ +export function updateCITypeGroupById (groupId, data) { + return axios({ + url: `/v0.1/ci_types/attribute_groups/${groupId}`, + method: 'PUT', + data: data + }) +} + +/** + * 删除 某个 ci_type 的分组 + * @param groupId + * @param data + * @returns {AxiosPromise} + */ +export function deleteCITypeGroupById (groupId, data) { + return axios({ + url: `/v0.1/ci_types/attribute_groups/${groupId}`, + method: 'delete', + data: data + }) +} diff --git a/ui/src/api/cmdb/CITypeAttr.js b/ui/src/api/cmdb/CITypeAttr.js new file mode 100644 index 0000000..dcce000 --- /dev/null +++ b/ui/src/api/cmdb/CITypeAttr.js @@ -0,0 +1,124 @@ +import { axios } from '@/utils/request' + +/** + * 获取 ci_type 的属性 + * @param CITypeName + * @param parameter + * @returns {AxiosPromise} + */ +export function getCITypeAttributesByName (CITypeName, parameter) { + return axios({ + + url: `/v0.1/ci_types/${CITypeName}/attributes`, + method: 'get', + params: parameter + }) +} + +/** + * 获取 ci_type 的属性 + * @param CITypeId + * @param parameter + * @returns {AxiosPromise} + */ +export function getCITypeAttributesById (CITypeId, parameter) { + return axios({ + url: `/v0.1/ci_types/${CITypeId}/attributes`, + method: 'get', + params: parameter + }) +} + +/** + * 更新属性 + * @param attrId + * @param data + * @returns {AxiosPromise} + */ +export function updateAttributeById (attrId, data) { + return axios({ + url: `/v0.1/attributes/${attrId}`, + method: 'put', + data: data + }) +} + +/** + * 添加属性 + * @param data + * @returns {AxiosPromise} + */ +export function createAttribute (data) { + return axios({ + url: `/v0.1/attributes`, + method: 'post', + data: data + }) +} + +/** + * 搜索属性/ 获取所有的属性 + * @param data + * @returns {AxiosPromise} + */ +export function searchAttributes (data) { + return axios({ + url: `/v0.1/attributes/s`, + method: 'get', + params: data + }) +} + +/** + * 删除属性 + * @param attrId + * @returns {AxiosPromise} + */ +export function deleteAttributesById (attrId) { + return axios({ + url: `/v0.1/attributes/${attrId}`, + method: 'delete' + }) +} + +/** + * 绑定ci_type 属性 + * @param CITypeId + * @param data + * @returns {AxiosPromise} + */ +export function createCITypeAttributes (CITypeId, data) { + return axios({ + url: `/v0.1/ci_types/${CITypeId}/attributes`, + method: 'post', + data: data + }) +} + +/** + * 更新ci_type 属性 + * @param CITypeId + * @param data + * @returns {AxiosPromise} + */ +export function updateCITypeAttributesById (CITypeId, data) { + return axios({ + url: `/v0.1/ci_types/${CITypeId}/attributes`, + method: 'put', + data: data + }) +} + +/** + * 删除ci_type 属性 + * @param CITypeId + * @param data + * @returns {AxiosPromise} + */ +export function deleteCITypeAttributesById (CITypeId, data) { + return axios({ + url: `/v0.1/ci_types/${CITypeId}/attributes`, + method: 'delete', + data: data + }) +} diff --git a/ui/src/api/cmdb/CITypeRelation.js b/ui/src/api/cmdb/CITypeRelation.js new file mode 100644 index 0000000..8305c6a --- /dev/null +++ b/ui/src/api/cmdb/CITypeRelation.js @@ -0,0 +1,40 @@ +import { axios } from '@/utils/request' + +export function getCITypeChildren (CITypeID, parameter) { + return axios({ + url: '/v0.1/ci_type_relations/' + CITypeID + '/children', + method: 'get', + params: parameter + }) +} + +export function getCITypeParent (CITypeID) { + return axios({ + url: '/v0.1/ci_type_relations/' + CITypeID + '/parents', + method: 'get' + }) +} + +export function getRelationTypes (CITypeID, parameter) { + return axios({ + url: '/v0.1/relation_types', + method: 'get', + params: parameter + }) +} + +export function createRelation (parentId, childrenId, relationTypeId) { + return axios({ + url: `/v0.1/ci_type_relations/${parentId}/${childrenId}`, + method: 'post', + data: { relation_type_id: relationTypeId } + }) +} + +export function deleteRelation (parentId, childrenId) { + return axios({ + url: `/v0.1/ci_type_relations/${parentId}/${childrenId}`, + method: 'delete' + + }) +} diff --git a/ui/src/api/cmdb/batch.js b/ui/src/api/cmdb/batch.js new file mode 100644 index 0000000..3a88e13 --- /dev/null +++ b/ui/src/api/cmdb/batch.js @@ -0,0 +1,67 @@ +import XLSX from 'xlsx' +import { axios } from '@/utils/request' + +export function processFile (fileObj) { + const promise = new Promise(function (resolve) { + const reader = new FileReader() + reader.readAsBinaryString(fileObj) + reader.onload = function (e) { + const data = e.target.result + const workbook = XLSX.read(data, { type: 'binary' }) + const sheet = workbook.Sheets[workbook.SheetNames[0]] + const lt = XLSX.utils.sheet_to_json(sheet, { header: 1 }) + resolve(lt) + } + }) + return promise +} + +export function uploadData (ciId, data) { + data.ci_type = ciId + return axios({ + url: '/v0.1/ci', + method: 'PUT', + data: data + }) +} + +export function writeCsv (columns) { + const { Parser } = require('json2csv') + const fields = columns + const opts = { fields } + const p = new Parser(opts) + return p.parse([]) +} + +export function writeExcel (columns, name) { + const worksheet = XLSX.utils.aoa_to_sheet([columns]) + const newWorkBoot = XLSX.utils.book_new() + XLSX.utils.book_append_sheet(newWorkBoot, worksheet, name) + const s = XLSX.write(newWorkBoot, { type: 'array' }) + console.log(s) + return s +} + +// 判断一个数组元素是否都为空的 +export function any (ArrayList) { + let flag = false + for (let i = 0; i < ArrayList.length; i++) { + if (ArrayList[i]) { + flag = true + return flag + } + } + return false +} + +// 去除一个二维数组 底下为空的部分 +export function filterNull (twoDimArray) { + console.log(twoDimArray) + const newArray = [] + for (let i = 0; i < twoDimArray.length; i++) { + if (any(twoDimArray[i])) { + newArray.push(twoDimArray[i]) + } + } + return newArray +} diff --git a/ui/src/api/cmdb/ci.js b/ui/src/api/cmdb/ci.js new file mode 100644 index 0000000..f06ee48 --- /dev/null +++ b/ui/src/api/cmdb/ci.js @@ -0,0 +1,41 @@ +import { axios } from '@/utils/request' + +const urlPrefix = '/v0.1' + +export function searchCI (params) { + return axios({ + url: urlPrefix + `/ci/s?${params}`, + method: 'GET' + }) +} + +export function addCI (params) { + return axios({ + url: urlPrefix + '/ci', + method: 'POST', + data: params + }) +} + +export function updateCI (id, params) { + return axios({ + url: urlPrefix + `/ci/${id}`, + method: 'PUT', + data: params + }) +} + +export function deleteCI (ciId) { + return axios({ + url: urlPrefix + `/ci/${ciId}`, + method: 'DELETE' + }) +} + +// 获取单个ci实例 +export function getCIById (ciId) { + return axios({ + url: urlPrefix + `/ci/${ciId}`, + method: 'GET' + }) +} diff --git a/ui/src/api/cmdb/history.js b/ui/src/api/cmdb/history.js new file mode 100644 index 0000000..443f7c6 --- /dev/null +++ b/ui/src/api/cmdb/history.js @@ -0,0 +1,8 @@ +import { axios } from '@/utils/request' + +export function getCIHistory (ciId) { + return axios({ + url: `/v0.1/history/ci/${ciId}`, + method: 'GET' + }) +} diff --git a/ui/src/api/cmdb/preference.js b/ui/src/api/cmdb/preference.js new file mode 100644 index 0000000..739b120 --- /dev/null +++ b/ui/src/api/cmdb/preference.js @@ -0,0 +1,41 @@ +import { axios } from '@/utils/request' + +export function getPreference (instance = true, tree = null) { + return axios({ + url: '/v0.1/preference/ci_types', + method: 'GET', + params: { instance: instance, tree: tree } + }) +} + +export function getSubscribeAttributes (ciTypeId) { + return axios({ + url: `/v0.1/preference/ci_types/${ciTypeId}/attributes`, + method: 'GET' + }) +} + +export function getSubscribeTreeView () { + return axios({ + url: '/v0.1/preference/tree/view', + method: 'GET' + }) +} + +export function subscribeCIType (ciTypeId, attrs) { + return axios({ + url: `/v0.1/preference/ci_types/${ciTypeId}/attributes`, + method: 'POST', + data: { + attr: attrs + } + }) +} + +export function subscribeTreeView (ciTypeId, levels) { + return axios({ + url: `/v0.1/preference/tree/view`, + method: 'POST', + data: { type_id: ciTypeId, levels: levels } + }) +} diff --git a/ui/src/api/index.js b/ui/src/api/index.js new file mode 100644 index 0000000..e422d8f --- /dev/null +++ b/ui/src/api/index.js @@ -0,0 +1,14 @@ +import config from '@/config/defaultSettings' + +const api = { + Login: config.useSSO ? '/api/sso/login' : '/login', + Logout: config.useSSO ? '/api/sso/logout' : '/logout', + ForgePassword: '/auth/forge-password', + Register: '/auth/register', + twoStepCode: '/auth/2step-code', + SendSms: '/account/sms', + SendSmsErr: '/account/sms_err', + // get my info + UserInfo: '/v1/perms/user/info' +} +export default api diff --git a/ui/src/api/login.js b/ui/src/api/login.js new file mode 100644 index 0000000..0bb542a --- /dev/null +++ b/ui/src/api/login.js @@ -0,0 +1,67 @@ +import api from './index' +import { axios } from '@/utils/request' +import config from '@/config/defaultSettings' +/** + * login func + * parameter: { + * username: '', + * password: '', + * remember_me: true, + * captcha: '12345' + * } + * @param parameter + * @returns {*} + */ +export function login(parameter) { + return axios({ + url: api.Login, + method: 'post', + data: parameter + }) +} + +export function getSmsCaptcha(parameter) { + return axios({ + url: api.SendSms, + method: 'post', + data: parameter + }) +} + +export function getInfo() { + return axios({ + url: api.UserInfo, + method: 'get', + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + } + }) +} + +export function logout() { + console.log('logout........') + if (config.useSSO) { + window.location.replace(api.Logout) + } else { + return axios({ + url: api.Logout, + method: 'post', + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + } + }) + } + +} + +/** + * get user 2step code open? + * @param parameter {*} + */ +export function get2step(parameter) { + return axios({ + url: api.twoStepCode, + method: 'post', + data: parameter + }) +} diff --git a/ui/src/api/manage.js b/ui/src/api/manage.js new file mode 100644 index 0000000..1c36a1e --- /dev/null +++ b/ui/src/api/manage.js @@ -0,0 +1,62 @@ +import { axios } from '@/utils/request' + +const api = { + user: '/user', + role: '/role', + service: '/service', + permission: '/permission', + permissionNoPager: '/permission/no-pager', + orgTree: '/org/tree' +} + +export default api + +export function getUserList (parameter) { + return axios({ + url: api.user, + method: 'get', + params: parameter + }) +} + +export function getRoleList (parameter) { + return axios({ + url: api.role, + method: 'get', + params: parameter + }) +} + +export function getServiceList (parameter) { + return axios({ + url: api.service, + method: 'get', + params: parameter + }) +} + +export function getPermissions (parameter) { + return axios({ + url: api.permissionNoPager, + method: 'get', + params: parameter + }) +} + +export function getOrgTree (parameter) { + return axios({ + url: api.orgTree, + method: 'get', + params: parameter + }) +} + +// id == 0 add post +// id != 0 update put +export function saveService (parameter) { + return axios({ + url: api.service, + method: parameter.id === 0 ? 'post' : 'put', + data: parameter + }) +} diff --git a/ui/src/assets/background.svg b/ui/src/assets/background.svg new file mode 100644 index 0000000..89c2597 --- /dev/null +++ b/ui/src/assets/background.svg @@ -0,0 +1,69 @@ + + + + Group 21 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/src/assets/icons/bx-analyse.svg b/ui/src/assets/icons/bx-analyse.svg new file mode 100644 index 0000000..b02a8d6 --- /dev/null +++ b/ui/src/assets/icons/bx-analyse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/src/assets/logo.png b/ui/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e887375c355c8045315ca9f39de93ec21d5e71d9 GIT binary patch literal 20228 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 + + + Vue + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/src/components/ArticleListContent/ArticleListContent.vue b/ui/src/components/ArticleListContent/ArticleListContent.vue new file mode 100644 index 0000000..8f39978 --- /dev/null +++ b/ui/src/components/ArticleListContent/ArticleListContent.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/ui/src/components/ArticleListContent/index.js b/ui/src/components/ArticleListContent/index.js new file mode 100644 index 0000000..37d35c7 --- /dev/null +++ b/ui/src/components/ArticleListContent/index.js @@ -0,0 +1,3 @@ +import ArticleListContent from './ArticleListContent' + +export default ArticleListContent diff --git a/ui/src/components/AvatarList/Item.vue b/ui/src/components/AvatarList/Item.vue new file mode 100644 index 0000000..26e149e --- /dev/null +++ b/ui/src/components/AvatarList/Item.vue @@ -0,0 +1,46 @@ + + + diff --git a/ui/src/components/AvatarList/List.vue b/ui/src/components/AvatarList/List.vue new file mode 100644 index 0000000..446ceeb --- /dev/null +++ b/ui/src/components/AvatarList/List.vue @@ -0,0 +1,99 @@ + + + diff --git a/ui/src/components/AvatarList/index.js b/ui/src/components/AvatarList/index.js new file mode 100644 index 0000000..dd6bb8b --- /dev/null +++ b/ui/src/components/AvatarList/index.js @@ -0,0 +1,4 @@ +import AvatarList from './List' +import './index.less' + +export default AvatarList diff --git a/ui/src/components/AvatarList/index.less b/ui/src/components/AvatarList/index.less new file mode 100644 index 0000000..9ce073f --- /dev/null +++ b/ui/src/components/AvatarList/index.less @@ -0,0 +1,60 @@ +@import "../index"; + +@avatar-list-prefix-cls: ~"@{ant-pro-prefix}-avatar-list"; +@avatar-list-item-prefix-cls: ~"@{ant-pro-prefix}-avatar-list-item"; + +.@{avatar-list-prefix-cls} { + display: inline-block; + + ul { + list-style: none; + display: inline-block; + padding: 0; + margin: 0 0 0 8px; + font-size: 0; + } +} + +.@{avatar-list-item-prefix-cls} { + display: inline-block; + font-size: @font-size-base; + margin-left: -8px; + width: @avatar-size-base; + height: @avatar-size-base; + + :global { + .ant-avatar { + border: 1px solid #fff; + cursor: pointer; + } + } + + &.large { + width: @avatar-size-lg; + height: @avatar-size-lg; + } + + &.small { + width: @avatar-size-sm; + height: @avatar-size-sm; + } + + &.mini { + width: 20px; + height: 20px; + + :global { + .ant-avatar { + width: 20px; + height: 20px; + line-height: 20px; + + .ant-avatar-string { + font-size: 12px; + line-height: 18px; + } + } + } + } +} + diff --git a/ui/src/components/AvatarList/index.md b/ui/src/components/AvatarList/index.md new file mode 100644 index 0000000..dc9c092 --- /dev/null +++ b/ui/src/components/AvatarList/index.md @@ -0,0 +1,64 @@ +# AvatarList 用户头像列表 + + +一组用户头像,常用在项目/团队成员列表。可通过设置 `size` 属性来指定头像大小。 + + + +引用方式: + +```javascript +import AvatarList from '@/components/AvatarList' +const AvatarListItem = AvatarList.AvatarItem + +export default { + components: { + AvatarList, + AvatarListItem + } +} +``` + + + +## 代码演示 [demo](https://pro.loacg.com/test/home) + +```html + + + + + +``` +或 +```html + + + + + + + + + +``` + + + +## API + +### AvatarList + +| 参数 | 说明 | 类型 | 默认值 | +| ---------------- | -------- | ---------------------------------- | --------- | +| size | 头像大小 | `large`、`small` 、`mini`, `default` | `default` | +| maxLength | 要显示的最大项目 | number | - | +| excessItemsStyle | 多余的项目风格 | CSSProperties | - | + +### AvatarList.Item + +| 参数 | 说明 | 类型 | 默认值 | +| ---- | ------ | --------- | --- | +| tips | 头像展示文案 | string | - | +| src | 头像图片连接 | string | - | + diff --git a/ui/src/components/Charts/Bar.vue b/ui/src/components/Charts/Bar.vue new file mode 100644 index 0000000..4482845 --- /dev/null +++ b/ui/src/components/Charts/Bar.vue @@ -0,0 +1,62 @@ + + + diff --git a/ui/src/components/Charts/ChartCard.vue b/ui/src/components/Charts/ChartCard.vue new file mode 100644 index 0000000..fc1f425 --- /dev/null +++ b/ui/src/components/Charts/ChartCard.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/ui/src/components/Charts/Liquid.vue b/ui/src/components/Charts/Liquid.vue new file mode 100644 index 0000000..4019fb1 --- /dev/null +++ b/ui/src/components/Charts/Liquid.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/ui/src/components/Charts/MiniArea.vue b/ui/src/components/Charts/MiniArea.vue new file mode 100644 index 0000000..58fe92c --- /dev/null +++ b/ui/src/components/Charts/MiniArea.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/ui/src/components/Charts/MiniBar.vue b/ui/src/components/Charts/MiniBar.vue new file mode 100644 index 0000000..beac404 --- /dev/null +++ b/ui/src/components/Charts/MiniBar.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/ui/src/components/Charts/MiniProgress.vue b/ui/src/components/Charts/MiniProgress.vue new file mode 100644 index 0000000..e691363 --- /dev/null +++ b/ui/src/components/Charts/MiniProgress.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/ui/src/components/Charts/MiniSmoothArea.vue b/ui/src/components/Charts/MiniSmoothArea.vue new file mode 100644 index 0000000..e5455c2 --- /dev/null +++ b/ui/src/components/Charts/MiniSmoothArea.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/ui/src/components/Charts/Radar.vue b/ui/src/components/Charts/Radar.vue new file mode 100644 index 0000000..5ee88ad --- /dev/null +++ b/ui/src/components/Charts/Radar.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/ui/src/components/Charts/RankList.vue b/ui/src/components/Charts/RankList.vue new file mode 100644 index 0000000..afb56a1 --- /dev/null +++ b/ui/src/components/Charts/RankList.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/ui/src/components/Charts/TagCloud.vue b/ui/src/components/Charts/TagCloud.vue new file mode 100644 index 0000000..74d1b3f --- /dev/null +++ b/ui/src/components/Charts/TagCloud.vue @@ -0,0 +1,113 @@ + + + diff --git a/ui/src/components/Charts/TransferBar.vue b/ui/src/components/Charts/TransferBar.vue new file mode 100644 index 0000000..7f96f0b --- /dev/null +++ b/ui/src/components/Charts/TransferBar.vue @@ -0,0 +1,64 @@ + + + diff --git a/ui/src/components/Charts/Trend.vue b/ui/src/components/Charts/Trend.vue new file mode 100644 index 0000000..2dce37e --- /dev/null +++ b/ui/src/components/Charts/Trend.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/ui/src/components/Charts/chart.less b/ui/src/components/Charts/chart.less new file mode 100644 index 0000000..e04fa09 --- /dev/null +++ b/ui/src/components/Charts/chart.less @@ -0,0 +1,13 @@ +.antv-chart-mini { + position: relative; + width: 100%; + + .chart-wrapper { + position: absolute; + bottom: -28px; + width: 100%; + +/* margin: 0 -5px; + overflow: hidden;*/ + } +} \ No newline at end of file diff --git a/ui/src/components/Charts/smooth.area.less b/ui/src/components/Charts/smooth.area.less new file mode 100644 index 0000000..eabdb75 --- /dev/null +++ b/ui/src/components/Charts/smooth.area.less @@ -0,0 +1,14 @@ +@import "../index"; + +@smoothArea-prefix-cls: ~"@{ant-pro-prefix}-smooth-area"; + +.@{smoothArea-prefix-cls} { + position: relative; + width: 100%; + + .chart-wrapper { + position: absolute; + bottom: -28px; + width: 100%; + } +} \ No newline at end of file diff --git a/ui/src/components/CountDown/CountDown.vue b/ui/src/components/CountDown/CountDown.vue new file mode 100644 index 0000000..575dd4a --- /dev/null +++ b/ui/src/components/CountDown/CountDown.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/ui/src/components/CountDown/index.js b/ui/src/components/CountDown/index.js new file mode 100644 index 0000000..35e954f --- /dev/null +++ b/ui/src/components/CountDown/index.js @@ -0,0 +1,3 @@ +import CountDown from './CountDown' + +export default CountDown diff --git a/ui/src/components/CountDown/index.md b/ui/src/components/CountDown/index.md new file mode 100644 index 0000000..fd46809 --- /dev/null +++ b/ui/src/components/CountDown/index.md @@ -0,0 +1,34 @@ +# CountDown 倒计时 + +倒计时组件。 + + + +引用方式: + +```javascript +import CountDown from '@/components/CountDown/CountDown' + +export default { + components: { + CountDown + } +} +``` + + + +## 代码演示 [demo](https://pro.loacg.com/test/home) + +```html + +``` + + + +## API + +| 参数 | 说明 | 类型 | 默认值 | +|----------|------------------------------------------|-------------|-------| +| target | 目标时间 | Date | - | +| onEnd | 倒计时结束回调 | funtion | -| diff --git a/ui/src/components/DescriptionList/DescriptionList.vue b/ui/src/components/DescriptionList/DescriptionList.vue new file mode 100644 index 0000000..f504477 --- /dev/null +++ b/ui/src/components/DescriptionList/DescriptionList.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/ui/src/components/DescriptionList/index.js b/ui/src/components/DescriptionList/index.js new file mode 100644 index 0000000..7aed83d --- /dev/null +++ b/ui/src/components/DescriptionList/index.js @@ -0,0 +1,2 @@ +import DescriptionList from './DescriptionList' +export default DescriptionList diff --git a/ui/src/components/Editor/QuillEditor.vue b/ui/src/components/Editor/QuillEditor.vue new file mode 100644 index 0000000..731701c --- /dev/null +++ b/ui/src/components/Editor/QuillEditor.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/ui/src/components/Editor/WangEditor.vue b/ui/src/components/Editor/WangEditor.vue new file mode 100644 index 0000000..d9c71c7 --- /dev/null +++ b/ui/src/components/Editor/WangEditor.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/ui/src/components/Ellipsis/Ellipsis.vue b/ui/src/components/Ellipsis/Ellipsis.vue new file mode 100644 index 0000000..5d59200 --- /dev/null +++ b/ui/src/components/Ellipsis/Ellipsis.vue @@ -0,0 +1,64 @@ + diff --git a/ui/src/components/Ellipsis/index.js b/ui/src/components/Ellipsis/index.js new file mode 100644 index 0000000..91e3ff4 --- /dev/null +++ b/ui/src/components/Ellipsis/index.js @@ -0,0 +1,3 @@ +import Ellipsis from './Ellipsis' + +export default Ellipsis diff --git a/ui/src/components/Ellipsis/index.md b/ui/src/components/Ellipsis/index.md new file mode 100644 index 0000000..f528ac7 --- /dev/null +++ b/ui/src/components/Ellipsis/index.md @@ -0,0 +1,38 @@ +# Ellipsis 文本自动省略号 + +文本过长自动处理省略号,支持按照文本长度和最大行数两种方式截取。 + + + +引用方式: + +```javascript +import Ellipsis from '@/components/Ellipsis' + +export default { + components: { + Ellipsis + } +} +``` + + + +## 代码演示 [demo](https://pro.loacg.com/test/home) + +```html + + There were injuries alleged in three cases in 2015, and a + fourth incident in September, according to the safety recall report. After meeting with US regulators in October, the firm decided to issue a voluntary recall. + +``` + + + +## API + + +参数 | 说明 | 类型 | 默认值 +----|------|-----|------ +tooltip | 移动到文本展示完整内容的提示 | boolean | - +length | 在按照长度截取下的文本最大字符数,超过则截取省略 | number | - \ No newline at end of file diff --git a/ui/src/components/Exception/ExceptionPage.vue b/ui/src/components/Exception/ExceptionPage.vue new file mode 100644 index 0000000..cc10801 --- /dev/null +++ b/ui/src/components/Exception/ExceptionPage.vue @@ -0,0 +1,130 @@ + + + + diff --git a/ui/src/components/Exception/index.js b/ui/src/components/Exception/index.js new file mode 100644 index 0000000..dda91be --- /dev/null +++ b/ui/src/components/Exception/index.js @@ -0,0 +1,2 @@ +import ExceptionPage from './ExceptionPage.vue' +export default ExceptionPage diff --git a/ui/src/components/Exception/type.js b/ui/src/components/Exception/type.js new file mode 100644 index 0000000..8158f0f --- /dev/null +++ b/ui/src/components/Exception/type.js @@ -0,0 +1,19 @@ +const types = { + 403: { + img: 'https://gw.alipayobjects.com/zos/rmsportal/wZcnGqRDyhPOEYFcZDnb.svg', + title: '403', + desc: '抱歉,你无权访问该页面' + }, + 404: { + img: 'https://gw.alipayobjects.com/zos/rmsportal/KpnpchXsobRgLElEozzI.svg', + title: '404', + desc: '抱歉,你访问的页面不存在或仍在开发中' + }, + 500: { + img: 'https://gw.alipayobjects.com/zos/rmsportal/RVRUAYdCGeYNBWoKiIwB.svg', + title: '500', + desc: '抱歉,服务器出错了' + } +} + +export default types diff --git a/ui/src/components/FooterToolbar/FooterToolBar.vue b/ui/src/components/FooterToolbar/FooterToolBar.vue new file mode 100644 index 0000000..f4056dc --- /dev/null +++ b/ui/src/components/FooterToolbar/FooterToolBar.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/ui/src/components/FooterToolbar/index.js b/ui/src/components/FooterToolbar/index.js new file mode 100644 index 0000000..a0bf145 --- /dev/null +++ b/ui/src/components/FooterToolbar/index.js @@ -0,0 +1,4 @@ +import FooterToolBar from './FooterToolBar' +import './index.less' + +export default FooterToolBar diff --git a/ui/src/components/FooterToolbar/index.less b/ui/src/components/FooterToolbar/index.less new file mode 100644 index 0000000..f56273f --- /dev/null +++ b/ui/src/components/FooterToolbar/index.less @@ -0,0 +1,23 @@ +@import "../index"; + +@footer-toolbar-prefix-cls: ~"@{ant-pro-prefix}-footer-toolbar"; + +.@{footer-toolbar-prefix-cls} { + position: fixed; + width: 100%; + bottom: 0; + right: 0; + height: 56px; + line-height: 56px; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.03); + background: #fff; + border-top: 1px solid #e8e8e8; + padding: 0 24px; + z-index: 9; + + &:after { + content: ""; + display: block; + clear: both; + } +} \ No newline at end of file diff --git a/ui/src/components/FooterToolbar/index.md b/ui/src/components/FooterToolbar/index.md new file mode 100644 index 0000000..c1aec2c --- /dev/null +++ b/ui/src/components/FooterToolbar/index.md @@ -0,0 +1,48 @@ +# FooterToolbar 底部工具栏 + +固定在底部的工具栏。 + + + +## 何时使用 + +固定在内容区域的底部,不随滚动条移动,常用于长页面的数据搜集和提交工作。 + + + +引用方式: + +```javascript +import FooterToolBar from '@/components/FooterToolbar' + +export default { + components: { + FooterToolBar + } +} +``` + + + +## 代码演示 + +```html + + 提交 + +``` +或 +```html + + 提交 + +``` + + +## API + +参数 | 说明 | 类型 | 默认值 +----|------|-----|------ +children (slot) | 工具栏内容,向右对齐 | - | - +extra | 额外信息,向左对齐 | String, Object | - + diff --git a/ui/src/components/GlobalFooter/GlobalFooter.vue b/ui/src/components/GlobalFooter/GlobalFooter.vue new file mode 100644 index 0000000..717a87a --- /dev/null +++ b/ui/src/components/GlobalFooter/GlobalFooter.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/ui/src/components/GlobalFooter/index.js b/ui/src/components/GlobalFooter/index.js new file mode 100644 index 0000000..832e0bd --- /dev/null +++ b/ui/src/components/GlobalFooter/index.js @@ -0,0 +1,2 @@ +import GlobalFooter from './GlobalFooter' +export default GlobalFooter diff --git a/ui/src/components/GlobalHeader/GlobalHeader.vue b/ui/src/components/GlobalHeader/GlobalHeader.vue new file mode 100644 index 0000000..e865c0a --- /dev/null +++ b/ui/src/components/GlobalHeader/GlobalHeader.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/ui/src/components/GlobalHeader/index.js b/ui/src/components/GlobalHeader/index.js new file mode 100644 index 0000000..0807c87 --- /dev/null +++ b/ui/src/components/GlobalHeader/index.js @@ -0,0 +1,2 @@ +import GlobalHeader from './GlobalHeader' +export default GlobalHeader diff --git a/ui/src/components/IconSelector/IconSelector.vue b/ui/src/components/IconSelector/IconSelector.vue new file mode 100644 index 0000000..810d297 --- /dev/null +++ b/ui/src/components/IconSelector/IconSelector.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/ui/src/components/IconSelector/README.md b/ui/src/components/IconSelector/README.md new file mode 100644 index 0000000..503095d --- /dev/null +++ b/ui/src/components/IconSelector/README.md @@ -0,0 +1,48 @@ +IconSelector +==== + +> 图标选择组件,常用于为某一个数据设定一个图标时使用 +> eg: 设定菜单列表时,为每个菜单设定一个图标 + +该组件由 [@Saraka](https://github.com/saraka-tsukai) 封装 + + + +### 使用方式 + +```vue + + + +``` + + + +### 事件 + + +| 名称 | 说明 | 类型 | 默认值 | +| ------ | -------------------------- | ------ | ------ | +| change | 当改变了 `icon` 选中项触发 | String | - | diff --git a/ui/src/components/IconSelector/icons.js b/ui/src/components/IconSelector/icons.js new file mode 100644 index 0000000..920f464 --- /dev/null +++ b/ui/src/components/IconSelector/icons.js @@ -0,0 +1,36 @@ +/** + * 增加新的图标时,请遵循以下数据结构 + * Adding new icon please follow the data structure below + */ +export default [ + { + key: 'directional', + title: '方向性图标', + icons: ['step-backward', 'step-forward', 'fast-backward', 'fast-forward', 'shrink', 'arrows-alt', 'down', 'up', 'left', 'right', 'caret-up', 'caret-down', 'caret-left', 'caret-right', 'up-circle', 'down-circle', 'left-circle', 'right-circle', 'double-right', 'double-left', 'vertical-left', 'vertical-right', 'forward', 'backward', 'rollback', 'enter', 'retweet', 'swap', 'swap-left', 'swap-right', 'arrow-up', 'arrow-down', 'arrow-left', 'arrow-right', 'play-circle', 'up-square', 'down-square', 'left-square', 'right-square', 'login', 'logout', 'menu-fold', 'menu-unfold', 'border-bottom', 'border-horizontal', 'border-inner', 'border-left', 'border-right', 'border-top', 'border-verticle', 'pic-center', 'pic-left', 'pic-right', 'radius-bottomleft', 'radius-bottomright', 'radius-upleft', 'fullscreen', 'fullscreen-exit'] + }, + { + key: 'suggested', + title: '提示建议性图标', + icons: ['question', 'question-circle', 'plus', 'plus-circle', 'pause', 'pause-circle', 'minus', 'minus-circle', 'plus-square', 'minus-square', 'info', 'info-circle', 'exclamation', 'exclamation-circle', 'close', 'close-circle', 'close-square', 'check', 'check-circle', 'check-square', 'clock-circle', 'warning', 'issues-close', 'stop'] + }, + { + key: 'editor', + title: '编辑类图标', + icons: ['edit', 'form', 'copy', 'scissor', 'delete', 'snippets', 'diff', 'highlight', 'align-center', 'align-left', 'align-right', 'bg-colors', 'bold', 'italic', 'underline', 'strikethrough', 'redo', 'undo', 'zoom-in', 'zoom-out', 'font-colors', 'font-size', 'line-height', 'colum-height', 'dash', 'small-dash', 'sort-ascending', 'sort-descending', 'drag', 'ordered-list', 'radius-setting'] + }, + { + key: 'data', + title: '数据类图标', + icons: ['area-chart', 'pie-chart', 'bar-chart', 'dot-chart', 'line-chart', 'radar-chart', 'heat-map', 'fall', 'rise', 'stock', 'box-plot', 'fund', 'sliders'] + }, + { + key: 'brand_logo', + title: '网站通用图标', + icons: ['lock', 'unlock', 'bars', 'book', 'calendar', 'cloud', 'cloud-download', 'code', 'copy', 'credit-card', 'delete', 'desktop', 'download', 'ellipsis', 'file', 'file-text', 'file-unknown', 'file-pdf', 'file-word', 'file-excel', 'file-jpg', 'file-ppt', 'file-markdown', 'file-add', 'folder', 'folder-open', 'folder-add', 'hdd', 'frown', 'meh', 'smile', 'inbox', 'laptop', 'appstore', 'link', 'mail', 'mobile', 'notification', 'paper-clip', 'picture', 'poweroff', 'reload', 'search', 'setting', 'share-alt', 'shopping-cart', 'tablet', 'tag', 'tags', 'to-top', 'upload', 'user', 'video-camera', 'home', 'loading', 'loading-3-quarters', 'cloud-upload', 'star', 'heart', 'environment', 'eye', 'camera', 'save', 'team', 'solution', 'phone', 'filter', 'exception', 'export', 'customer-service', 'qrcode', 'scan', 'like', 'dislike', 'message', 'pay-circle', 'calculator', 'pushpin', 'bulb', 'select', 'switcher', 'rocket', 'bell', 'disconnect', 'database', 'compass', 'barcode', 'hourglass', 'key', 'flag', 'layout', 'printer', 'sound', 'usb', 'skin', 'tool', 'sync', 'wifi', 'car', 'schedule', 'user-add', 'user-delete', 'usergroup-add', 'usergroup-delete', 'man', 'woman', 'shop', 'gift', 'idcard', 'medicine-box', 'red-envelope', 'coffee', 'copyright', 'trademark', 'safety', 'wallet', 'bank', 'trophy', 'contacts', 'global', 'shake', 'api', 'fork', 'dashboard', 'table', 'profile', 'alert', 'audit', 'branches', 'build', 'border', 'crown', 'experiment', 'fire', 'money-collect', 'property-safety', 'read', 'reconciliation', 'rest', 'security-scan', 'insurance', 'interation', 'safety-certificate', 'project', 'thunderbolt', 'block', 'cluster', 'deployment-unit', 'dollar', 'euro', 'pound', 'file-done', 'file-exclamation', 'file-protect', 'file-search', 'file-sync', 'gateway', 'gold', 'robot', 'shopping'] + }, + { + key: 'application', + title: '品牌和标识', + icons: ['android', 'apple', 'windows', 'ie', 'chrome', 'github', 'aliwangwang', 'dingding', 'weibo-square', 'weibo-circle', 'taobao-circle', 'html5', 'weibo', 'twitter', 'wechat', 'youtube', 'alipay-circle', 'taobao', 'skype', 'qq', 'medium-workmark', 'gitlab', 'medium', 'linkedin', 'google-plus', 'dropbox', 'facebook', 'codepen', 'code-sandbox', 'amazon', 'google', 'codepen-circle', 'alipay', 'ant-design', 'aliyun', 'zhihu', 'slack', 'slack-square', 'behance', 'behance-square', 'dribbble', 'dribbble-square', 'instagram', 'yuque', 'alibaba', 'yahoo'] + } +] diff --git a/ui/src/components/IconSelector/index.js b/ui/src/components/IconSelector/index.js new file mode 100644 index 0000000..2d27d70 --- /dev/null +++ b/ui/src/components/IconSelector/index.js @@ -0,0 +1,2 @@ +import IconSelector from './IconSelector' +export default IconSelector diff --git a/ui/src/components/Menu/SideMenu.vue b/ui/src/components/Menu/SideMenu.vue new file mode 100644 index 0000000..1616d3b --- /dev/null +++ b/ui/src/components/Menu/SideMenu.vue @@ -0,0 +1,63 @@ + + + diff --git a/ui/src/components/Menu/index.js b/ui/src/components/Menu/index.js new file mode 100644 index 0000000..4348509 --- /dev/null +++ b/ui/src/components/Menu/index.js @@ -0,0 +1,2 @@ +import SMenu from './menu' +export default SMenu diff --git a/ui/src/components/Menu/menu.js b/ui/src/components/Menu/menu.js new file mode 100644 index 0000000..6d959cb --- /dev/null +++ b/ui/src/components/Menu/menu.js @@ -0,0 +1,184 @@ +import Menu from 'ant-design-vue/es/menu' +import Icon from 'ant-design-vue/es/icon' + +const { Item, SubMenu } = Menu + +export default { + name: 'SMenu', + props: { + menu: { + type: Array, + required: true + }, + theme: { + type: String, + required: false, + default: 'dark' + }, + mode: { + type: String, + required: false, + default: 'inline' + }, + collapsed: { + type: Boolean, + required: false, + default: false + } + }, + data () { + return { + openKeys: [], + selectedKeys: [], + cachedOpenKeys: [] + } + }, + computed: { + rootSubmenuKeys: vm => { + const keys = [] + vm.menu.forEach(item => keys.push(item.path)) + return keys + } + }, + created () { + + }, + mounted () { + this.updateMenu() + }, + watch: { + collapsed (val) { + if (val) { + this.cachedOpenKeys = this.openKeys.concat() + this.openKeys = [] + } else { + this.openKeys = this.cachedOpenKeys + } + }, + $route: function () { + this.updateMenu() + } + + }, + methods: { + // select menu item + onOpenChange (openKeys) { + // 在水平模式下时执行,并且不再执行后续 + if (this.mode === 'horizontal') { + this.openKeys = openKeys + return + } + // 非水平模式时 + const latestOpenKey = openKeys.find(key => !this.openKeys.includes(key)) + if (!this.rootSubmenuKeys.includes(latestOpenKey)) { + this.openKeys = openKeys + } else { + this.openKeys = latestOpenKey ? [latestOpenKey] : [] + } + }, + updateMenu () { + const routes = this.$route.matched.concat() + + const { hidden } = this.$route.meta + if (routes.length >= 3 && hidden) { + routes.pop() + this.selectedKeys = [routes[routes.length - 1].path] + } else { + this.selectedKeys = [routes.pop().path] + } + const openKeys = [] + if (this.mode === 'inline') { + routes.forEach(item => { + openKeys.push(item.path) + }) + } + + this.collapsed ? (this.cachedOpenKeys = openKeys) : (this.openKeys = openKeys) + }, + // render + renderItem (menu) { + if (!menu.hidden) { + return menu.children && !menu.hideChildrenInMenu ? this.renderSubMenu(menu) : this.renderMenuItem(menu) + } + return null + }, + renderMenuItem (menu) { + const target = menu.meta.target || null + const tag = target && 'a' || 'router-link' + const props = { to: { name: menu.name } } + const attrs = { href: menu.path, target: menu.meta.target } + + if (menu.children && menu.hideChildrenInMenu) { + // 把有子菜单的 并且 父菜单是要隐藏子菜单的 + // 都给子菜单增加一个 hidden 属性 + // 用来给刷新页面时, selectedKeys 做控制用 + menu.children.forEach(item => { + item.meta = Object.assign(item.meta, { hidden: true }) + }) + } + + return ( + + + {this.renderIcon(menu.meta.icon)} + {menu.meta.title} + + + ) + }, + renderSubMenu (menu) { + const itemArr = [] + if (!menu.hideChildrenInMenu) { + menu.children.forEach(item => itemArr.push(this.renderItem(item))) + } + return ( + + + {this.renderIcon(menu.meta.icon)} + {menu.meta.title} + + {itemArr} + + ) + }, + renderIcon (icon) { + if (icon === 'none' || icon === undefined) { + return null + } + const props = {} + typeof (icon) === 'object' ? props.component = icon : props.type = icon + return ( + + ) + } + }, + + render () { + const { mode, theme, menu } = this + const props = { + mode: mode, + theme: theme, + openKeys: this.openKeys + } + const on = { + select: obj => { + this.selectedKeys = obj.selectedKeys + this.$emit('select', obj) + }, + openChange: this.onOpenChange + } + + const menuTree = menu.map(item => { + if (item.hidden) { + return null + } + return this.renderItem(item) + }) + // {...{ props, on: on }} + return ( + + {menuTree} + + ) + } +} diff --git a/ui/src/components/MultiTab/MultiTab.vue b/ui/src/components/MultiTab/MultiTab.vue new file mode 100644 index 0000000..9add79e --- /dev/null +++ b/ui/src/components/MultiTab/MultiTab.vue @@ -0,0 +1,173 @@ + + + diff --git a/ui/src/components/MultiTab/index.js b/ui/src/components/MultiTab/index.js new file mode 100644 index 0000000..ca2a216 --- /dev/null +++ b/ui/src/components/MultiTab/index.js @@ -0,0 +1,4 @@ +import MultiTab from './MultiTab' +import './index.less' + +export default MultiTab diff --git a/ui/src/components/MultiTab/index.less b/ui/src/components/MultiTab/index.less new file mode 100644 index 0000000..773e3af --- /dev/null +++ b/ui/src/components/MultiTab/index.less @@ -0,0 +1,25 @@ +@import '../index'; + +@multi-tab-prefix-cls: ~"@{ant-pro-prefix}-multi-tab"; +@multi-tab-wrapper-prefix-cls: ~"@{ant-pro-prefix}-multi-tab-wrapper"; + +/* +.topmenu .@{multi-tab-prefix-cls} { + max-width: 1200px; + margin: -23px auto 24px auto; +} +*/ +.@{multi-tab-prefix-cls} { + margin: -23px -24px 24px -24px; + background: #fff; +} + +.topmenu .@{multi-tab-wrapper-prefix-cls} { + max-width: 1200px; + margin: 0 auto; +} + +.topmenu.content-width-Fluid .@{multi-tab-wrapper-prefix-cls} { + max-width: 100%; + margin: 0 auto; +} diff --git a/ui/src/components/NoticeIcon/NoticeIcon.vue b/ui/src/components/NoticeIcon/NoticeIcon.vue new file mode 100644 index 0000000..f484ce0 --- /dev/null +++ b/ui/src/components/NoticeIcon/NoticeIcon.vue @@ -0,0 +1,90 @@ + + + + + + diff --git a/ui/src/components/NoticeIcon/index.js b/ui/src/components/NoticeIcon/index.js new file mode 100644 index 0000000..659b9ec --- /dev/null +++ b/ui/src/components/NoticeIcon/index.js @@ -0,0 +1,2 @@ +import NoticeIcon from './NoticeIcon' +export default NoticeIcon diff --git a/ui/src/components/NumberInfo/NumberInfo.vue b/ui/src/components/NumberInfo/NumberInfo.vue new file mode 100644 index 0000000..bdde3e0 --- /dev/null +++ b/ui/src/components/NumberInfo/NumberInfo.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/ui/src/components/NumberInfo/index.js b/ui/src/components/NumberInfo/index.js new file mode 100644 index 0000000..659a2f3 --- /dev/null +++ b/ui/src/components/NumberInfo/index.js @@ -0,0 +1,3 @@ +import NumberInfo from './NumberInfo' + +export default NumberInfo diff --git a/ui/src/components/NumberInfo/index.less b/ui/src/components/NumberInfo/index.less new file mode 100644 index 0000000..719113d --- /dev/null +++ b/ui/src/components/NumberInfo/index.less @@ -0,0 +1,55 @@ +@import "../index"; + +@numberInfo-prefix-cls: ~"@{ant-pro-prefix}-number-info"; + +.@{numberInfo-prefix-cls} { + + .ant-pro-number-info-subtitle { + color: @text-color-secondary; + font-size: @font-size-base; + height: 22px; + line-height: 22px; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + white-space: nowrap; + } + + .number-info-value { + margin-top: 4px; + font-size: 0; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + white-space: nowrap; + + & > span { + color: @heading-color; + display: inline-block; + line-height: 32px; + height: 32px; + font-size: 24px; + margin-right: 32px; + } + + .sub-total { + color: @text-color-secondary; + font-size: @font-size-lg; + vertical-align: top; + margin-right: 0; + i { + font-size: 12px; + transform: scale(0.82); + margin-left: 4px; + } + :global { + .anticon-caret-up { + color: @red-6; + } + .anticon-caret-down { + color: @green-6; + } + } + } + } +} \ No newline at end of file diff --git a/ui/src/components/NumberInfo/index.md b/ui/src/components/NumberInfo/index.md new file mode 100644 index 0000000..147adc4 --- /dev/null +++ b/ui/src/components/NumberInfo/index.md @@ -0,0 +1,43 @@ +# NumberInfo 数据文本 + +常用在数据卡片中,用于突出展示某个业务数据。 + + + +引用方式: + +```javascript +import NumberInfo from '@/components/NumberInfo' + +export default { + components: { + NumberInfo + } +} +``` + + + +## 代码演示 [demo](https://pro.loacg.com/test/home) + +```html + +``` + + + +## API + +参数 | 说明 | 类型 | 默认值 +----|------|-----|------ +title | 标题 | ReactNode\|string | - +subTitle | 子标题 | ReactNode\|string | - +total | 总量 | ReactNode\|string | - +subTotal | 子总量 | ReactNode\|string | - +status | 增加状态 | 'up \| down' | - +theme | 状态样式 | string | 'light' +gap | 设置数字和描述之间的间距(像素)| number | 8 diff --git a/ui/src/components/PageHeader/PageHeader.vue b/ui/src/components/PageHeader/PageHeader.vue new file mode 100644 index 0000000..80e686e --- /dev/null +++ b/ui/src/components/PageHeader/PageHeader.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/ui/src/components/PageHeader/index.js b/ui/src/components/PageHeader/index.js new file mode 100644 index 0000000..ec1078c --- /dev/null +++ b/ui/src/components/PageHeader/index.js @@ -0,0 +1,2 @@ +import PageHeader from './PageHeader' +export default PageHeader diff --git a/ui/src/components/PageLoading/index.jsx b/ui/src/components/PageLoading/index.jsx new file mode 100644 index 0000000..2886844 --- /dev/null +++ b/ui/src/components/PageLoading/index.jsx @@ -0,0 +1,10 @@ +import { Spin } from 'ant-design-vue' + +export default { + name: 'PageLoading', + render () { + return (
+ +
) + } +} diff --git a/ui/src/components/Result/Result.vue b/ui/src/components/Result/Result.vue new file mode 100644 index 0000000..99f7f19 --- /dev/null +++ b/ui/src/components/Result/Result.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/ui/src/components/Result/index.js b/ui/src/components/Result/index.js new file mode 100644 index 0000000..51cb3b2 --- /dev/null +++ b/ui/src/components/Result/index.js @@ -0,0 +1,2 @@ +import Result from './Result.vue' +export default Result diff --git a/ui/src/components/SettingDrawer/SettingDrawer.vue b/ui/src/components/SettingDrawer/SettingDrawer.vue new file mode 100644 index 0000000..52ed726 --- /dev/null +++ b/ui/src/components/SettingDrawer/SettingDrawer.vue @@ -0,0 +1,354 @@ + + + + + diff --git a/ui/src/components/SettingDrawer/SettingItem.vue b/ui/src/components/SettingDrawer/SettingItem.vue new file mode 100644 index 0000000..2b3b553 --- /dev/null +++ b/ui/src/components/SettingDrawer/SettingItem.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/ui/src/components/SettingDrawer/index.js b/ui/src/components/SettingDrawer/index.js new file mode 100644 index 0000000..8260f2d --- /dev/null +++ b/ui/src/components/SettingDrawer/index.js @@ -0,0 +1,2 @@ +import SettingDrawer from './SettingDrawer' +export default SettingDrawer diff --git a/ui/src/components/SettingDrawer/settingConfig.js b/ui/src/components/SettingDrawer/settingConfig.js new file mode 100644 index 0000000..4d9a2b0 --- /dev/null +++ b/ui/src/components/SettingDrawer/settingConfig.js @@ -0,0 +1,105 @@ +import { message } from 'ant-design-vue/es' +// import defaultSettings from '../defaultSettings'; +import themeColor from './themeColor.js' + +// let lessNodesAppended + +const colorList = [ + { + key: '薄暮', color: '#F5222D' + }, + { + key: '火山', color: '#FA541C' + }, + { + key: '日暮', color: '#FAAD14' + }, + { + key: '明青', color: '#13C2C2' + }, + { + key: '极光绿', color: '#52C41A' + }, + { + key: '拂晓蓝(默认)', color: '#1890FF' + }, + { + key: '极客蓝', color: '#2F54EB' + }, + { + key: '酱紫', color: '#722ED1' + } +] + +const updateTheme = newPrimaryColor => { + const hideMessage = message.loading('正在切换主题!', 0) + themeColor.changeColor(newPrimaryColor).finally(t => { + hideMessage() + }) +} + +/* +const updateTheme = primaryColor => { + // Don't compile less in production! + /* if (process.env.NODE_ENV === 'production') { + return; + } * / + // Determine if the component is remounted + if (!primaryColor) { + return + } + const hideMessage = message.loading('正在编译主题!', 0) + function buildIt () { + if (!window.less) { + return + } + setTimeout(() => { + window.less + .modifyVars({ + '@primary-color': primaryColor + }) + .then(() => { + hideMessage() + }) + .catch(() => { + message.error('Failed to update theme') + hideMessage() + }) + }, 200) + } + if (!lessNodesAppended) { + // insert less.js and color.less + const lessStyleNode = document.createElement('link') + const lessConfigNode = document.createElement('script') + const lessScriptNode = document.createElement('script') + lessStyleNode.setAttribute('rel', 'stylesheet/less') + lessStyleNode.setAttribute('href', '/color.less') + lessConfigNode.innerHTML = ` + window.less = { + async: true, + env: 'production', + javascriptEnabled: true + }; + ` + lessScriptNode.src = 'https://gw.alipayobjects.com/os/lib/less.js/3.8.1/less.min.js' + lessScriptNode.async = true + lessScriptNode.onload = () => { + buildIt() + lessScriptNode.onload = null + } + document.body.appendChild(lessStyleNode) + document.body.appendChild(lessConfigNode) + document.body.appendChild(lessScriptNode) + lessNodesAppended = true + } else { + buildIt() + } +} +*/ + +const updateColorWeak = colorWeak => { + // document.body.className = colorWeak ? 'colorWeak' : ''; + colorWeak ? document.body.classList.add('colorWeak') : document.body.classList.remove('colorWeak') +} + +export { updateTheme, colorList, updateColorWeak } diff --git a/ui/src/components/SettingDrawer/themeColor.js b/ui/src/components/SettingDrawer/themeColor.js new file mode 100644 index 0000000..6e7b480 --- /dev/null +++ b/ui/src/components/SettingDrawer/themeColor.js @@ -0,0 +1,23 @@ +import client from 'webpack-theme-color-replacer/client' +import generate from '@ant-design/colors/lib/generate' + +export default { + getAntdSerials (color) { + // 淡化(即less的tint) + const lightens = new Array(9).fill().map((t, i) => { + return client.varyColor.lighten(color, i / 10) + }) + // colorPalette变换得到颜色值 + const colorPalettes = generate(color) + return lightens.concat(colorPalettes) + }, + changeColor (newColor) { + var options = { + newColors: this.getAntdSerials(newColor), // new colors array, one-to-one corresponde with `matchColors` + changeUrl (cssUrl) { + return `/${cssUrl}` // while router is not `hash` mode, it needs absolute path + } + } + return client.changer.changeColor(options, Promise) + } +} diff --git a/ui/src/components/StandardFormRow/StandardFormRow.vue b/ui/src/components/StandardFormRow/StandardFormRow.vue new file mode 100644 index 0000000..a4e261b --- /dev/null +++ b/ui/src/components/StandardFormRow/StandardFormRow.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/ui/src/components/StandardFormRow/index.js b/ui/src/components/StandardFormRow/index.js new file mode 100644 index 0000000..8155cc7 --- /dev/null +++ b/ui/src/components/StandardFormRow/index.js @@ -0,0 +1,3 @@ +import StandardFormRow from './StandardFormRow' + +export default StandardFormRow diff --git a/ui/src/components/Table/README.md b/ui/src/components/Table/README.md new file mode 100644 index 0000000..1d2c9d0 --- /dev/null +++ b/ui/src/components/Table/README.md @@ -0,0 +1,341 @@ +Table 重封装组件说明 +==== + + +封装说明 +---- + +> 基础的使用方式与 API 与 [官方版(Table)](https://vuecomponent.github.io/ant-design-vue/components/table-cn/) 本一致,在其基础上,封装了加载数据的方法。 +> +> 你无需在你是用表格的页面进行分页逻辑处理,仅需向 Table 组件传递绑定 `:data="Promise"` 对象即可 + +该 `table` 由 [@Saraka](https://github.com/saraka-tsukai) 完成封装 + + +例子1 +---- +(基础使用) + +```vue + + + + + +``` + + + +例子2 +---- + +(简单的表格,最后一列是各种操作) + +```vue + + + +``` + + + +内置方法 +---- + +通过 `this.$refs.table` 调用 + +`this.$refs.table.refresh(true)` 刷新列表 (用户新增/修改数据后,重载列表数据) + +> 注意:要调用 `refresh(bool)` 需要给表格组件设定 `ref` 值 +> +> `refresh()` 方法可以传一个 `bool` 值,当有传值 或值为 `true` 时,则刷新时会强制刷新到第一页(常用户页面 搜索 按钮进行搜索时,结果从第一页开始分页) + + +内置属性 +---- +> 除去 `a-table` 自带属性外,还而外提供了一些额外属性属性 + + +| 属性 | 说明 | 类型 | 默认值 | +| -------------- | ----------------------------------------------- | ----------------- | ------ | +| alert | 设置是否显示表格信息栏 | [object, boolean] | null | +| showPagination | 显示分页选择器,可传 'auto' \| boolean | [string, boolean] | 'auto' | +| data | 加载数据方法 必须为 `Promise` 对象 **必须绑定** | Promise | - | + + +`alert` 属性对象: + +```javascript +alert: { + show: Boolean, + clear: [Function, Boolean] +} +``` + +注意事项 +---- + +> 你可能需要为了与后端提供的接口返回结果一致而去修改以下代码: +> (需要注意的是,这里的修改是全局性的,意味着整个项目所有使用该 table 组件都需要遵守这个返回结果定义的字段。) +> +> 文档中的结构有可能由于组件 bug 进行修正而改动。实际修改请以当时最新版本为准 + +修改 `@/components/table/index.js` 第 156 行起 + + + +```javascript +result.then(r => { + this.localPagination = this.showPagination && Object.assign({}, this.localPagination, { + current: r.pageNo, // 返回结果中的当前分页数 + total: r.totalCount, // 返回结果中的总记录数 + showSizeChanger: this.showSizeChanger, + pageSize: (pagination && pagination.pageSize) || + this.localPagination.pageSize + }) || false + // 为防止删除数据后导致页面当前页面数据长度为 0 ,自动翻页到上一页 + if (r.data.length === 0 && this.showPagination && this.localPagination.current > 1) { + this.localPagination.current-- + this.loadData() + return + } + + // 这里用于判断接口是否有返回 r.totalCount 且 this.showPagination = true 且 pageNo 和 pageSize 存在 且 totalCount 小于等于 pageNo * pageSize 的大小 + // 当情况满足时,表示数据不满足分页大小,关闭 table 分页功能 + try { + if ((['auto', true].includes(this.showPagination) && r.totalCount <= (r.pageNo * this.localPagination.pageSize))) { + this.localPagination.hideOnSinglePage = true + } + } catch (e) { + this.localPagination = false + } + console.log('loadData -> this.localPagination', this.localPagination) + this.localDataSource = r.data // 返回结果中的数组数据 + this.localLoading = false + }) +``` +返回 JSON 例子: +```json +{ + "message": "", + "result": { + "data": [{ + id: 1, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', + title: 'Alipay', + description: '那是一种内在的东西, 他们到达不了,也无法触及的', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 2, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', + title: 'Angular', + description: '希望是一个好东西,也许是最好的,好东西是不会消亡的', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 3, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', + title: 'Ant Design', + description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 4, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', + title: 'Ant Design Pro', + description: '那时候我只会想自己想要什么,从不想自己拥有什么', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 5, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', + title: 'Bootstrap', + description: '凛冬将至', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 6, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', + title: 'Vue', + description: '生命就像一盒巧克力,结果往往出人意料', + status: 1, + updatedAt: '2018-07-26 00:00:00' + } + ], + "pageSize": 10, + "pageNo": 0, + "totalPage": 6, + "totalCount": 57 + }, + "status": 200, + "timestamp": 1534955098193 +} +``` + + + +更新时间 +---- + +该文档最后更新于: 2019-06-23 PM 17:19 \ No newline at end of file diff --git a/ui/src/components/Table/index.js b/ui/src/components/Table/index.js new file mode 100644 index 0000000..0f1a5d6 --- /dev/null +++ b/ui/src/components/Table/index.js @@ -0,0 +1,315 @@ +import T from 'ant-design-vue/es/table/Table' +import get from 'lodash.get' + +export default { + data () { + return { + needTotalList: [], + + selectedRows: [], + selectedRowKeys: [], + + localLoading: false, + localDataSource: [], + localPagination: Object.assign({}, this.pagination) + } + }, + props: Object.assign({}, T.props, { + rowKey: { + type: [String, Function], + default: 'key' + }, + data: { + type: Function, + required: true + }, + pageNum: { + type: Number, + default: 1 + }, + pageSize: { + type: Number, + default: 10 + }, + showSizeChanger: { + type: Boolean, + default: true + }, + size: { + type: String, + default: 'default' + }, + alert: { + type: [Object, Boolean], + default: null + }, + rowSelection: { + type: Object, + default: null + }, + /** @Deprecated */ + showAlertInfo: { + type: Boolean, + default: false + }, + showPagination: { + type: String | Boolean, + default: 'auto' + }, + /** + * enable page URI mode + * + * e.g: + * /users/1 + * /users/2 + * /users/3?queryParam=test + * ... + */ + pageURI: { + type: Boolean, + default: false + } + }), + watch: { + 'localPagination.current' (val) { + this.pageURI && this.$router.push({ + ...this.$route, + name: this.$route.name, + params: Object.assign({}, this.$route.params, { + pageNo: val + }) + }) + }, + pageNum (val) { + Object.assign(this.localPagination, { + current: val + }) + }, + pageSize (val) { + Object.assign(this.localPagination, { + pageSize: val + }) + }, + showSizeChanger (val) { + Object.assign(this.localPagination, { + showSizeChanger: val + }) + }, + '$route.path': function (newPath, oldPath) { + if (oldPath.indexOf(newPath) === -1) { + this.refresh(true) + } + } + }, + created () { + const { pageNo } = this.$route.params + const localPageNum = this.pageURI && (pageNo && parseInt(pageNo)) || this.pageNum + this.localPagination = ['auto', true].includes(this.showPagination) && Object.assign({}, this.localPagination, { + current: localPageNum, + pageSize: this.pageSize, + showSizeChanger: this.showSizeChanger + }) || false + console.log('this.localPagination', this.localPagination) + this.needTotalList = this.initTotalList(this.columns) + this.loadData() + }, + methods: { + /** + * 表格重新加载方法 + * 如果参数为 true, 则强制刷新到第一页 + * @param Boolean bool + */ + refresh (bool = false) { + bool && (this.localPagination = Object.assign({}, { + current: 1, pageSize: this.pageSize + })) + this.loadData() + }, + /** + * 加载数据方法 + * @param {Object} pagination 分页选项器 + * @param {Object} filters 过滤条件 + * @param {Object} sorter 排序条件 + */ + loadData (pagination, filters, sorter) { + this.localLoading = true + const parameter = Object.assign({ + pageNo: (pagination && pagination.current) || + this.showPagination && this.localPagination.current || this.pageNum, + pageSize: (pagination && pagination.pageSize) || + this.showPagination && this.localPagination.pageSize || this.pageSize + }, + (sorter && sorter.field && { + sortField: sorter.field + }) || {}, + (sorter && sorter.order && { + sortOrder: sorter.order + }) || {}, { + ...filters + } + ) + const result = this.data(parameter) + // 对接自己的通用数据接口需要修改下方代码中的 r.pageNo, r.totalCount, r.data + // eslint-disable-next-line + if ((typeof result === 'object' || typeof result === 'function') && typeof result.then === 'function') { + result.then(r => { + this.localPagination = this.showPagination && Object.assign({}, this.localPagination, { + current: r.pageNo, // 返回结果中的当前分页数 + total: r.totalCount, // 返回结果中的总记录数 + showSizeChanger: this.showSizeChanger, + pageSize: (pagination && pagination.pageSize) || + this.localPagination.pageSize + }) || false + // 为防止删除数据后导致页面当前页面数据长度为 0 ,自动翻页到上一页 + if (r.data.length === 0 && this.showPagination && this.localPagination.current > 1) { + this.localPagination.current-- + this.loadData() + return + } + + // 这里用于判断接口是否有返回 r.totalCount 且 this.showPagination = true 且 pageNo 和 pageSize 存在 且 totalCount 小于等于 pageNo * pageSize 的大小 + // 当情况满足时,表示数据不满足分页大小,关闭 table 分页功能 + try { + if ((['auto', true].includes(this.showPagination) && r.totalCount <= (r.pageNo * this.localPagination.pageSize))) { + this.localPagination.hideOnSinglePage = false + } + } catch (e) { + this.localPagination = false + } + this.localDataSource = r.data // 返回结果中的数组数据 + this.localLoading = false + }) + } + }, + initTotalList (columns) { + const totalList = [] + columns && columns instanceof Array && columns.forEach(column => { + if (column.needTotal) { + totalList.push({ + ...column, + total: 0 + }) + } + }) + return totalList + }, + /** + * 用于更新已选中的列表数据 total 统计 + * @param selectedRowKeys + * @param selectedRows + */ + updateSelect (selectedRowKeys, selectedRows) { + this.selectedRows = selectedRows + this.selectedRowKeys = selectedRowKeys + const list = this.needTotalList + this.needTotalList = list.map(item => { + return { + ...item, + total: selectedRows.reduce((sum, val) => { + const total = sum + parseInt(get(val, item.dataIndex)) + return isNaN(total) ? 0 : total + }, 0) + } + }) + }, + /** + * 清空 table 已选中项 + */ + clearSelected () { + if (this.rowSelection) { + this.rowSelection.onChange([], []) + this.updateSelect([], []) + } + }, + /** + * 处理交给 table 使用者去处理 clear 事件时,内部选中统计同时调用 + * @param callback + * @returns {*} + */ + renderClear (callback) { + if (this.selectedRowKeys.length <= 0) return null + return ( +
{ + callback() + this.clearSelected() + }}>清空 + ) + }, + renderAlert () { + // 绘制统计列数据 + const needTotalItems = this.needTotalList.map((item) => { + return ( + {item.title}总计 {!item.customRender ? item.total : item.customRender(item.total)} + ) + }) + + // 绘制 清空 按钮 + const clearItem = (typeof this.alert.clear === 'boolean' && this.alert.clear) ? ( + this.renderClear(this.clearSelected) + ) : (this.alert !== null && typeof this.alert.clear === 'function') ? ( + this.renderClear(this.alert.clear) + ) : null + + // 绘制 alert 组件 + return ( + + + + ) + } + }, + + render () { + const props = {} + const localKeys = Object.keys(this.$data) + const showAlert = (typeof this.alert === 'object' && this.alert !== null && this.alert.show) && typeof this.rowSelection.selectedRowKeys !== 'undefined' || this.alert + + Object.keys(T.props).forEach(k => { + const localKey = `local${k.substring(0, 1).toUpperCase()}${k.substring(1)}` + if (localKeys.includes(localKey)) { + props[k] = this[localKey] + return props[k] + } + + if (k === 'rowSelection') { + if (showAlert && this.rowSelection) { + // 如果需要使用alert,则重新绑定 rowSelection 事件 + props[k] = { + ...this.rowSelection, + selectedRows: this.selectedRows, + selectedRowKeys: this.selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.updateSelect(selectedRowKeys, selectedRows) + typeof this[k].onChange !== 'undefined' && this[k].onChange(selectedRowKeys, selectedRows) + } + } + return props[k] + } else if (!this.rowSelection) { + // 如果没打算开启 rowSelection 则清空默认的选择项 + props[k] = null + return props[k] + } + } + this[k] && (props[k] = this[k]) + return props[k] + }) + + console.log('re-render table', new Date()) + const table = ( + + { Object.keys(this.$slots).map(name => ()) } + + ) + + return ( +
+ { showAlert ? this.renderAlert() : null } + { table } +
+ ) + } +} diff --git a/ui/src/components/TagSelect/TagSelectOption.jsx b/ui/src/components/TagSelect/TagSelectOption.jsx new file mode 100644 index 0000000..b5ae799 --- /dev/null +++ b/ui/src/components/TagSelect/TagSelectOption.jsx @@ -0,0 +1,45 @@ +import { Tag } from 'ant-design-vue' +const { CheckableTag } = Tag + +export default { + name: 'TagSelectOption', + props: { + prefixCls: { + type: String, + default: 'ant-pro-tag-select-option' + }, + value: { + type: [String, Number, Object], + default: '' + }, + checked: { + type: Boolean, + default: false + } + }, + data () { + return { + localChecked: this.checked || false + } + }, + watch: { + 'checked' (val) { + this.localChecked = val + }, + '$parent.items': { + handler: function (val) { + this.value && val.hasOwnProperty(this.value) && (this.localChecked = val[this.value]) + }, + deep: true + } + }, + render () { + const { $slots, value } = this + const onChange = (checked) => { + this.$emit('change', { value, checked }) + } + return ( + {$slots.default} + ) + } +} diff --git a/ui/src/components/TagSelect/index.jsx b/ui/src/components/TagSelect/index.jsx new file mode 100644 index 0000000..c12c94e --- /dev/null +++ b/ui/src/components/TagSelect/index.jsx @@ -0,0 +1,103 @@ +import PropTypes from 'ant-design-vue/es/_util/vue-types' +import Option from './TagSelectOption.jsx' +import { filterEmpty } from '@/components/_util/util' + +export default { + Option, + name: 'TagSelect', + model: { + prop: 'checked', + event: 'change' + }, + props: { + prefixCls: { + type: String, + default: 'ant-pro-tag-select' + }, + defaultValue: { + type: PropTypes.array, + default: null + }, + value: { + type: PropTypes.array, + default: null + }, + expandable: { + type: Boolean, + default: false + }, + hideCheckAll: { + type: Boolean, + default: false + } + }, + data () { + return { + expand: false, + localCheckAll: false, + items: this.getItemsKey(filterEmpty(this.$slots.default)), + val: this.value || this.defaultValue || [] + } + }, + methods: { + onChange (checked) { + const key = Object.keys(this.items).filter(key => key === checked.value) + this.items[key] = checked.checked + const bool = Object.values(this.items).lastIndexOf(false) + if (bool === -1) { + this.localCheckAll = true + } else { + this.localCheckAll = false + } + }, + onCheckAll (checked) { + Object.keys(this.items).forEach(v => { + this.items[v] = checked.checked + }) + this.localCheckAll = checked.checked + }, + getItemsKey (items) { + const totalItem = {} + items.forEach(item => { + totalItem[item.componentOptions.propsData && item.componentOptions.propsData.value] = false + }) + return totalItem + }, + // CheckAll Button + renderCheckAll () { + return !this.hideCheckAll && () || null + }, + // expandable + renderExpandable () { + + }, + // render option + renderTags (items) { + const listeners = { + change: (checked) => { + this.onChange(checked) + this.$emit('change', checked) + } + } + + return items.map(vnode => { + const options = vnode.componentOptions + options.listeners = listeners + return vnode + }) + } + }, + render () { + const { $props: { prefixCls } } = this + const classString = { + [`${prefixCls}`]: true + } + const tagItems = filterEmpty(this.$slots.default) + return ( +
+ {this.renderCheckAll()} + {this.renderTags(tagItems)} +
+ ) + } +} diff --git a/ui/src/components/Tree/Tree.jsx b/ui/src/components/Tree/Tree.jsx new file mode 100644 index 0000000..e5a2a11 --- /dev/null +++ b/ui/src/components/Tree/Tree.jsx @@ -0,0 +1,124 @@ +import { Menu, Icon, Input } from 'ant-design-vue' + +const { Item, ItemGroup, SubMenu } = Menu +const { Search } = Input + +export default { + name: 'Tree', + props: { + dataSource: { + type: Array, + required: true + }, + openKeys: { + type: Array, + default: () => [] + }, + search: { + type: Boolean, + default: false + } + }, + created () { + this.localOpenKeys = this.openKeys.slice(0) + }, + data () { + return { + localOpenKeys: [] + } + }, + methods: { + handlePlus (item) { + this.$emit('add', item) + }, + handleTitleClick (...args) { + this.$emit('titleClick', { args }) + }, + + renderSearch () { + return ( + + ) + }, + renderIcon (icon) { + return icon && () || null + }, + renderMenuItem (item) { + return ( + + { this.renderIcon(item.icon) } + { item.title } + this.handlePlus(item) } }}> + + ) + }, + renderItem (item) { + return item.children ? this.renderSubItem(item, item.key) : this.renderMenuItem(item, item.key) + }, + renderItemGroup (item) { + const childrenItems = item.children.map(o => { + return this.renderItem(o, o.key) + }) + + return ( + + + { childrenItems } + + ) + }, + renderSubItem (item, key) { + const childrenItems = item.children && item.children.map(o => { + return this.renderItem(o, o.key) + }) + + const title = ( + + { this.renderIcon(item.icon) } + { item.title } + + ) + + if (item.group) { + return this.renderItemGroup(item) + } + // titleClick={this.handleTitleClick(item)} + return ( + + { title } + { childrenItems } + + ) + } + }, + render () { + const { dataSource, search } = this.$props + + // this.localOpenKeys = openKeys.slice(0) + const list = dataSource.map(item => { + return this.renderItem(item) + }) + + return ( +
+ { search ? this.renderSearch() : null } + this.$emit('click', item), 'update:openKeys': val => { this.localOpenKeys = val } } }} openKeys={this.localOpenKeys}> + { list } + +
+ ) + } +} diff --git a/ui/src/components/Trend/Trend.vue b/ui/src/components/Trend/Trend.vue new file mode 100644 index 0000000..526e1cc --- /dev/null +++ b/ui/src/components/Trend/Trend.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/ui/src/components/Trend/index.js b/ui/src/components/Trend/index.js new file mode 100644 index 0000000..9f14228 --- /dev/null +++ b/ui/src/components/Trend/index.js @@ -0,0 +1,3 @@ +import Trend from './Trend.vue' + +export default Trend diff --git a/ui/src/components/Trend/index.less b/ui/src/components/Trend/index.less new file mode 100644 index 0000000..8a3d24c --- /dev/null +++ b/ui/src/components/Trend/index.less @@ -0,0 +1,42 @@ +@import "../index"; + +@trend-prefix-cls: ~"@{ant-pro-prefix}-trend"; + +.@{trend-prefix-cls} { + display: inline-block; + font-size: @font-size-base; + line-height: 22px; + + .up, + .down { + margin-left: 4px; + position: relative; + top: 1px; + + i { + font-size: 12px; + transform: scale(0.83); + } + } + + .item-text { + display: inline-block; + margin-left: 8px; + color: rgba(0,0,0,.85); + } + + .up { + color: @red-6; + } + .down { + color: @green-6; + top: -1px; + } + + &.reverse-color .up { + color: @green-6; + } + &.reverse-color .down { + color: @red-6; + } +} \ No newline at end of file diff --git a/ui/src/components/Trend/index.md b/ui/src/components/Trend/index.md new file mode 100644 index 0000000..8881f0e --- /dev/null +++ b/ui/src/components/Trend/index.md @@ -0,0 +1,45 @@ +# Trend 趋势标记 + +趋势符号,标记上升和下降趋势。通常用绿色代表“好”,红色代表“不好”,股票涨跌场景除外。 + + + +引用方式: + +```javascript +import Trend from '@/components/Trend' + +export default { + components: { + Trend + } +} +``` + + + +## 代码演示 [demo](https://pro.loacg.com/test/home) + +```html +5% +``` +或 +```html + + 工资 + 5% + +``` +或 +```html +5% +``` + + +## API + +| 参数 | 说明 | 类型 | 默认值 | +|----------|------------------------------------------|-------------|-------| +| flag | 上升下降标识:`up|down` | string | - | +| reverseColor | 颜色反转 | Boolean | false | + diff --git a/ui/src/components/_util/util.js b/ui/src/components/_util/util.js new file mode 100644 index 0000000..dd33231 --- /dev/null +++ b/ui/src/components/_util/util.js @@ -0,0 +1,46 @@ +/** + * components util + */ + +/** + * 清理空值,对象 + * @param children + * @returns {*[]} + */ +export function filterEmpty (children = []) { + return children.filter(c => c.tag || (c.text && c.text.trim() !== '')) +} + +/** + * 获取字符串长度,英文字符 长度1,中文字符长度2 + * @param {*} str + */ +export const getStrFullLength = (str = '') => + str.split('').reduce((pre, cur) => { + const charCode = cur.charCodeAt(0) + if (charCode >= 0 && charCode <= 128) { + return pre + 1 + } + return pre + 2 + }, 0) + +/** + * 截取字符串,根据 maxLength 截取后返回 + * @param {*} str + * @param {*} maxLength + */ +export const cutStrByFullLength = (str = '', maxLength) => { + let showLength = 0 + return str.split('').reduce((pre, cur) => { + const charCode = cur.charCodeAt(0) + if (charCode >= 0 && charCode <= 128) { + showLength += 1 + } else { + showLength += 2 + } + if (showLength <= maxLength) { + return pre + cur + } + return pre + }, '') +} diff --git a/ui/src/components/global.less b/ui/src/components/global.less new file mode 100644 index 0000000..fb1124d --- /dev/null +++ b/ui/src/components/global.less @@ -0,0 +1,490 @@ +@import './index.less'; + +body { + + &.colorWeak { + filter: invert(80%); + } + &.userLayout { + overflow: auto; + } +} + +.layout.ant-layout { + height: auto; + overflow-x: hidden; + + &.mobile, + &.tablet { + .ant-layout-content { + .content { + margin: 24px 0 0; + } + } + + /** + * ant-table-wrapper + * 覆盖的表格手机模式样式,如果想修改在手机上表格最低宽度,可以在这里改动 + */ + .ant-table-wrapper { + .ant-table-content { + overflow-y: auto; + } + .ant-table-body { + min-width: 800px; + } + } + .topmenu { + /* 必须为 topmenu 才能启用流式布局 */ + &.content-width-Fluid { + .header-index-wide { + margin-left: 0; + } + } + } + } + + &.mobile { + .sidemenu { + .ant-header-fixedHeader { + &.ant-header-side-opened, + &.ant-header-side-closed { + width: 100%; + } + } + } + } + + &.ant-layout-has-sider { + flex-direction: row; + } + + .trigger { + font-size: 20px; + line-height: 64px; + padding: 0 24px; + cursor: pointer; + transition: color 0.3s; + &:hover { + background: rgba(0, 0, 0, 0.025); + } + } + + .topmenu { + .ant-header-fixedHeader { + position: fixed; + top: 0; + right: 0; + z-index: 9; + width: 100%; + transition: width 0.2s; + + &.ant-header-side-opened { + width: 100%; + } + + &.ant-header-side-closed { + width: 100%; + } + } + /* 必须为 topmenu 才能启用流式布局 */ + &.content-width-Fluid { + .header-index-wide { + max-width: unset; + margin-left: 24px; + } + + .page-header-index-wide { + max-width: unset; + } + } + } + + .sidemenu { + .ant-header-fixedHeader { + position: fixed; + top: 0; + right: 0; + z-index: 9; + width: 100%; + transition: width 0.2s; + + &.ant-header-side-opened { + width: calc(100% - 256px); + } + + &.ant-header-side-closed { + width: calc(100% - 80px); + } + } + } + + .header { + height: 64px; + padding: 0 12px 0 0; + background: #fff; + box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); + position: relative; + } + + .header, + .top-nav-header-index { + .user-wrapper { + float: right; + height: 100%; + + .action { + cursor: pointer; + padding: 0 12px; + display: inline-block; + transition: all 0.3s; + height: 100%; + color: rgba(0, 0, 0, 0.65); + + &:hover { + background: rgba(0, 0, 0, 0.025); + } + + .avatar { + margin: 20px 8px 20px 0; + color: #1890ff; + background: hsla(0, 0%, 100%, 0.85); + vertical-align: middle; + } + + .icon { + font-size: 16px; + padding: 4px; + } + } + } + + &.dark { + .user-wrapper { + .action { + color: rgba(255, 255, 255, 0.85); + a { + color: rgba(255, 255, 255, 0.85); + } + + &:hover { + background: rgba(255, 255, 255, 0.16); + } + } + } + } + } + + &.mobile, + &.tablet { + .top-nav-header-index { + .header-index-wide { + .header-index-left { + .trigger { + color: rgba(255, 255, 255, 0.85); + padding: 0 12px; + } + + .logo.top-nav-header { + flex: 0 0 56px; + text-align: center; + line-height: 58px; + h1 { + display: none; + } + } + } + } + + &.light { + .header-index-wide { + .header-index-left { + .trigger { + color: rgba(0, 0, 0, 0.65); + } + } + } + // + } + } + } + + &.tablet { + // overflow: hidden; text-overflow:ellipsis; white-space: nowrap; + .top-nav-header-index { + .header-index-wide { + .header-index-left { + .logo > a { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + .ant-menu.ant-menu-horizontal { + flex: 0 1 auto; + white-space: normal; + } + } + } + } + + .top-nav-header-index { + box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); + position: relative; + transition: background 0.3s, width 0.2s; + + .header-index-wide { + max-width: 1200px; + margin: auto; + padding-left: 0; + display: flex; + height: 64px; + + .ant-menu.ant-menu-horizontal { + max-width: 835px; + flex: 0 1 835px; + border: none; + height: 64px; + line-height: 64px; + } + + .header-index-left { + flex: 0 1 1000px; + display: flex; + + .logo.top-nav-header { + flex: 0 0 165px; + width: 165px; + height: 64px; + position: relative; + line-height: 64px; + transition: all 0.3s; + overflow: hidden; + + img, + svg { + display: inline-block; + vertical-align: middle; + height: 32px; + width: 32px; + } + + h1 { + color: #fff; + display: inline-block; + vertical-align: top; + font-size: 16px; + margin: 0 0 0 12px; + font-weight: 400; + } + } + } + + .header-index-right { + flex: 1 0 auto; + height: 64px; + overflow: hidden; + + .content-box { + float: right; + } + } + } + + &.light { + background-color: #fff; + + .header-index-wide { + .header-index-left { + .logo { + h1 { + color: #002140; + } + } + } + } + } + } + + // 内容区 + .layout-content { + margin: 24px 24px 0px; + height: 100%; + height: 64px; + padding: 0 12px 0 0; + } + + // footer + .ant-layout-footer { + padding: 0; + } +} + +.topmenu { + .page-header-index-wide { + max-width: 1200px; + margin: 0 auto; + } +} + +// drawer-sider 自定义 +.ant-drawer.drawer-sider { + .sider { + box-shadow: none; + } + + &.dark { + .ant-drawer-content { + background-color: rgb(0, 21, 41); + } + } + &.light { + box-shadow: none; + .ant-drawer-content { + background-color: #fff; + } + } + + .ant-drawer-body { + padding: 0; + } +} + +// 菜单样式 +.sider { + box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); + position: relative; + z-index: 10; + min-height: 100vh; + + .ant-layout-sider-children { + overflow-y: hidden; + + &:hover { + overflow-y: auto; + } + } + + &.ant-fixed-sidemenu { + position: fixed; + height: 100%; + } + + .logo { + position: relative; + height: 64px; + padding-left: 24px; + overflow: hidden; + line-height: 64px; + background: #002140; + transition: all .3s; + + img, + svg, + h1 { + display: inline-block; + vertical-align: middle; + } + + img, + svg { + height: 32px; + width: 32px; + } + + h1 { + color: #fff; + font-size: 20px; + margin: 0 0 0 12px; + font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif; + font-weight: 600; + vertical-align: middle; + } + } + + &.light { + background-color: #fff; + box-shadow: 2px 0px 8px 0px rgba(29, 35, 41, 0.05); + + .logo { + background: #fff; + box-shadow: 1px 1px 0px 0px #e8e8e8; + + h1 { + color: unset; + } + } + + .ant-menu-light { + border-right-color: transparent; + } + } +} + +// 外置的样式控制 +.user-dropdown-menu { + span { + user-select: none; + } +} +.user-dropdown-menu-wrapper.ant-dropdown-menu { + padding: 4px 0; + + .ant-dropdown-menu-item { + width: 160px; + } + + .ant-dropdown-menu-item > .anticon:first-child, + .ant-dropdown-menu-item > a > .anticon:first-child, + .ant-dropdown-menu-submenu-title > .anticon:first-child .ant-dropdown-menu-submenu-title > a > .anticon:first-child { + min-width: 12px; + margin-right: 8px; + } +} + +// 数据列表 样式 +.table-alert { + margin-bottom: 16px; +} + +.table-page-search-wrapper { + .ant-form-inline { + .ant-form-item { + display: flex; + margin-bottom: 24px; + margin-right: 0; + + .ant-form-item-control-wrapper { + flex: 1 1; + display: inline-block; + vertical-align: middle; + } + + > .ant-form-item-label { + line-height: 32px; + padding-right: 8px; + width: auto; + } + .ant-form-item-control { + height: 32px; + line-height: 32px; + } + } + } + + .table-page-search-submitButtons { + display: block; + margin-bottom: 24px; + white-space: nowrap; + } +} + +.content { + .table-operator { + margin-bottom: 18px; + + button { + margin-right: 8px; + } + } +} diff --git a/ui/src/components/index.js b/ui/src/components/index.js new file mode 100644 index 0000000..6004742 --- /dev/null +++ b/ui/src/components/index.js @@ -0,0 +1,62 @@ +// chart +import Bar from '@/components/Charts/Bar' +import ChartCard from '@/components/Charts/ChartCard' +import Liquid from '@/components/Charts/Liquid' +import MiniArea from '@/components/Charts/MiniArea' +import MiniSmoothArea from '@/components/Charts/MiniSmoothArea' +import MiniBar from '@/components/Charts/MiniBar' +import MiniProgress from '@/components/Charts/MiniProgress' +import Radar from '@/components/Charts/Radar' +import RankList from '@/components/Charts/RankList' +import TransferBar from '@/components/Charts/TransferBar' +import TagCloud from '@/components/Charts/TagCloud' + +// pro components +import AvatarList from '@/components/AvatarList' +import CountDown from '@/components/CountDown' +import Ellipsis from '@/components/Ellipsis' +import FooterToolbar from '@/components/FooterToolbar' +import NumberInfo from '@/components/NumberInfo' +import DescriptionList from '@/components/DescriptionList' +import Tree from '@/components/Tree/Tree' +import Trend from '@/components/Trend' +import STable from '@/components/Table' +import MultiTab from '@/components/MultiTab' +import Result from '@/components/Result' +import IconSelector from '@/components/IconSelector' +import TagSelect from '@/components/TagSelect' +import ExceptionPage from '@/components/Exception' +import StandardFormRow from '@/components/StandardFormRow' +import ArticleListContent from '@/components/ArticleListContent' + +export { + AvatarList, + Bar, + ChartCard, + Liquid, + MiniArea, + MiniSmoothArea, + MiniBar, + MiniProgress, + Radar, + TagCloud, + RankList, + TransferBar, + Trend, + CountDown, + Ellipsis, + FooterToolbar, + NumberInfo, + DescriptionList, + // 兼容写法,请勿继续使用 + DescriptionList as DetailList, + Tree, + STable, + MultiTab, + Result, + ExceptionPage, + IconSelector, + TagSelect, + StandardFormRow, + ArticleListContent +} diff --git a/ui/src/components/index.less b/ui/src/components/index.less new file mode 100644 index 0000000..2d8d57e --- /dev/null +++ b/ui/src/components/index.less @@ -0,0 +1,5 @@ +@import "~ant-design-vue/lib/style/index"; + +// The prefix to use on all css classes from ant-pro. +@ant-pro-prefix : ant-pro; +@ant-global-header-zindex : 105; \ No newline at end of file diff --git a/ui/src/components/tools/Breadcrumb.vue b/ui/src/components/tools/Breadcrumb.vue new file mode 100644 index 0000000..9bc141c --- /dev/null +++ b/ui/src/components/tools/Breadcrumb.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/ui/src/components/tools/DetailList.vue b/ui/src/components/tools/DetailList.vue new file mode 100644 index 0000000..6745a08 --- /dev/null +++ b/ui/src/components/tools/DetailList.vue @@ -0,0 +1,5 @@ + diff --git a/ui/src/components/tools/HeadInfo.vue b/ui/src/components/tools/HeadInfo.vue new file mode 100644 index 0000000..7fbc692 --- /dev/null +++ b/ui/src/components/tools/HeadInfo.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/ui/src/components/tools/Logo.vue b/ui/src/components/tools/Logo.vue new file mode 100644 index 0000000..748aa13 --- /dev/null +++ b/ui/src/components/tools/Logo.vue @@ -0,0 +1,30 @@ + + + diff --git a/ui/src/components/tools/TopMenu.vue b/ui/src/components/tools/TopMenu.vue new file mode 100644 index 0000000..f59307a --- /dev/null +++ b/ui/src/components/tools/TopMenu.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/ui/src/components/tools/TwoStepCaptcha.vue b/ui/src/components/tools/TwoStepCaptcha.vue new file mode 100644 index 0000000..01302b4 --- /dev/null +++ b/ui/src/components/tools/TwoStepCaptcha.vue @@ -0,0 +1,89 @@ + + + + diff --git a/ui/src/components/tools/UserMenu.vue b/ui/src/components/tools/UserMenu.vue new file mode 100644 index 0000000..f78a26b --- /dev/null +++ b/ui/src/components/tools/UserMenu.vue @@ -0,0 +1,72 @@ + + + diff --git a/ui/src/components/tools/index.js b/ui/src/components/tools/index.js new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/config/defaultSettings.js b/ui/src/config/defaultSettings.js new file mode 100644 index 0000000..e617518 --- /dev/null +++ b/ui/src/config/defaultSettings.js @@ -0,0 +1,34 @@ +/** + * 项目默认配置项 + * primaryColor - 默认主题色, 如果修改颜色不生效,请清理 localStorage + * navTheme - sidebar theme ['dark', 'light'] 两种主题 + * colorWeak - 色盲模式 + * layout - 整体布局方式 ['sidemenu', 'topmenu'] 两种布局 + * fixedHeader - 固定 Header : boolean + * fixSiderbar - 固定左侧菜单栏 : boolean + * autoHideHeader - 向下滚动时,隐藏 Header : boolean + * contentWidth - 内容区布局: 流式 | 固定 + * + * storageOptions: {} - Vue-ls 插件配置项 (localStorage/sessionStorage) + * + */ + +export default { + useSSO: false, + primaryColor: '#1890ff', // primary color of ant design + navTheme: 'dark', // theme for nav menu + layout: 'sidemenu', // nav menu position: sidemenu or topmenu + contentWidth: 'Fixed', // layout of content: Fluid or Fixed, only works when layout is topmenu + fixedHeader: true, // sticky header + fixSiderbar: true, // sticky siderbar + autoHideHeader: true, // auto hide header + colorWeak: false, + multiTab: false, + production: process.env.NODE_ENV === 'production' && process.env.VUE_APP_PREVIEW !== 'true', + // vue-ls options + storageOptions: { + namespace: 'pro__', // key prefix + name: 'ls', // name variable Vue.[ls] or this.[$ls], + storage: 'local' // storage name session, local, memory + } +} diff --git a/ui/src/config/router.config.js b/ui/src/config/router.config.js new file mode 100644 index 0000000..a9f1ddd --- /dev/null +++ b/ui/src/config/router.config.js @@ -0,0 +1,152 @@ +// eslint-disable-next-line +import store from '@/store' + +import { UserLayout, BasicLayout, RouteView, PageView } from '@/layouts' +import { getPreference } from '@/api/cmdb/preference' + +const cmdbRouter = [ + // preference + { + path: '/preference', + component: () => import('@/views/cmdb/preference'), + name: 'cmdb_preference', + meta: { title: '我的订阅', icon: 'book', keepAlive: true } + }, + // views + { + path: '/tree_views', + component: () => import('@/views/cmdb/tree_views'), + name: 'cmdb_tree_views', + meta: { title: '树形视图', icon: 'share-alt', keepAlive: true }, + hideChildrenInMenu: true, + children: [ + { + path: '/tree_views/:typeId', + name: 'cmdb_tree_views_item', + component: () => import('@/views/cmdb/tree_views'), + meta: { title: '树形视图', keepAlive: true }, + hidden: true + }] + }, + // batch + { + path: '/batch', + component: () => import('@/views/cmdb/batch'), + name: 'cmdb_batch', + meta: { 'title': '批量导入', icon: 'upload', keepAlive: true } + }, + { + path: '/ci_types', + name: 'cmdb_ci_type', + component: RouteView, + redirect: '/ci_type', + meta: { title: '模型配置', icon: 'setting', permission: ['admin'] }, + children: [ + { + path: '/ci_types', + name: 'ci_type', + hideChildrenInMenu: true, // 强制显示 MenuItem 而不是 SubMenu + component: () => import('@/views/cmdb/ci_type/list'), + meta: { title: '模型定义', keepAlive: true } + }, + { + path: '/ci_types/:CITypeName/detail/:CITypeId', + name: 'ci_type_detail', + hideChildrenInMenu: true, // 强制显示 MenuItem 而不是 SubMenu + component: () => import('@/views/cmdb/ci_type/detail'), + meta: { title: '模型配置', keepAlive: true, hidden: true }, + hidden: true + }, + { + path: '/attributes', + name: 'attributes', + hideChildrenInMenu: true, // 强制显示 MenuItem 而不是 SubMenu + component: () => import('@/views/cmdb/attributes/index'), + meta: { title: '属性库', keepAlive: true } + } + ] + } +] + +function copyArray(arr) { + return arr.map((e) => { + if (typeof e === 'object') { + return Object.assign({}, e) + } else { + return e + } + }) +} + +export const generatorDynamicRouter = () => { + return new Promise((resolve, reject) => { + // cmdb 订阅的模型 + getPreference().then(res => { + const routers = copyArray(asyncRouterMap) + routers[0].children = copyArray(cmdbRouter) + for (let i = 0; i < res.length; i++) { + const item = res[i] + routers[0].children.unshift({ + path: `/instances/types/${item.id}`, + component: () => import(`@/views/cmdb/ci/index`), + name: `cmdb_${item.id}`, + meta: { title: item.alias, icon: 'table', keepAlive: true, typeId: item.id }, + hideChildrenInMenu: true // 强制显示 MenuItem 而不是 SubMenu + }) + } + + resolve(routers) + }) + }) +} + +const asyncRouterMap = [ + { + path: '/', + name: 'cmdb', + component: BasicLayout, + meta: { title: 'CMDB', keepAlive: true }, + redirect: () => { + return store.getters.addRouters[0].children.find(item => !item.hidden) + } + }, + { + path: '*', redirect: '/404', hidden: true + } +] + +/** + * 基础路由 + * @type { *[] } + */ +export const constantRouterMap = [ + { + path: '/user', + component: UserLayout, + redirect: '/user/login', + hidden: true, + children: [ + { + path: 'login', + name: 'login', + component: () => import(/* webpackChunkName: "user" */ '@/views/user/Login') + }, + { + path: 'register', + name: 'register', + component: () => import(/* webpackChunkName: "user" */ '@/views/user/Register') + }, + { + path: 'register-result', + name: 'registerResult', + component: () => import(/* webpackChunkName: "user" */ '@/views/user/RegisterResult') + } + ] + }, + + { + path: '/404', + component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404') + } + +] diff --git a/ui/src/core/bootstrap.js b/ui/src/core/bootstrap.js new file mode 100644 index 0000000..155a9cc --- /dev/null +++ b/ui/src/core/bootstrap.js @@ -0,0 +1,34 @@ +import Vue from 'vue' +import store from '@/store/' +import { + ACCESS_TOKEN, + DEFAULT_COLOR, + DEFAULT_THEME, + DEFAULT_LAYOUT_MODE, + DEFAULT_COLOR_WEAK, + SIDEBAR_TYPE, + DEFAULT_FIXED_HEADER, + DEFAULT_FIXED_HEADER_HIDDEN, + DEFAULT_FIXED_SIDEMENU, + DEFAULT_CONTENT_WIDTH_TYPE, + DEFAULT_MULTI_TAB +} from '@/store/mutation-types' +import config from '@/config/defaultSettings' + +export default function Initializer () { + console.log(`API_URL: ${process.env.VUE_APP_API_BASE_URL}`) + + store.commit('SET_SIDEBAR_TYPE', Vue.ls.get(SIDEBAR_TYPE, true)) + store.commit('TOGGLE_THEME', Vue.ls.get(DEFAULT_THEME, config.navTheme)) + store.commit('TOGGLE_LAYOUT_MODE', Vue.ls.get(DEFAULT_LAYOUT_MODE, config.layout)) + store.commit('TOGGLE_FIXED_HEADER', Vue.ls.get(DEFAULT_FIXED_HEADER, config.fixedHeader)) + store.commit('TOGGLE_FIXED_SIDERBAR', Vue.ls.get(DEFAULT_FIXED_SIDEMENU, config.fixSiderbar)) + store.commit('TOGGLE_CONTENT_WIDTH', Vue.ls.get(DEFAULT_CONTENT_WIDTH_TYPE, config.contentWidth)) + store.commit('TOGGLE_FIXED_HEADER_HIDDEN', Vue.ls.get(DEFAULT_FIXED_HEADER_HIDDEN, config.autoHideHeader)) + store.commit('TOGGLE_WEAK', Vue.ls.get(DEFAULT_COLOR_WEAK, config.colorWeak)) + store.commit('TOGGLE_COLOR', Vue.ls.get(DEFAULT_COLOR, config.primaryColor)) + store.commit('TOGGLE_MULTI_TAB', Vue.ls.get(DEFAULT_MULTI_TAB, config.multiTab)) + store.commit('SET_TOKEN', Vue.ls.get(ACCESS_TOKEN)) + + // last step +} diff --git a/ui/src/core/directives/action.js b/ui/src/core/directives/action.js new file mode 100644 index 0000000..bdc9ec0 --- /dev/null +++ b/ui/src/core/directives/action.js @@ -0,0 +1,34 @@ +import Vue from 'vue' +import store from '@/store' + +/** + * Action 权限指令 + * 指令用法: + * - 在需要控制 action 级别权限的组件上使用 v-action:[method] , 如下: + * 添加用户 + * 删除用户 + * 修改 + * + * - 当前用户没有权限时,组件上使用了该指令则会被隐藏 + * - 当后台权限跟 pro 提供的模式不同时,只需要针对这里的权限过滤进行修改即可 + * + * @see https://github.com/sendya/ant-design-pro-vue/pull/53 + */ +const action = Vue.directive('action', { + inserted: function (el, binding, vnode) { + const actionName = binding.arg + const roles = store.getters.roles + const elVal = vnode.context.$route.meta.permission + const permissionId = elVal instanceof String && [elVal] || elVal + roles.permissions.forEach(p => { + if (!permissionId.includes(p.permissionId)) { + return + } + if (p.actionList && !p.actionList.includes(actionName)) { + el.parentNode && el.parentNode.removeChild(el) || (el.style.display = 'none') + } + }) + } +}) + +export default action diff --git a/ui/src/core/icons.js b/ui/src/core/icons.js new file mode 100644 index 0000000..46b7261 --- /dev/null +++ b/ui/src/core/icons.js @@ -0,0 +1,11 @@ +/** + * Custom icon list + * All icons are loaded here for easy management + * @see https://vue.ant.design/components/icon/#Custom-Font-Icon + * + * 自定义图标加载表 + * 所有图标均从这里加载,方便管理 + */ +import bxAnaalyse from '@/assets/icons/bx-analyse.svg?inline' // path to your '*.svg?inline' file. + +export { bxAnaalyse } diff --git a/ui/src/core/lazy_lib/components_use.js b/ui/src/core/lazy_lib/components_use.js new file mode 100644 index 0000000..c7c28c3 --- /dev/null +++ b/ui/src/core/lazy_lib/components_use.js @@ -0,0 +1,99 @@ + +/* eslint-disable */ +/** + * 该文件是为了按需加载,剔除掉了一些不需要的框架组件。 + * 减少了编译支持库包大小 + * + * 当需要更多组件依赖时,在该文件加入即可 + */ +import Vue from 'vue' +import { + LocaleProvider, + Layout, + Input, + InputNumber, + Button, + Switch, + Radio, + Checkbox, + Select, + Card, + Form, + Row, + Col, + Modal, + Table, + Tabs, + Icon, + Badge, + Popover, + Dropdown, + List, + Avatar, + Breadcrumb, + Steps, + Spin, + Menu, + Drawer, + Tooltip, + Alert, + Tag, + Divider, + DatePicker, + TimePicker, + Upload, + Progress, + Skeleton, + Popconfirm, + message, + notification +} from 'ant-design-vue' +// import VueCropper from 'vue-cropper' + +Vue.use(LocaleProvider) +Vue.use(Layout) +Vue.use(Input) +Vue.use(InputNumber) +Vue.use(Button) +Vue.use(Switch) +Vue.use(Radio) +Vue.use(Checkbox) +Vue.use(Select) +Vue.use(Card) +Vue.use(Form) +Vue.use(Row) +Vue.use(Col) +Vue.use(Modal) +Vue.use(Table) +Vue.use(Tabs) +Vue.use(Icon) +Vue.use(Badge) +Vue.use(Popover) +Vue.use(Dropdown) +Vue.use(List) +Vue.use(Avatar) +Vue.use(Breadcrumb) +Vue.use(Steps) +Vue.use(Spin) +Vue.use(Menu) +Vue.use(Drawer) +Vue.use(Tooltip) +Vue.use(Alert) +Vue.use(Tag) +Vue.use(Divider) +Vue.use(DatePicker) +Vue.use(TimePicker) +Vue.use(Upload) +Vue.use(Progress) +Vue.use(Skeleton) +Vue.use(Popconfirm) +// Vue.use(VueCropper) +Vue.use(notification) + +Vue.prototype.$confirm = Modal.confirm +Vue.prototype.$message = message +Vue.prototype.$notification = notification +Vue.prototype.$info = Modal.info +Vue.prototype.$success = Modal.success +Vue.prototype.$error = Modal.error +Vue.prototype.$warning = Modal.warning \ No newline at end of file diff --git a/ui/src/core/lazy_use.js b/ui/src/core/lazy_use.js new file mode 100644 index 0000000..24d50dc --- /dev/null +++ b/ui/src/core/lazy_use.js @@ -0,0 +1,20 @@ +import Vue from 'vue' +import VueStorage from 'vue-ls' +import config from '@/config/defaultSettings' + +// base library +import '@/core/lazy_lib/components_use' +import Viser from 'viser-vue' + +// ext library +import VueClipboard from 'vue-clipboard2' +import PermissionHelper from '@/utils/helper/permission' +import './directives/action' + +VueClipboard.config.autoSetContainer = true + +Vue.use(Viser) + +Vue.use(VueStorage, config.storageOptions) +Vue.use(VueClipboard) +Vue.use(PermissionHelper) diff --git a/ui/src/core/use.js b/ui/src/core/use.js new file mode 100644 index 0000000..9f051c7 --- /dev/null +++ b/ui/src/core/use.js @@ -0,0 +1,25 @@ +import Vue from 'vue' +import VueStorage from 'vue-ls' +import config from '@/config/defaultSettings' + +// base library +import Antd from 'ant-design-vue' +import Viser from 'viser-vue' +import VueCropper from 'vue-cropper' +import 'ant-design-vue/dist/antd.less' + +// ext library +import VueClipboard from 'vue-clipboard2' +import PermissionHelper from '@/utils/helper/permission' +// import '@/components/use' +import './directives/action' + +VueClipboard.config.autoSetContainer = true + +Vue.use(Antd) +Vue.use(Viser) + +Vue.use(VueStorage, config.storageOptions) +Vue.use(VueClipboard) +Vue.use(PermissionHelper) +Vue.use(VueCropper) diff --git a/ui/src/layouts/BasicLayout.vue b/ui/src/layouts/BasicLayout.vue new file mode 100644 index 0000000..355ecea --- /dev/null +++ b/ui/src/layouts/BasicLayout.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/ui/src/layouts/BlankLayout.vue b/ui/src/layouts/BlankLayout.vue new file mode 100644 index 0000000..1bfbfbf --- /dev/null +++ b/ui/src/layouts/BlankLayout.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/ui/src/layouts/PageView.vue b/ui/src/layouts/PageView.vue new file mode 100644 index 0000000..4857405 --- /dev/null +++ b/ui/src/layouts/PageView.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/ui/src/layouts/RouteView.vue b/ui/src/layouts/RouteView.vue new file mode 100644 index 0000000..58fa742 --- /dev/null +++ b/ui/src/layouts/RouteView.vue @@ -0,0 +1,32 @@ + diff --git a/ui/src/layouts/UserLayout.vue b/ui/src/layouts/UserLayout.vue new file mode 100644 index 0000000..66dc239 --- /dev/null +++ b/ui/src/layouts/UserLayout.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/ui/src/layouts/index.js b/ui/src/layouts/index.js new file mode 100644 index 0000000..1d62d6c --- /dev/null +++ b/ui/src/layouts/index.js @@ -0,0 +1,7 @@ +import UserLayout from './UserLayout' +import BlankLayout from './BlankLayout' +import BasicLayout from './BasicLayout' +import RouteView from './RouteView' +import PageView from './PageView' + +export { UserLayout, BasicLayout, BlankLayout, RouteView, PageView } diff --git a/ui/src/main.js b/ui/src/main.js new file mode 100644 index 0000000..bc8debb --- /dev/null +++ b/ui/src/main.js @@ -0,0 +1,27 @@ +// ie polyfill +import '@babel/polyfill' + +import Vue from 'vue' +import EventBus from './EventBus' +import App from './App.vue' +import router from './router' +import store from './store/' +import { VueAxios } from './utils/request' + +import bootstrap from './core/bootstrap' +import './core/use' +import './permission' // permission control +import './utils/filter' // global filter +Vue.config.productionTip = false + +Vue.prototype.$bus = EventBus + +// mount axios Vue.$http and this.$http +Vue.use(VueAxios) + +new Vue({ + router, + store, + created: bootstrap, + render: h => h(App) +}).$mount('#app') diff --git a/ui/src/permission.js b/ui/src/permission.js new file mode 100644 index 0000000..8f11232 --- /dev/null +++ b/ui/src/permission.js @@ -0,0 +1,62 @@ +import Vue from 'vue' +import router from './router' +import store from './store' + +import NProgress from 'nprogress' // progress bar +import 'nprogress/nprogress.css' // progress bar style +import notification from 'ant-design-vue/es/notification' +import { setDocumentTitle, domTitle } from '@/utils/domUtil' +import config from '@/config/defaultSettings' +import { ACCESS_TOKEN } from './store/mutation-types'; + +NProgress.configure({ showSpinner: false }) // NProgress Configuration + +router.beforeEach((to, from, next) => { + NProgress.start() // start progress bar + to.meta && (typeof to.meta.title !== 'undefined' && setDocumentTitle(`${to.meta.title} - ${domTitle}`)) + if ((config.useSSO || (!config.useSSO && Vue.ls.get(ACCESS_TOKEN))) && store.getters.roles.length === 0) { + store + .dispatch('GetInfo') + .then(res => { + const roles = res.result && res.result.role + store.dispatch('GenerateRoutes', { roles }).then(() => { + // 根据roles权限生成可访问的路由表 + // 动态添加可访问路由表 + router.addRoutes(store.getters.addRouters) + + const redirect = decodeURIComponent(from.query.redirect || to.path) + if (to.path === redirect) { + // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record + next({ ...to, replace: true }) + } else { + // 跳转到目的路由 + next({ path: redirect }) + } + }) + }) + .catch((e) => { + console.log(e) + notification.error({ + message: '错误', + description: '请求用户信息失败,请重试' + }) + setTimeout(() => { + store.dispatch('Logout') + }, 3000) + }) + + } else if (to.path === '/user/login' && !config.useSSO && store.getters.roles.length !== 0) { + next({ path: '/' }) + NProgress.done() + } else if (!config.useSSO && !Vue.ls.get(ACCESS_TOKEN) && to.path !== "/user/login") { + next({ path: '/user/login', query: { redirect: to.fullPath } }) + NProgress.done() + } + else { + next() + } +}) + +router.afterEach(() => { + NProgress.done() // finish progress bar +}) diff --git a/ui/src/router/README.md b/ui/src/router/README.md new file mode 100644 index 0000000..6618270 --- /dev/null +++ b/ui/src/router/README.md @@ -0,0 +1,145 @@ +路由/菜单说明 +==== + + + +配置文件路径 +---- + +`@/config/router.config.js` + + + +格式和说明 +---- + +```javascript +/** + * 路由配置说明: + * 建议:sider menu 请不要超过三级菜单,若超过三级菜单,则应该设计为顶部主菜单 配合左侧次级菜单 + * + **/ + { + redirect: noredirect, + name: 'router-name', + hidden: true, + meta: { + title: 'title', + icon: 'a-icon', + keepAlive: true, + hiddenHeaderContent: true, + } +} +``` + + + +`{ Route }` 对象 + +| 参数 | 说明 | 类型 | 默认值 | +| -------- | ----------------------------------------- | ------- | ------ | +| hidden | 控制路由是否显示在 sidebar | boolean | false | +| redirect | 重定向地址, 访问这个路由时,自定进行重定向 | string | - | +| name | 路由名称, 必须设置,且不能重名 | string | - | +| meta | 路由元信息(路由附带扩展信息) | object | {} | +| hideChildrenInMenu | 强制菜单显示为Item而不是SubItem(配合 meta.hidden) | boolean | - | + + +`{ Meta }` 路由元信息对象 + +| 参数 | 说明 | 类型 | 默认值 | +| ------------------- | ------------------------------------------------------------ | ------- | ------ | +| title | 路由标题, 用于显示面包屑, 页面标题 *推荐设置 | string | - | +| icon | 路由在 menu 上显示的图标 | [string,svg] | - | +| keepAlive | 缓存该路由 | boolean | false | +| hidden | 配合`hideChildrenInMenu`使用,用于隐藏菜单时,提供递归到父菜单显示 选中菜单项_(可参考 个人页 配置方式)_ | boolean | false | +| hiddenHeaderContent | *特殊 隐藏 [PageHeader](https://github.com/sendya/ant-design-pro-vue/blob/master/src/components/layout/PageHeader.vue#L14) 组件中的页面带的 面包屑和页面标题栏 | boolean | false | +| permission | 与项目提供的权限拦截匹配的权限,如果不匹配,则会被禁止访问该路由页面 | array | [] | + +> 路由自定义 `Icon` 请引入自定义 `svg` Icon 文件,然后传递给路由的 `meta.icon` 参数即可 + +路由例子 +---- + +```ecmascript 6 +const asyncRouterMap = [ + { + path: '/', + name: 'index', + component: BasicLayout, + meta: { title: '首页' }, + redirect: '/dashboard/analysis', + children: [ + { + path: '/dashboard', + component: RouteView, + name: 'dashboard', + redirect: '/dashboard/workplace', + meta: {title: '仪表盘', icon: 'dashboard', permission: ['dashboard']}, + children: [ + { + path: '/dashboard/analysis', + name: 'Analysis', + component: () => import('@/views/dashboard/Analysis'), + meta: {title: '分析页', permission: ['dashboard']} + }, + { + path: '/dashboard/monitor', + name: 'Monitor', + hidden: true, + component: () => import('@/views/dashboard/Monitor'), + meta: {title: '监控页', permission: ['dashboard']} + }, + { + path: '/dashboard/workplace', + name: 'Workplace', + component: () => import('@/views/dashboard/Workplace'), + meta: {title: '工作台', permission: ['dashboard']} + } + ] + }, + + // result + { + path: '/result', + name: 'result', + component: PageView, + redirect: '/result/success', + meta: { title: '结果页', icon: 'check-circle-o', permission: [ 'result' ] }, + children: [ + { + path: '/result/success', + name: 'ResultSuccess', + component: () => import(/* webpackChunkName: "result" */ '@/views/result/Success'), + // 该页面隐藏面包屑和页面标题栏 + meta: { title: '成功', hiddenHeaderContent: true, permission: [ 'result' ] } + }, + { + path: '/result/fail', + name: 'ResultFail', + component: () => import(/* webpackChunkName: "result" */ '@/views/result/Error'), + // 该页面隐藏面包屑和页面标题栏 + meta: { title: '失败', hiddenHeaderContent: true, permission: [ 'result' ] } + } + ] + }, + ... + ] + }, +] +``` + +> 1. 请注意 `component: () => import('..') ` 方式引入路由的页面组件为 懒加载模式。具体可以看 [Vue 官方文档](https://router.vuejs.org/zh/guide/advanced/lazy-loading.html) +> 2. 增加新的路由应该增加在 '/' (index) 路由的 `children` 内 +> 3. 子路由的父级路由必须有 `router-view` 才能让子路由渲染出来,请仔细查阅 vue-router 文档 +> 4. `permission` 可以进行自定义修改,只需要对这个模块进行自定义修改即可 [src/store/modules/permission.js#L10](https://github.com/sendya/ant-design-pro-vue/blob/master/src/store/modules/permission.js#L10) + + + +附权限路由结构: + +![权限结构](https://static-2.loacg.com/open/static/github/permissions.png) + + + +第二种前端路由由后端动态生成的设计,可以前往官网文档 https://pro.loacg.com/docs/authority-management 参考 \ No newline at end of file diff --git a/ui/src/router/index.js b/ui/src/router/index.js new file mode 100644 index 0000000..f3d4bd2 --- /dev/null +++ b/ui/src/router/index.js @@ -0,0 +1,28 @@ +import Vue from 'vue' +import Router from 'vue-router' +import { constantRouterMap } from '@/config/router.config' + +Vue.use(Router) + +// export default new Router({ +// mode: 'history', +// base: process.env.BASE_URL, +// scrollBehavior: () => ({ y: 0 }), +// routes: constantRouterMap +// }) + +const createRouter = () => new Router({ + mode: 'history', + base: process.env.BASE_URL, + scrollBehavior: () => ({ y: 0 }), + routes: constantRouterMap +}) + +const router = createRouter() + +export function resetRouter () { + const newRouter = createRouter() + router.matcher = newRouter.matcher // reset router +} + +export default router diff --git a/ui/src/store/getters.js b/ui/src/store/getters.js new file mode 100644 index 0000000..8805d33 --- /dev/null +++ b/ui/src/store/getters.js @@ -0,0 +1,15 @@ +const getters = { + device: state => state.app.device, + theme: state => state.app.theme, + color: state => state.app.color, + token: state => state.user.token, + avatar: state => state.user.avatar, + nickname: state => state.user.name, + welcome: state => state.user.welcome, + roles: state => state.user.roles, + userInfo: state => state.user.info, + addRouters: state => state.permission.addRouters, + multiTab: state => state.app.multiTab +} + +export default getters diff --git a/ui/src/store/index.js b/ui/src/store/index.js new file mode 100644 index 0000000..4e8529a --- /dev/null +++ b/ui/src/store/index.js @@ -0,0 +1,27 @@ +import Vue from 'vue' +import Vuex from 'vuex' + +import app from './modules/app' +import user from './modules/user' +import permission from './modules/permission' +import getters from './getters' + +Vue.use(Vuex) + +export default new Vuex.Store({ + modules: { + app, + user, + permission + }, + state: { + + }, + mutations: { + + }, + actions: { + + }, + getters +}) diff --git a/ui/src/store/modules/app.js b/ui/src/store/modules/app.js new file mode 100644 index 0000000..33e1180 --- /dev/null +++ b/ui/src/store/modules/app.js @@ -0,0 +1,122 @@ +import Vue from 'vue' +import { + SIDEBAR_TYPE, + DEFAULT_THEME, + DEFAULT_LAYOUT_MODE, + DEFAULT_COLOR, + DEFAULT_COLOR_WEAK, + DEFAULT_FIXED_HEADER, + DEFAULT_FIXED_SIDEMENU, + DEFAULT_FIXED_HEADER_HIDDEN, + DEFAULT_CONTENT_WIDTH_TYPE, + DEFAULT_MULTI_TAB +} from '@/store/mutation-types' + +const app = { + state: { + sidebar: true, + device: 'desktop', + theme: '', + layout: '', + contentWidth: '', + fixedHeader: true, + fixSiderbar: true, + autoHideHeader: true, + color: null, + weak: false, + multiTab: false + }, + mutations: { + SET_SIDEBAR_TYPE: (state, type) => { + state.sidebar = type + Vue.ls.set(SIDEBAR_TYPE, type) + }, + CLOSE_SIDEBAR: (state) => { + Vue.ls.set(SIDEBAR_TYPE, true) + state.sidebar = false + }, + TOGGLE_DEVICE: (state, device) => { + state.device = device + }, + TOGGLE_THEME: (state, theme) => { + // setStore('_DEFAULT_THEME', theme) + Vue.ls.set(DEFAULT_THEME, theme) + state.theme = theme + }, + TOGGLE_LAYOUT_MODE: (state, layout) => { + Vue.ls.set(DEFAULT_LAYOUT_MODE, layout) + state.layout = layout + }, + TOGGLE_FIXED_HEADER: (state, fixed) => { + Vue.ls.set(DEFAULT_FIXED_HEADER, fixed) + state.fixedHeader = fixed + }, + TOGGLE_FIXED_SIDERBAR: (state, fixed) => { + Vue.ls.set(DEFAULT_FIXED_SIDEMENU, fixed) + state.fixSiderbar = fixed + }, + TOGGLE_FIXED_HEADER_HIDDEN: (state, show) => { + Vue.ls.set(DEFAULT_FIXED_HEADER_HIDDEN, show) + state.autoHideHeader = show + }, + TOGGLE_CONTENT_WIDTH: (state, type) => { + Vue.ls.set(DEFAULT_CONTENT_WIDTH_TYPE, type) + state.contentWidth = type + }, + TOGGLE_COLOR: (state, color) => { + Vue.ls.set(DEFAULT_COLOR, color) + state.color = color + }, + TOGGLE_WEAK: (state, flag) => { + Vue.ls.set(DEFAULT_COLOR_WEAK, flag) + state.weak = flag + }, + TOGGLE_MULTI_TAB: (state, bool) => { + Vue.ls.set(DEFAULT_MULTI_TAB, bool) + state.multiTab = bool + } + }, + actions: { + setSidebar ({ commit }, type) { + commit('SET_SIDEBAR_TYPE', type) + }, + CloseSidebar ({ commit }) { + commit('CLOSE_SIDEBAR') + }, + ToggleDevice ({ commit }, device) { + commit('TOGGLE_DEVICE', device) + }, + ToggleTheme ({ commit }, theme) { + commit('TOGGLE_THEME', theme) + }, + ToggleLayoutMode ({ commit }, mode) { + commit('TOGGLE_LAYOUT_MODE', mode) + }, + ToggleFixedHeader ({ commit }, fixedHeader) { + if (!fixedHeader) { + commit('TOGGLE_FIXED_HEADER_HIDDEN', false) + } + commit('TOGGLE_FIXED_HEADER', fixedHeader) + }, + ToggleFixSiderbar ({ commit }, fixSiderbar) { + commit('TOGGLE_FIXED_SIDERBAR', fixSiderbar) + }, + ToggleFixedHeaderHidden ({ commit }, show) { + commit('TOGGLE_FIXED_HEADER_HIDDEN', show) + }, + ToggleContentWidth ({ commit }, type) { + commit('TOGGLE_CONTENT_WIDTH', type) + }, + ToggleColor ({ commit }, color) { + commit('TOGGLE_COLOR', color) + }, + ToggleWeak ({ commit }, weakFlag) { + commit('TOGGLE_WEAK', weakFlag) + }, + ToggleMultiTab ({ commit }, bool) { + commit('TOGGLE_MULTI_TAB', bool) + } + } +} + +export default app diff --git a/ui/src/store/modules/permission.js b/ui/src/store/modules/permission.js new file mode 100644 index 0000000..5139d27 --- /dev/null +++ b/ui/src/store/modules/permission.js @@ -0,0 +1,62 @@ +import { generatorDynamicRouter, constantRouterMap } from '@/config/router.config' + +/** + * 过滤账户是否拥有某一个权限,并将菜单从加载列表移除 + * + * @param permission + * @param route + * @returns {boolean} + */ +function hasPermission (permission, route) { + if (route.meta && route.meta.permission) { + let flag = false + for (let i = 0, len = permission.length; i < len; i++) { + flag = route.meta.permission.includes(permission[i]) + if (flag) { + return true + } + } + return false + } + return true +} + +function filterAsyncRouter (routerMap, roles) { + const accessedRouters = routerMap.filter(route => { + if (hasPermission(roles.permissions, route)) { + if (route.children && route.children.length) { + route.children = filterAsyncRouter(route.children, roles) + } + return true + } + return false + }) + return accessedRouters +} + +const permission = { + state: { + routers: constantRouterMap, + addRouters: [] + }, + mutations: { + SET_ROUTERS: (state, routers) => { + state.addRouters = routers + state.routers = constantRouterMap.concat(routers) + } + }, + actions: { + GenerateRoutes ({ commit }, data) { + return new Promise(resolve => { + const { roles } = data + generatorDynamicRouter(roles).then(routers => { + const accessedRouters = filterAsyncRouter(routers, roles) + commit('SET_ROUTERS', accessedRouters) + resolve() + }) + }) + } + } +} + +export default permission diff --git a/ui/src/store/modules/user.js b/ui/src/store/modules/user.js new file mode 100644 index 0000000..746c6ef --- /dev/null +++ b/ui/src/store/modules/user.js @@ -0,0 +1,95 @@ +import Vue from 'vue' +import { login, getInfo, logout } from '@/api/login' +import { ACCESS_TOKEN } from '@/store/mutation-types' +import { welcome } from '@/utils/util' + +const user = { + state: { + token: '', + name: '', + welcome: '', + avatar: '', + roles: [], + info: {} + }, + + mutations: { + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_NAME: (state, { name, welcome }) => { + state.name = name + state.welcome = welcome + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + }, + SET_ROLES: (state, roles) => { + state.roles = roles + }, + SET_INFO: (state, info) => { + state.info = info + } + }, + + actions: { + // 登录 + Login ({ commit }, userInfo) { + return new Promise((resolve, reject) => { + login(userInfo).then(response => { + Vue.ls.set(ACCESS_TOKEN, response.token, 7 * 24 * 60 * 60 * 1000) + commit('SET_TOKEN', response.token) + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // 获取用户信息 + GetInfo ({ commit }) { + return new Promise((resolve, reject) => { + getInfo().then(response => { + const result = response.result + + const role = result.role + role.permissions = result.role.permissions + role.permissions.map(per => { + if (per.actionEntitySet != null && per.actionEntitySet.length > 0) { + const action = per.actionEntitySet.map(action => { return action.action }) + per.actionList = action + } + }) + role.permissionList = role.permissions.map(permission => { return permission }) + commit('SET_ROLES', result.role) + commit('SET_INFO', result) + commit('SET_NAME', { name: result.name, welcome: welcome() }) + commit('SET_AVATAR', result.avatar) + + resolve(response) + }).catch(error => { + reject(error) + }) + }) + }, + + // 登出 + Logout ({ commit, state }) { + return new Promise((resolve) => { + commit('SET_TOKEN', '') + commit('SET_ROLES', []) + Vue.ls.remove(ACCESS_TOKEN) + + logout(state.token).then(() => { + window.location.reload() + resolve() + }).catch(() => { + resolve() + }) + }) + } + + } +} + +export default user diff --git a/ui/src/store/mutation-types.js b/ui/src/store/mutation-types.js new file mode 100644 index 0000000..2cf2dbb --- /dev/null +++ b/ui/src/store/mutation-types.js @@ -0,0 +1,16 @@ +export const ACCESS_TOKEN = 'Access-Token' +export const SIDEBAR_TYPE = 'SIDEBAR_TYPE' +export const DEFAULT_THEME = 'DEFAULT_THEME' +export const DEFAULT_LAYOUT_MODE = 'DEFAULT_LAYOUT_MODE' +export const DEFAULT_COLOR = 'DEFAULT_COLOR' +export const DEFAULT_COLOR_WEAK = 'DEFAULT_COLOR_WEAK' +export const DEFAULT_FIXED_HEADER = 'DEFAULT_FIXED_HEADER' +export const DEFAULT_FIXED_SIDEMENU = 'DEFAULT_FIXED_SIDEMENU' +export const DEFAULT_FIXED_HEADER_HIDDEN = 'DEFAULT_FIXED_HEADER_HIDDEN' +export const DEFAULT_CONTENT_WIDTH_TYPE = 'DEFAULT_CONTENT_WIDTH_TYPE' +export const DEFAULT_MULTI_TAB = 'DEFAULT_MULTI_TAB' + +export const CONTENT_WIDTH_TYPE = { + Fluid: 'Fluid', + Fixed: 'Fixed' +} diff --git a/ui/src/utils/axios.js b/ui/src/utils/axios.js new file mode 100644 index 0000000..3b91f6b --- /dev/null +++ b/ui/src/utils/axios.js @@ -0,0 +1,35 @@ +const VueAxios = { + vm: {}, + // eslint-disable-next-line no-unused-vars + install (Vue, instance) { + if (this.installed) { + return + } + this.installed = true + + if (!instance) { + // eslint-disable-next-line no-console + console.error('You have to install axios') + return + } + + Vue.axios = instance + + Object.defineProperties(Vue.prototype, { + axios: { + get: function get () { + return instance + } + }, + $http: { + get: function get () { + return instance + } + } + }) + } +} + +export { + VueAxios +} diff --git a/ui/src/utils/device.js b/ui/src/utils/device.js new file mode 100644 index 0000000..0f350f3 --- /dev/null +++ b/ui/src/utils/device.js @@ -0,0 +1,33 @@ +import enquireJs from 'enquire.js' + +export const DEVICE_TYPE = { + DESKTOP: 'desktop', + TABLET: 'tablet', + MOBILE: 'mobile' +} + +export const deviceEnquire = function (callback) { + const matchDesktop = { + match: () => { + callback && callback(DEVICE_TYPE.DESKTOP) + } + } + + const matchLablet = { + match: () => { + callback && callback(DEVICE_TYPE.TABLET) + } + } + + const matchMobile = { + match: () => { + callback && callback(DEVICE_TYPE.MOBILE) + } + } + + // screen and (max-width: 1087.99px) + enquireJs + .register('screen and (max-width: 576px)', matchMobile) + .register('screen and (min-width: 576px) and (max-width: 1199px)', matchLablet) + .register('screen and (min-width: 1200px)', matchDesktop) +} diff --git a/ui/src/utils/domUtil.js b/ui/src/utils/domUtil.js new file mode 100644 index 0000000..58db9a8 --- /dev/null +++ b/ui/src/utils/domUtil.js @@ -0,0 +1,19 @@ +export const setDocumentTitle = function (title) { + document.title = title + const ua = navigator.userAgent + // eslint-disable-next-line + const regex = /\bMicroMessenger\/([\d\.]+)/ + if (regex.test(ua) && /ip(hone|od|ad)/i.test(ua)) { + const i = document.createElement('iframe') + i.src = '/favicon.ico' + i.style.display = 'none' + i.onload = function () { + setTimeout(function () { + i.remove() + }, 9) + } + document.body.appendChild(i) + } +} + +export const domTitle = 'CMDB' diff --git a/ui/src/utils/filter.js b/ui/src/utils/filter.js new file mode 100644 index 0000000..45702c6 --- /dev/null +++ b/ui/src/utils/filter.js @@ -0,0 +1,20 @@ +import Vue from 'vue' +import moment from 'moment' +import 'moment/locale/zh-cn' +moment.locale('zh-cn') + +Vue.filter('NumberFormat', function (value) { + if (!value) { + return '0' + } + const intPartFormat = value.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') // 将整数部分逢三一断 + return intPartFormat +}) + +Vue.filter('dayjs', function (dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { + return moment(dataStr).format(pattern) +}) + +Vue.filter('moment', function (dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { + return moment(dataStr).format(pattern) +}) diff --git a/ui/src/utils/helper/permission.js b/ui/src/utils/helper/permission.js new file mode 100644 index 0000000..a964324 --- /dev/null +++ b/ui/src/utils/helper/permission.js @@ -0,0 +1,51 @@ +const PERMISSION_ENUM = { + 'add': { key: 'add', label: '新增' }, + 'delete': { key: 'delete', label: '删除' }, + 'edit': { key: 'edit', label: '修改' }, + 'query': { key: 'query', label: '查询' }, + 'get': { key: 'get', label: '详情' }, + 'enable': { key: 'enable', label: '启用' }, + 'disable': { key: 'disable', label: '禁用' }, + 'import': { key: 'import', label: '导入' }, + 'export': { key: 'export', label: '导出' } +} + +function plugin (Vue) { + if (plugin.installed) { + return + } + + !Vue.prototype.$auth && Object.defineProperties(Vue.prototype, { + $auth: { + get () { + const _this = this + return (permissions) => { + const [permission, action] = permissions.split('.') + const permissionList = _this.$store.getters.roles.permissions + return permissionList.find((val) => { + return val.permissionId === permission + }).actionList.findIndex((val) => { + return val === action + }) > -1 + } + } + } + }) + + !Vue.prototype.$enum && Object.defineProperties(Vue.prototype, { + $enum: { + get () { + // const _this = this; + return (val) => { + let result = PERMISSION_ENUM + val && val.split('.').forEach(v => { + result = result && result[v] || null + }) + return result + } + } + } + }) +} + +export default plugin diff --git a/ui/src/utils/mixin.js b/ui/src/utils/mixin.js new file mode 100644 index 0000000..217732d --- /dev/null +++ b/ui/src/utils/mixin.js @@ -0,0 +1,76 @@ +// import Vue from 'vue' +import { deviceEnquire, DEVICE_TYPE } from '@/utils/device' +import { mapState } from 'vuex' + +// const mixinsComputed = Vue.config.optionMergeStrategies.computed +// const mixinsMethods = Vue.config.optionMergeStrategies.methods + +const mixin = { + computed: { + ...mapState({ + layoutMode: state => state.app.layout, + navTheme: state => state.app.theme, + primaryColor: state => state.app.color, + colorWeak: state => state.app.weak, + fixedHeader: state => state.app.fixedHeader, + fixSiderbar: state => state.app.fixSiderbar, + fixSidebar: state => state.app.fixSiderbar, + contentWidth: state => state.app.contentWidth, + autoHideHeader: state => state.app.autoHideHeader, + sidebarOpened: state => state.app.sidebar, + multiTab: state => state.app.multiTab + }) + }, + methods: { + isTopMenu () { + return this.layoutMode === 'topmenu' + }, + isSideMenu () { + return !this.isTopMenu() + } + } +} + +const mixinDevice = { + computed: { + ...mapState({ + device: state => state.app.device + }) + }, + methods: { + isMobile () { + return this.device === DEVICE_TYPE.MOBILE + }, + isDesktop () { + return this.device === DEVICE_TYPE.DESKTOP + }, + isTablet () { + return this.device === DEVICE_TYPE.TABLET + } + } +} + +const AppDeviceEnquire = { + mounted () { + const { $store } = this + deviceEnquire(deviceType => { + switch (deviceType) { + case DEVICE_TYPE.DESKTOP: + $store.commit('TOGGLE_DEVICE', 'desktop') + $store.dispatch('setSidebar', true) + break + case DEVICE_TYPE.TABLET: + $store.commit('TOGGLE_DEVICE', 'tablet') + $store.dispatch('setSidebar', false) + break + case DEVICE_TYPE.MOBILE: + default: + $store.commit('TOGGLE_DEVICE', 'mobile') + $store.dispatch('setSidebar', true) + break + } + }) + } +} + +export { mixin, AppDeviceEnquire, mixinDevice } diff --git a/ui/src/utils/permissions.js b/ui/src/utils/permissions.js new file mode 100644 index 0000000..f8668bb --- /dev/null +++ b/ui/src/utils/permissions.js @@ -0,0 +1,8 @@ +export function actionToObject (json) { + try { + return JSON.parse(json) + } catch (e) { + console.log('err', e.message) + } + return [] +} diff --git a/ui/src/utils/request.js b/ui/src/utils/request.js new file mode 100644 index 0000000..d6ff6ee --- /dev/null +++ b/ui/src/utils/request.js @@ -0,0 +1,56 @@ +import Vue from 'vue' +import axios from 'axios' +import store from '@/store' +import notification from 'ant-design-vue/es/notification' +import { VueAxios } from './axios' +import { ACCESS_TOKEN } from '@/store/mutation-types' + +// 创建 axios 实例 +const service = axios.create({ + baseURL: process.env.VUE_APP_API_BASE_URL, // api base_url + timeout: 6000, // 请求超时时间 + withCredentials: true, + crossDomain: true +}) + +const err = (error) => { + if (error.response) { + const data = error.response.data + if (error.response.status === 403) { + notification.error({ + message: 'Forbidden', + description: data.message + }) + } + if (error.response.status === 401) { + store.dispatch('Logout') + } + } + return Promise.reject(error) +} + +// request interceptor +service.interceptors.request.use(config => { + const token = Vue.ls.get(ACCESS_TOKEN) + if (token) { + config.headers['Access-Token'] = token // 让每个请求携带自定义 token 请根据实际情况自行修改 + } + return config +}, err) + +// response interceptor +service.interceptors.response.use((response) => { + return response.data +}, err) + +const installer = { + vm: {}, + install (Vue) { + Vue.use(VueAxios, service) + } +} + +export { + installer as VueAxios, + service as axios +} diff --git a/ui/src/utils/util.js b/ui/src/utils/util.js new file mode 100644 index 0000000..82f5dbf --- /dev/null +++ b/ui/src/utils/util.js @@ -0,0 +1,60 @@ +export function timeFix () { + const time = new Date() + const hour = time.getHours() + return hour < 9 ? '早上好' : hour <= 11 ? '上午好' : hour <= 13 ? '中午好' : hour < 20 ? '下午好' : '晚上好' +} + +export function welcome () { + const arr = ['休息一会儿吧', '准备吃什么呢?', '要不要打一把 DOTA', '我猜你可能累了'] + const index = Math.floor(Math.random() * arr.length) + return arr[index] +} + +/** + * 触发 window.resize + */ +export function triggerWindowResizeEvent () { + const event = document.createEvent('HTMLEvents') + event.initEvent('resize', true, true) + event.eventType = 'message' + window.dispatchEvent(event) +} + +export function handleScrollHeader (callback) { + let timer = 0 + + let beforeScrollTop = window.pageYOffset + callback = callback || function () {} + window.addEventListener( + 'scroll', + event => { + clearTimeout(timer) + timer = setTimeout(() => { + let direction = 'up' + const afterScrollTop = window.pageYOffset + const delta = afterScrollTop - beforeScrollTop + if (delta === 0) { + return false + } + direction = delta > 0 ? 'down' : 'up' + callback(direction) + beforeScrollTop = afterScrollTop + }, 50) + }, + false + ) +} + +/** + * Remove loading animate + * @param id parent element id or class + * @param timeout + */ +export function removeLoadingAnimate (id = '', timeout = 1500) { + if (id === '') { + return + } + setTimeout(() => { + document.body.removeChild(document.getElementById(id)) + }, timeout) +} diff --git a/ui/src/utils/utils.less b/ui/src/utils/utils.less new file mode 100644 index 0000000..ba75a67 --- /dev/null +++ b/ui/src/utils/utils.less @@ -0,0 +1,50 @@ +.textOverflow() { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + word-break: break-all; +} + +.textOverflowMulti(@line: 3, @bg: #fff) { + position: relative; + max-height: @line * 1.5em; + margin-right: -1em; + padding-right: 1em; + overflow: hidden; + line-height: 1.5em; + text-align: justify; + &::before { + position: absolute; + right: 14px; + bottom: 0; + padding: 0 1px; + background: @bg; + content: '...'; + } + &::after { + position: absolute; + right: 14px; + width: 1em; + height: 1em; + margin-top: 0.2em; + background: white; + content: ''; + } +} + +// mixins for clearfix +// ------------------------ +.clearfix() { + zoom: 1; + &::before, + &::after { + display: table; + content: ' '; + } + &::after { + clear: both; + height: 0; + font-size: 0; + visibility: hidden; + } +} \ No newline at end of file diff --git a/ui/src/views/404.vue b/ui/src/views/404.vue new file mode 100644 index 0000000..8c1d8a1 --- /dev/null +++ b/ui/src/views/404.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/ui/src/views/account/center/Index.vue b/ui/src/views/account/center/Index.vue new file mode 100644 index 0000000..afa4fe2 --- /dev/null +++ b/ui/src/views/account/center/Index.vue @@ -0,0 +1,288 @@ + + + + + diff --git a/ui/src/views/account/center/page/App.vue b/ui/src/views/account/center/page/App.vue new file mode 100644 index 0000000..853aeab --- /dev/null +++ b/ui/src/views/account/center/page/App.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/ui/src/views/account/center/page/Article.vue b/ui/src/views/account/center/page/Article.vue new file mode 100644 index 0000000..724c07c --- /dev/null +++ b/ui/src/views/account/center/page/Article.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/ui/src/views/account/center/page/Project.vue b/ui/src/views/account/center/page/Project.vue new file mode 100644 index 0000000..145232f --- /dev/null +++ b/ui/src/views/account/center/page/Project.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/ui/src/views/account/center/page/index.js b/ui/src/views/account/center/page/index.js new file mode 100644 index 0000000..b579b6a --- /dev/null +++ b/ui/src/views/account/center/page/index.js @@ -0,0 +1,5 @@ +import AppPage from './App' +import ArticlePage from './Article' +import ProjectPage from './Project' + +export { AppPage, ArticlePage, ProjectPage } diff --git a/ui/src/views/account/settings/AvatarModal.vue b/ui/src/views/account/settings/AvatarModal.vue new file mode 100644 index 0000000..0ad9c41 --- /dev/null +++ b/ui/src/views/account/settings/AvatarModal.vue @@ -0,0 +1,109 @@ + + + + diff --git a/ui/src/views/account/settings/BaseSetting.vue b/ui/src/views/account/settings/BaseSetting.vue new file mode 100644 index 0000000..6278aa1 --- /dev/null +++ b/ui/src/views/account/settings/BaseSetting.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/ui/src/views/account/settings/Binding.vue b/ui/src/views/account/settings/Binding.vue new file mode 100644 index 0000000..cbea7fc --- /dev/null +++ b/ui/src/views/account/settings/Binding.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/ui/src/views/account/settings/Custom.vue b/ui/src/views/account/settings/Custom.vue new file mode 100644 index 0000000..02c3bc1 --- /dev/null +++ b/ui/src/views/account/settings/Custom.vue @@ -0,0 +1,75 @@ + + + diff --git a/ui/src/views/account/settings/Index.vue b/ui/src/views/account/settings/Index.vue new file mode 100644 index 0000000..dd17a81 --- /dev/null +++ b/ui/src/views/account/settings/Index.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/ui/src/views/account/settings/Notification.vue b/ui/src/views/account/settings/Notification.vue new file mode 100644 index 0000000..cbea7fc --- /dev/null +++ b/ui/src/views/account/settings/Notification.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/ui/src/views/account/settings/Security.vue b/ui/src/views/account/settings/Security.vue new file mode 100644 index 0000000..e806918 --- /dev/null +++ b/ui/src/views/account/settings/Security.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/ui/src/views/cmdb/ci/index.vue b/ui/src/views/cmdb/ci/index.vue new file mode 100644 index 0000000..5200568 --- /dev/null +++ b/ui/src/views/cmdb/ci/index.vue @@ -0,0 +1,449 @@ + + + + + diff --git a/ui/src/views/cmdb/ci/modules/CiDetail.vue b/ui/src/views/cmdb/ci/modules/CiDetail.vue new file mode 100644 index 0000000..811b477 --- /dev/null +++ b/ui/src/views/cmdb/ci/modules/CiDetail.vue @@ -0,0 +1,369 @@ + + + + + diff --git a/ui/src/views/cmdb/ci/modules/CreateInstanceForm.vue b/ui/src/views/cmdb/ci/modules/CreateInstanceForm.vue new file mode 100644 index 0000000..0cb120e --- /dev/null +++ b/ui/src/views/cmdb/ci/modules/CreateInstanceForm.vue @@ -0,0 +1,158 @@ + + + diff --git a/ui/src/views/cmdb/ci/modules/EditableCell.vue b/ui/src/views/cmdb/ci/modules/EditableCell.vue new file mode 100644 index 0000000..45f0f15 --- /dev/null +++ b/ui/src/views/cmdb/ci/modules/EditableCell.vue @@ -0,0 +1,76 @@ + + + + diff --git a/ui/src/views/cmdb/ci/modules/SearchForm.vue b/ui/src/views/cmdb/ci/modules/SearchForm.vue new file mode 100644 index 0000000..fda862c --- /dev/null +++ b/ui/src/views/cmdb/ci/modules/SearchForm.vue @@ -0,0 +1,131 @@ + + + diff --git a/ui/src/views/cmdb/preference/index.vue b/ui/src/views/cmdb/preference/index.vue new file mode 100644 index 0000000..fa9bd77 --- /dev/null +++ b/ui/src/views/cmdb/preference/index.vue @@ -0,0 +1,366 @@ + + + + + diff --git a/ui/src/views/cmdb/tree_views/index.vue b/ui/src/views/cmdb/tree_views/index.vue new file mode 100644 index 0000000..e2f9d00 --- /dev/null +++ b/ui/src/views/cmdb/tree_views/index.vue @@ -0,0 +1,248 @@ + + + + + diff --git a/ui/src/views/exception/403.vue b/ui/src/views/exception/403.vue new file mode 100644 index 0000000..ffc3799 --- /dev/null +++ b/ui/src/views/exception/403.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/ui/src/views/exception/404.vue b/ui/src/views/exception/404.vue new file mode 100644 index 0000000..16f767f --- /dev/null +++ b/ui/src/views/exception/404.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/ui/src/views/exception/500.vue b/ui/src/views/exception/500.vue new file mode 100644 index 0000000..cc5d7ab --- /dev/null +++ b/ui/src/views/exception/500.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/ui/src/views/user/Login.vue b/ui/src/views/user/Login.vue new file mode 100644 index 0000000..501b679 --- /dev/null +++ b/ui/src/views/user/Login.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/ui/src/views/user/Register.vue b/ui/src/views/user/Register.vue new file mode 100644 index 0000000..79be00c --- /dev/null +++ b/ui/src/views/user/Register.vue @@ -0,0 +1,322 @@ + + + + + diff --git a/ui/src/views/user/RegisterResult.vue b/ui/src/views/user/RegisterResult.vue new file mode 100644 index 0000000..5a807e0 --- /dev/null +++ b/ui/src/views/user/RegisterResult.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/ui/src/views/welcome/index.vue b/ui/src/views/welcome/index.vue new file mode 100644 index 0000000..9ff288c --- /dev/null +++ b/ui/src/views/welcome/index.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/ui/src/views/welcome/welcome.vue b/ui/src/views/welcome/welcome.vue new file mode 100644 index 0000000..e69de29 diff --git a/ui/tests/unit/.eslintrc.js b/ui/tests/unit/.eslintrc.js new file mode 100644 index 0000000..958d51b --- /dev/null +++ b/ui/tests/unit/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = { + env: { + jest: true + } +} diff --git a/ui/vue.config.js b/ui/vue.config.js new file mode 100644 index 0000000..80013c9 --- /dev/null +++ b/ui/vue.config.js @@ -0,0 +1,126 @@ +const path = require('path') +const webpack = require('webpack') +const ThemeColorReplacer = require('webpack-theme-color-replacer') +const generate = require('@ant-design/colors/lib/generate').default + +function resolve (dir) { + return path.join(__dirname, dir) +} + +// vue.config.js +module.exports = { + configureWebpack: { + plugins: [ + // Ignore all locale files of moment.js + new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), + // 生成仅包含颜色的替换样式(主题色等) + // TODO 需要增加根据环境不开启主题需求 + new ThemeColorReplacer({ + fileName: 'css/theme-colors-[contenthash:8].css', + matchColors: getAntdSerials('#1890ff'), // 主色系列 + // 改变样式选择器,解决样式覆盖问题 + changeSelector (selector) { + switch (selector) { + case '.ant-calendar-today .ant-calendar-date': + return ':not(.ant-calendar-selected-date):not(.ant-calendar-selected-day)' + selector + case '.ant-btn:focus,.ant-btn:hover': + return '.ant-btn:focus:not(.ant-btn-primary),.ant-btn:hover:not(.ant-btn-primary)' + case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon': + return ':not(.ant-steps-item-process)' + selector + case '.ant-btn.active,.ant-btn:active': + return '.ant-btn.active:not(.ant-btn-primary),.ant-btn:active:not(.ant-btn-primary)' + case '.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item-open,.ant-menu-horizontal>.ant-menu-item-selected,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu-active,.ant-menu-horizontal>.ant-menu-submenu-open,.ant-menu-horizontal>.ant-menu-submenu-selected,.ant-menu-horizontal>.ant-menu-submenu:hover': + case '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal > .ant-menu-submenu-selected,.ant-menu-horizontal > .ant-menu-submenu:hover': + return '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover' + case '.ant-menu-horizontal > .ant-menu-item-selected > a': + return ':not(.ant-menu-horizontal)' + selector + case '.ant-menu-horizontal > .ant-menu-item > a:hover': + return ':not(.ant-menu-horizontal)' + selector + default : + return selector + } + } + }) + ] + }, + + chainWebpack: (config) => { + config.resolve.alias + .set('@$', resolve('src')) + + const svgRule = config.module.rule('svg') + svgRule.uses.clear() + svgRule + .oneOf('inline') + .resourceQuery(/inline/) + .use('vue-svg-icon-loader') + .loader('vue-svg-icon-loader') + .end() + .end() + .oneOf('external') + .use('file-loader') + .loader('file-loader') + .options({ + name: 'assets/[name].[hash:8].[ext]' + }) + /* svgRule.oneOf('inline') + .resourceQuery(/inline/) + .use('vue-svg-loader') + .loader('vue-svg-loader') + .end() + .end() + .oneOf('external') + .use('file-loader') + .loader('file-loader') + .options({ + name: 'assets/[name].[hash:8].[ext]' + }) + */ + }, + + css: { + loaderOptions: { + less: { + modifyVars: { + /* less 变量覆盖,用于自定义 ant design 主题 */ + + /* + 'primary-color': '#F5222D', + 'link-color': '#F5222D', + 'border-radius-base': '4px', + */ + }, + javascriptEnabled: true + } + } + }, + + devServer: { + // development server port 8000 + disableHostCheck: true, + port: 8000 + // proxy: { + // '/api': { + // // target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro', + // target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro', + // ws: false, + // changeOrigin: true + // } + // } + }, + + // disable source map in production + productionSourceMap: false, + lintOnSave: undefined, + // babel-loader no-ignore node_modules/* + transpileDependencies: [] +} + +function getAntdSerials (color) { + // 淡化(即less的tint) + const lightens = new Array(9).fill().map((t, i) => { + return ThemeColorReplacer.varyColor.lighten(color, i / 10) + }) + const colorPalettes = generate(color) + return lightens.concat(colorPalettes) +} diff --git a/ui/webstorm.config.js b/ui/webstorm.config.js new file mode 100644 index 0000000..cb1fc8c --- /dev/null +++ b/ui/webstorm.config.js @@ -0,0 +1,16 @@ +'use strict' +const path = require('path') + +function resolve (dir) { + return path.join(__dirname, '.', dir) +} + +module.exports = { + context: path.resolve(__dirname, './'), + resolve: { + extensions: ['.js', '.vue', '.json'], + alias: { + '@': resolve('src') + } + } +} From 38dabc35e5c307c9ca84f48e67273a3893c8e2c7 Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 28 Aug 2019 21:08:28 +0800 Subject: [PATCH 028/159] add .gitattributes --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..5e3fa99 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +* linguist-language=python + From 55dad7a58c88bfdc1614e0bc8a23e19a020ef2ae Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 30 Aug 2019 09:46:24 +0800 Subject: [PATCH 029/159] =?UTF-8?q?cache=E5=BC=BA=E5=88=B6unicode=E7=BC=96?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/lib/cmdb/cache.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/api/lib/cmdb/cache.py b/api/lib/cmdb/cache.py index 08f25b9..629463e 100644 --- a/api/lib/cmdb/cache.py +++ b/api/lib/cmdb/cache.py @@ -1,10 +1,6 @@ # -*- coding:utf-8 -*- -import six -if six.PY2: - import sys - reload(sys) - sys.setdefaultencoding("utf-8") +from __future__ import unicode_literals from api.extensions import cache from api.models.cmdb import Attribute From 64c3b9da3b5900c00013fcaabfd6661516cc5a8d Mon Sep 17 00:00:00 2001 From: lilixiang Date: Wed, 28 Aug 2019 21:16:16 +0800 Subject: [PATCH 030/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E5=BA=93=E5=92=8C=E6=A8=A1=E5=9E=8B=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/src/views/attributes/index.vue | 374 +++++++++++ .../views/attributes/module/attributeForm.vue | 339 ++++++++++ ui/src/views/attributes/module/const.js | 8 + ui/src/views/ci_type/attributesTable.vue | 551 ++++++++++++++++ ui/src/views/ci_type/checkTable.vue | 349 +++++++++++ ui/src/views/ci_type/defaultShowTable.vue | 355 +++++++++++ ui/src/views/ci_type/detail.vue | 89 +++ ui/src/views/ci_type/group.vue | 591 ++++++++++++++++++ ui/src/views/ci_type/list.vue | 291 +++++++++ ui/src/views/ci_type/relationTable.vue | 337 ++++++++++ 10 files changed, 3284 insertions(+) create mode 100644 ui/src/views/attributes/index.vue create mode 100644 ui/src/views/attributes/module/attributeForm.vue create mode 100644 ui/src/views/attributes/module/const.js create mode 100644 ui/src/views/ci_type/attributesTable.vue create mode 100644 ui/src/views/ci_type/checkTable.vue create mode 100644 ui/src/views/ci_type/defaultShowTable.vue create mode 100644 ui/src/views/ci_type/detail.vue create mode 100644 ui/src/views/ci_type/group.vue create mode 100644 ui/src/views/ci_type/list.vue create mode 100644 ui/src/views/ci_type/relationTable.vue diff --git a/ui/src/views/attributes/index.vue b/ui/src/views/attributes/index.vue new file mode 100644 index 0000000..b3d97fb --- /dev/null +++ b/ui/src/views/attributes/index.vue @@ -0,0 +1,374 @@ + + + + + diff --git a/ui/src/views/attributes/module/attributeForm.vue b/ui/src/views/attributes/module/attributeForm.vue new file mode 100644 index 0000000..9959925 --- /dev/null +++ b/ui/src/views/attributes/module/attributeForm.vue @@ -0,0 +1,339 @@ + + + + + diff --git a/ui/src/views/attributes/module/const.js b/ui/src/views/attributes/module/const.js new file mode 100644 index 0000000..2f43d48 --- /dev/null +++ b/ui/src/views/attributes/module/const.js @@ -0,0 +1,8 @@ +export const valueTypeMap = { + '0': '整数', + '1': '浮点数', + '2': '文本', + '3': 'datetime', + '4': 'date', + '5': 'time' +} diff --git a/ui/src/views/ci_type/attributesTable.vue b/ui/src/views/ci_type/attributesTable.vue new file mode 100644 index 0000000..22adaf3 --- /dev/null +++ b/ui/src/views/ci_type/attributesTable.vue @@ -0,0 +1,551 @@ + + + + + diff --git a/ui/src/views/ci_type/checkTable.vue b/ui/src/views/ci_type/checkTable.vue new file mode 100644 index 0000000..cf201b9 --- /dev/null +++ b/ui/src/views/ci_type/checkTable.vue @@ -0,0 +1,349 @@ + + + + + diff --git a/ui/src/views/ci_type/defaultShowTable.vue b/ui/src/views/ci_type/defaultShowTable.vue new file mode 100644 index 0000000..ac24abf --- /dev/null +++ b/ui/src/views/ci_type/defaultShowTable.vue @@ -0,0 +1,355 @@ + + + + + diff --git a/ui/src/views/ci_type/detail.vue b/ui/src/views/ci_type/detail.vue new file mode 100644 index 0000000..6ba6f21 --- /dev/null +++ b/ui/src/views/ci_type/detail.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/ui/src/views/ci_type/group.vue b/ui/src/views/ci_type/group.vue new file mode 100644 index 0000000..24bf748 --- /dev/null +++ b/ui/src/views/ci_type/group.vue @@ -0,0 +1,591 @@ + + + + + diff --git a/ui/src/views/ci_type/list.vue b/ui/src/views/ci_type/list.vue new file mode 100644 index 0000000..5e6b225 --- /dev/null +++ b/ui/src/views/ci_type/list.vue @@ -0,0 +1,291 @@ + + + + + diff --git a/ui/src/views/ci_type/relationTable.vue b/ui/src/views/ci_type/relationTable.vue new file mode 100644 index 0000000..da5835a --- /dev/null +++ b/ui/src/views/ci_type/relationTable.vue @@ -0,0 +1,337 @@ + + + + + From 5cdb4ecd2ac83fb30e60f86ea3aea759c9161989 Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 28 Aug 2019 21:20:17 +0800 Subject: [PATCH 031/159] =?UTF-8?q?Revert=20"add=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=BA=93=E5=92=8C=E6=A8=A1=E5=9E=8B=E6=A8=A1?= =?UTF-8?q?=E5=9D=97"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/src/views/attributes/index.vue | 374 ----------- .../views/attributes/module/attributeForm.vue | 339 ---------- ui/src/views/attributes/module/const.js | 8 - ui/src/views/ci_type/attributesTable.vue | 551 ---------------- ui/src/views/ci_type/checkTable.vue | 349 ----------- ui/src/views/ci_type/defaultShowTable.vue | 355 ----------- ui/src/views/ci_type/detail.vue | 89 --- ui/src/views/ci_type/group.vue | 591 ------------------ ui/src/views/ci_type/list.vue | 291 --------- ui/src/views/ci_type/relationTable.vue | 337 ---------- 10 files changed, 3284 deletions(-) delete mode 100644 ui/src/views/attributes/index.vue delete mode 100644 ui/src/views/attributes/module/attributeForm.vue delete mode 100644 ui/src/views/attributes/module/const.js delete mode 100644 ui/src/views/ci_type/attributesTable.vue delete mode 100644 ui/src/views/ci_type/checkTable.vue delete mode 100644 ui/src/views/ci_type/defaultShowTable.vue delete mode 100644 ui/src/views/ci_type/detail.vue delete mode 100644 ui/src/views/ci_type/group.vue delete mode 100644 ui/src/views/ci_type/list.vue delete mode 100644 ui/src/views/ci_type/relationTable.vue diff --git a/ui/src/views/attributes/index.vue b/ui/src/views/attributes/index.vue deleted file mode 100644 index b3d97fb..0000000 --- a/ui/src/views/attributes/index.vue +++ /dev/null @@ -1,374 +0,0 @@ - - - - - diff --git a/ui/src/views/attributes/module/attributeForm.vue b/ui/src/views/attributes/module/attributeForm.vue deleted file mode 100644 index 9959925..0000000 --- a/ui/src/views/attributes/module/attributeForm.vue +++ /dev/null @@ -1,339 +0,0 @@ - - - - - diff --git a/ui/src/views/attributes/module/const.js b/ui/src/views/attributes/module/const.js deleted file mode 100644 index 2f43d48..0000000 --- a/ui/src/views/attributes/module/const.js +++ /dev/null @@ -1,8 +0,0 @@ -export const valueTypeMap = { - '0': '整数', - '1': '浮点数', - '2': '文本', - '3': 'datetime', - '4': 'date', - '5': 'time' -} diff --git a/ui/src/views/ci_type/attributesTable.vue b/ui/src/views/ci_type/attributesTable.vue deleted file mode 100644 index 22adaf3..0000000 --- a/ui/src/views/ci_type/attributesTable.vue +++ /dev/null @@ -1,551 +0,0 @@ - - - - - diff --git a/ui/src/views/ci_type/checkTable.vue b/ui/src/views/ci_type/checkTable.vue deleted file mode 100644 index cf201b9..0000000 --- a/ui/src/views/ci_type/checkTable.vue +++ /dev/null @@ -1,349 +0,0 @@ - - - - - diff --git a/ui/src/views/ci_type/defaultShowTable.vue b/ui/src/views/ci_type/defaultShowTable.vue deleted file mode 100644 index ac24abf..0000000 --- a/ui/src/views/ci_type/defaultShowTable.vue +++ /dev/null @@ -1,355 +0,0 @@ - - - - - diff --git a/ui/src/views/ci_type/detail.vue b/ui/src/views/ci_type/detail.vue deleted file mode 100644 index 6ba6f21..0000000 --- a/ui/src/views/ci_type/detail.vue +++ /dev/null @@ -1,89 +0,0 @@ - - - - - diff --git a/ui/src/views/ci_type/group.vue b/ui/src/views/ci_type/group.vue deleted file mode 100644 index 24bf748..0000000 --- a/ui/src/views/ci_type/group.vue +++ /dev/null @@ -1,591 +0,0 @@ - - - - - diff --git a/ui/src/views/ci_type/list.vue b/ui/src/views/ci_type/list.vue deleted file mode 100644 index 5e6b225..0000000 --- a/ui/src/views/ci_type/list.vue +++ /dev/null @@ -1,291 +0,0 @@ - - - - - diff --git a/ui/src/views/ci_type/relationTable.vue b/ui/src/views/ci_type/relationTable.vue deleted file mode 100644 index da5835a..0000000 --- a/ui/src/views/ci_type/relationTable.vue +++ /dev/null @@ -1,337 +0,0 @@ - - - - - From 13476128d58d92ef384a5245d08a9d03891a3e8a Mon Sep 17 00:00:00 2001 From: lilixiang Date: Wed, 28 Aug 2019 21:32:11 +0800 Subject: [PATCH 032/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E5=BA=93=E5=92=8C=E6=A8=A1=E5=9E=8B=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/src/views/cmdb/attributes/index.vue | 374 +++++++++++ .../cmdb/attributes/module/attributeForm.vue | 339 ++++++++++ ui/src/views/cmdb/attributes/module/const.js | 8 + ui/src/views/cmdb/ci_type/attributesTable.vue | 551 ++++++++++++++++ ui/src/views/cmdb/ci_type/checkTable.vue | 349 +++++++++++ .../views/cmdb/ci_type/defaultShowTable.vue | 355 +++++++++++ ui/src/views/cmdb/ci_type/detail.vue | 89 +++ ui/src/views/cmdb/ci_type/group.vue | 591 ++++++++++++++++++ ui/src/views/cmdb/ci_type/list.vue | 291 +++++++++ ui/src/views/cmdb/ci_type/relationTable.vue | 337 ++++++++++ 10 files changed, 3284 insertions(+) create mode 100644 ui/src/views/cmdb/attributes/index.vue create mode 100644 ui/src/views/cmdb/attributes/module/attributeForm.vue create mode 100644 ui/src/views/cmdb/attributes/module/const.js create mode 100644 ui/src/views/cmdb/ci_type/attributesTable.vue create mode 100644 ui/src/views/cmdb/ci_type/checkTable.vue create mode 100644 ui/src/views/cmdb/ci_type/defaultShowTable.vue create mode 100644 ui/src/views/cmdb/ci_type/detail.vue create mode 100644 ui/src/views/cmdb/ci_type/group.vue create mode 100644 ui/src/views/cmdb/ci_type/list.vue create mode 100644 ui/src/views/cmdb/ci_type/relationTable.vue diff --git a/ui/src/views/cmdb/attributes/index.vue b/ui/src/views/cmdb/attributes/index.vue new file mode 100644 index 0000000..b3d97fb --- /dev/null +++ b/ui/src/views/cmdb/attributes/index.vue @@ -0,0 +1,374 @@ + + + + + diff --git a/ui/src/views/cmdb/attributes/module/attributeForm.vue b/ui/src/views/cmdb/attributes/module/attributeForm.vue new file mode 100644 index 0000000..9959925 --- /dev/null +++ b/ui/src/views/cmdb/attributes/module/attributeForm.vue @@ -0,0 +1,339 @@ + + + + + diff --git a/ui/src/views/cmdb/attributes/module/const.js b/ui/src/views/cmdb/attributes/module/const.js new file mode 100644 index 0000000..2f43d48 --- /dev/null +++ b/ui/src/views/cmdb/attributes/module/const.js @@ -0,0 +1,8 @@ +export const valueTypeMap = { + '0': '整数', + '1': '浮点数', + '2': '文本', + '3': 'datetime', + '4': 'date', + '5': 'time' +} diff --git a/ui/src/views/cmdb/ci_type/attributesTable.vue b/ui/src/views/cmdb/ci_type/attributesTable.vue new file mode 100644 index 0000000..22adaf3 --- /dev/null +++ b/ui/src/views/cmdb/ci_type/attributesTable.vue @@ -0,0 +1,551 @@ + + + + + diff --git a/ui/src/views/cmdb/ci_type/checkTable.vue b/ui/src/views/cmdb/ci_type/checkTable.vue new file mode 100644 index 0000000..cf201b9 --- /dev/null +++ b/ui/src/views/cmdb/ci_type/checkTable.vue @@ -0,0 +1,349 @@ + + + + + diff --git a/ui/src/views/cmdb/ci_type/defaultShowTable.vue b/ui/src/views/cmdb/ci_type/defaultShowTable.vue new file mode 100644 index 0000000..ac24abf --- /dev/null +++ b/ui/src/views/cmdb/ci_type/defaultShowTable.vue @@ -0,0 +1,355 @@ + + + + + diff --git a/ui/src/views/cmdb/ci_type/detail.vue b/ui/src/views/cmdb/ci_type/detail.vue new file mode 100644 index 0000000..6ba6f21 --- /dev/null +++ b/ui/src/views/cmdb/ci_type/detail.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/ui/src/views/cmdb/ci_type/group.vue b/ui/src/views/cmdb/ci_type/group.vue new file mode 100644 index 0000000..24bf748 --- /dev/null +++ b/ui/src/views/cmdb/ci_type/group.vue @@ -0,0 +1,591 @@ + + + + + diff --git a/ui/src/views/cmdb/ci_type/list.vue b/ui/src/views/cmdb/ci_type/list.vue new file mode 100644 index 0000000..5e6b225 --- /dev/null +++ b/ui/src/views/cmdb/ci_type/list.vue @@ -0,0 +1,291 @@ + + + + + diff --git a/ui/src/views/cmdb/ci_type/relationTable.vue b/ui/src/views/cmdb/ci_type/relationTable.vue new file mode 100644 index 0000000..da5835a --- /dev/null +++ b/ui/src/views/cmdb/ci_type/relationTable.vue @@ -0,0 +1,337 @@ + + + + + From 61f77cf311cc89873f792d2444d8d36822beb30c Mon Sep 17 00:00:00 2001 From: shaohaojiecoder <445923944@qq.com> Date: Wed, 28 Aug 2019 21:24:21 +0800 Subject: [PATCH 033/159] add batch module --- ui/src/views/cmdb/batch/index.vue | 85 +++++++++++++ ui/src/views/cmdb/batch/modules/CiTable.vue | 99 +++++++++++++++ .../views/cmdb/batch/modules/CiTypeChoice.vue | 113 ++++++++++++++++++ .../cmdb/batch/modules/UploadFileForm.vue | 61 ++++++++++ .../views/cmdb/batch/modules/UploadResult.vue | 95 +++++++++++++++ 5 files changed, 453 insertions(+) create mode 100644 ui/src/views/cmdb/batch/index.vue create mode 100644 ui/src/views/cmdb/batch/modules/CiTable.vue create mode 100644 ui/src/views/cmdb/batch/modules/CiTypeChoice.vue create mode 100644 ui/src/views/cmdb/batch/modules/UploadFileForm.vue create mode 100644 ui/src/views/cmdb/batch/modules/UploadResult.vue diff --git a/ui/src/views/cmdb/batch/index.vue b/ui/src/views/cmdb/batch/index.vue new file mode 100644 index 0000000..af44731 --- /dev/null +++ b/ui/src/views/cmdb/batch/index.vue @@ -0,0 +1,85 @@ + + + diff --git a/ui/src/views/cmdb/batch/modules/CiTable.vue b/ui/src/views/cmdb/batch/modules/CiTable.vue new file mode 100644 index 0000000..689a879 --- /dev/null +++ b/ui/src/views/cmdb/batch/modules/CiTable.vue @@ -0,0 +1,99 @@ + + + + diff --git a/ui/src/views/cmdb/batch/modules/CiTypeChoice.vue b/ui/src/views/cmdb/batch/modules/CiTypeChoice.vue new file mode 100644 index 0000000..7af6c7b --- /dev/null +++ b/ui/src/views/cmdb/batch/modules/CiTypeChoice.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/ui/src/views/cmdb/batch/modules/UploadFileForm.vue b/ui/src/views/cmdb/batch/modules/UploadFileForm.vue new file mode 100644 index 0000000..e140c6c --- /dev/null +++ b/ui/src/views/cmdb/batch/modules/UploadFileForm.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/ui/src/views/cmdb/batch/modules/UploadResult.vue b/ui/src/views/cmdb/batch/modules/UploadResult.vue new file mode 100644 index 0000000..64df7e0 --- /dev/null +++ b/ui/src/views/cmdb/batch/modules/UploadResult.vue @@ -0,0 +1,95 @@ + + + + From 0fde1d699d495887a4862850ec2624d6c5778b32 Mon Sep 17 00:00:00 2001 From: pycook Date: Sat, 31 Aug 2019 10:09:08 +0800 Subject: [PATCH 034/159] invalid username or password -> 403 --- api/views/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/views/account.py b/api/views/account.py index 4b1d9dc..f6d7dbc 100644 --- a/api/views/account.py +++ b/api/views/account.py @@ -25,7 +25,7 @@ class LoginView(APIView): password = request.values.get("password") user, authenticated = User.query.authenticate(username, password) if not authenticated: - return abort(401, "invalid username or password") + return abort(403, "invalid username or password") login_user(user) From 620c5bb5eb52b561a74c28c694eb5b3e9a328845 Mon Sep 17 00:00:00 2001 From: pycook Date: Thu, 10 Oct 2019 21:23:11 +0800 Subject: [PATCH 035/159] ci search return unique key --- api/lib/cmdb/ci.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/api/lib/cmdb/ci.py b/api/lib/cmdb/ci.py index e7f90c5..74c5619 100644 --- a/api/lib/cmdb/ci.py +++ b/api/lib/cmdb/ci.py @@ -34,6 +34,8 @@ from api.models.cmdb import CITypeAttribute from api.tasks.cmdb import ci_cache from api.tasks.cmdb import ci_delete +__author__ = 'pycook' + class CIManager(object): """ manage CI interface @@ -104,8 +106,12 @@ class CIManager(object): res["ci_type"] = ci_type.name fields = CITypeAttributeManager.get_attr_names_by_type_id(ci.type_id) if not fields else fields - - _res = AttributeValueManager().get_attr_values(fields, ci_id, ret_key=ret_key, use_master=use_master) + unique_key = AttributeCache.get(ci_type.unique_id) + _res = AttributeValueManager().get_attr_values(fields, + ci_id, + ret_key=ret_key, + unique_key=unique_key, + use_master=use_master) res.update(_res) res['_type'] = ci_type.id @@ -164,9 +170,9 @@ class CIManager(object): unique_key = AttributeCache.get(ci_type.unique_id) or abort(400, 'illegality unique attribute') unique_value = ci_dict.get(unique_key.name) or \ - ci_dict.get(unique_key.alias) or \ - ci_dict.get(unique_key.id) or \ - abort(400, '{0} missing'.format(unique_key.name)) + ci_dict.get(unique_key.alias) or \ + ci_dict.get(unique_key.id) or \ + abort(400, '{0} missing'.format(unique_key.name)) existed = cls.ci_is_exist(unique_key, unique_value) if existed is not None: From d54b404eb69ee5e508784a192927fc6f7472dc22 Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 16 Oct 2019 08:29:47 +0800 Subject: [PATCH 036/159] add docs --- README.md | 2 +- cmdb_api.md => docs/cmdb_api.md | 0 cmdb_query_api.md => docs/cmdb_query_api.md | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename cmdb_api.md => docs/cmdb_api.md (100%) rename cmdb_query_api.md => docs/cmdb_query_api.md (100%) diff --git a/README.md b/README.md index 11ce10a..5eb63bd 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@
-[![License](https://img.shields.io/badge/License-mit-brightgreen)](https://github.com/pycook/cmdb/blob/master/LICENSE) +[![License](https://img.shields.io/badge/License-MIT-brightgreen)](https://github.com/pycook/cmdb/blob/master/LICENSE) [![UI](https://img.shields.io/badge/UI-Ant%20Design%20Pro%20Vue-brightgreen)](https://github.com/sendya/ant-design-pro-vue) [![API](https://img.shields.io/badge/API-Flask-brightgreen)](https://github.com/pallets/flask) diff --git a/cmdb_api.md b/docs/cmdb_api.md similarity index 100% rename from cmdb_api.md rename to docs/cmdb_api.md diff --git a/cmdb_query_api.md b/docs/cmdb_query_api.md similarity index 100% rename from cmdb_query_api.md rename to docs/cmdb_query_api.md From a0fcbd220e6ebdcfe9fa0233a277b9dcf2e702d8 Mon Sep 17 00:00:00 2001 From: pycook Date: Mon, 21 Oct 2019 21:53:46 +0800 Subject: [PATCH 037/159] attributes paginate and fix update value --- api/lib/cmdb/attribute.py | 29 +++++--- api/lib/cmdb/ci.py | 2 - api/lib/cmdb/search.py | 16 +++-- api/lib/cmdb/value.py | 15 ++++- api/views/cmdb/attribute.py | 18 +++-- ui/src/views/cmdb/attributes/index.vue | 66 ++++++++++++------- .../cmdb/attributes/module/attributeForm.vue | 1 - 7 files changed, 98 insertions(+), 49 deletions(-) diff --git a/api/lib/cmdb/attribute.py b/api/lib/cmdb/attribute.py index f36de13..1d2fe3f 100644 --- a/api/lib/cmdb/attribute.py +++ b/api/lib/cmdb/attribute.py @@ -38,17 +38,30 @@ class AttributeManager(object): db.session.add(table) db.session.flush() - def get_attributes(self, name=None): + @classmethod + def search_attributes(cls, name=None, alias=None, page=1, page_size=None): """ :param name: + :param alias: + :param page: + :param page_size: :return: attribute, if name is None, then return all attributes """ - attrs = Attribute.get_by_like(name=name) if name is not None else Attribute.get_by() + if name is not None: + attrs = Attribute.get_by_like(name=name) + elif alias is not None: + attrs = Attribute.get_by_like(alias=alias) + else: + attrs = Attribute.get_by() + + numfound = len(attrs) + attrs = attrs[(page - 1) * page_size:][:page_size] res = list() for attr in attrs: - attr["is_choice"] and attr.update(dict(choice_value=self.get_choice_values(attr["id"], attr["value_type"]))) + attr["is_choice"] and attr.update(dict(choice_value=cls.get_choice_values(attr["id"], attr["value_type"]))) res.append(attr) - return res + + return numfound, res def get_attribute_by_name(self, name): attr = Attribute.get_by(name=name, first=True) @@ -112,19 +125,19 @@ class AttributeManager(object): is_choice = True if choice_value else False attr.update(flush=True, **kwargs) - + if is_choice: self._add_choice_values(attr.id, attr.value_type, choice_value) - + try: db.session.commit() except Exception as e: db.session.rollback() current_app.logger.error("update attribute error, {0}".format(str(e))) return abort(400, "update attribute <{0}> failed".format(_id)) - + AttributeCache.clean(attr) - + return attr.id @staticmethod diff --git a/api/lib/cmdb/ci.py b/api/lib/cmdb/ci.py index 74c5619..e62e675 100644 --- a/api/lib/cmdb/ci.py +++ b/api/lib/cmdb/ci.py @@ -34,8 +34,6 @@ from api.models.cmdb import CITypeAttribute from api.tasks.cmdb import ci_cache from api.tasks.cmdb import ci_delete -__author__ = 'pycook' - class CIManager(object): """ manage CI interface diff --git a/api/lib/cmdb/search.py b/api/lib/cmdb/search.py index 95de15d..df46d9f 100644 --- a/api/lib/cmdb/search.py +++ b/api/lib/cmdb/search.py @@ -1,6 +1,8 @@ # -*- coding:utf-8 -*- +from __future__ import unicode_literals + import time from flask import current_app @@ -39,7 +41,7 @@ class Search(object): self.query_sql = "" self.type_id_list = [] self.only_type_query = False - + @staticmethod def _operator_proc(key): operator = "&" @@ -127,7 +129,7 @@ class Search(object): if self.only_type_query: return ret_sql.format(query_sql, "ORDER BY B.ci_id {1} LIMIT {0:d}, {2};".format( - (self.page - 1) * self.count, sort_type, self.count)) + (self.page - 1) * self.count, sort_type, self.count)) elif self.type_id_list: self.query_sql = "SELECT B.ci_id FROM ({0}) AS B {1}".format( @@ -170,13 +172,13 @@ class Search(object): elif self.type_id_list: self.query_sql = """SELECT C.ci_id FROM ({0}) AS C - INNER JOIN cis on c_cis.id=C.ci_id - WHERE cis.type_id in ({1})""".format(new_table, ",".join(self.type_id_list)) + INNER JOIN c_cis on c_cis.id=C.ci_id + WHERE c_cis.type_id in ({1})""".format(new_table, ",".join(self.type_id_list)) return """SELECT SQL_CALC_FOUND_ROWS DISTINCT C.ci_id, C.value FROM ({0}) AS C - INNER JOIN cis on c_cis.id=C.ci_id - WHERE cis.type_id in ({4}) + INNER JOIN c_cis on c_cis.id=C.ci_id + WHERE c_cis.type_id in ({4}) ORDER BY C.value {2} LIMIT {1:d}, {3};""".format(new_table, (self.page - 1) * self.count, @@ -299,7 +301,7 @@ class Search(object): self.query_sql = query_sql current_app.logger.debug(query_sql) numfound, res = self._execute_sql(query_sql) - current_app.logger.info("query ci ids is: {0}".format(time.time() - s)) + current_app.logger.debug("query ci ids is: {0}".format(time.time() - s)) return numfound, [_res[0] for _res in res] return 0, [] diff --git a/api/lib/cmdb/value.py b/api/lib/cmdb/value.py index 951b29e..e4ef9b3 100644 --- a/api/lib/cmdb/value.py +++ b/api/lib/cmdb/value.py @@ -14,6 +14,7 @@ from api.lib.cmdb.const import TableMap from api.lib.cmdb.const import ExistPolicy from api.lib.cmdb.const import OperateType from api.lib.cmdb.history import AttributeHistoryManger +from api.models.cmdb import Attribute class AttributeValueManager(object): @@ -47,6 +48,7 @@ class AttributeValueManager(object): attr = self._get_attr(field) if not attr: continue + value_table = TableMap(attr_name=attr.name).table rs = value_table.get_by(ci_id=ci_id, attr_id=attr.id, @@ -130,9 +132,16 @@ class AttributeValueManager(object): for v in value_list: v = self._validate(attr, v, value_table, ci_id) + if not v and attr.value_type != Attribute.TEXT: + v = None + if operate_type == OperateType.ADD: - value_table.create(ci_id=ci_id, attr_id=attr.id, value=v) - self._write_change(ci_id, attr.id, operate_type, None, v) + if v is not None: + value_table.create(ci_id=ci_id, attr_id=attr.id, value=v) + self._write_change(ci_id, attr.id, operate_type, None, v) elif existed_attr.value != v: - existed_attr.update(value=v) + if v is not None: + existed_attr.update(value=v) + else: + existed_attr.delete() self._write_change(ci_id, attr.id, operate_type, existed_value, v) diff --git a/api/views/cmdb/attribute.py b/api/views/cmdb/attribute.py index 0ce947b..b09e3df 100644 --- a/api/views/cmdb/attribute.py +++ b/api/views/cmdb/attribute.py @@ -11,16 +11,26 @@ from api.lib.cmdb.const import RoleEnum from api.lib.cmdb.attribute import AttributeManager from api.lib.decorator import args_required from api.lib.utils import handle_arg_list +from api.lib.utils import get_page +from api.lib.utils import get_page_size + class AttributeSearchView(APIView): url_prefix = ("/attributes/s", "/attributes/search") def get(self): - q = request.values.get("q") - attrs = AttributeManager().get_attributes(name=q) - count = len(attrs) - return self.jsonify(numfound=count, attributes=attrs) + name = request.values.get("name") + alias = request.values.get("alias") + page = get_page(request.values.get("page", 1)) + page_size = get_page_size(request.values.get("page_size")) + numfound, res = AttributeManager.search_attributes(name=name, alias=alias, page=page, page_size=page_size) + + return self.jsonify(page=page, + page_size=page_size, + numfound=numfound, + total=len(res), + attributes=res) class AttributeView(APIView): diff --git a/ui/src/views/cmdb/attributes/index.vue b/ui/src/views/cmdb/attributes/index.vue index b3d97fb..9fac323 100644 --- a/ui/src/views/cmdb/attributes/index.vue +++ b/ui/src/views/cmdb/attributes/index.vue @@ -12,7 +12,9 @@ :rowKey="record=>record.id" :rowSelection="options.rowSelection" :scroll="scroll" - :showPagination="showPagination" + :pagination="{ showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条记录`, pageSizeOptions: pageSizeOptions}" + showPagination="auto" + :pageSize="25" ref="table" size="middle" @@ -20,7 +22,7 @@
Search + >搜索 Reset + >重置
@@ -69,7 +71,16 @@ @@ -93,7 +104,7 @@ export default { }, data () { return { - scroll: { x: 1400, y: 500 }, + scroll: { x: 1000, y: 500 }, btnName: '新增属性', CITypeName: this.$route.params.CITypeName, @@ -107,11 +118,8 @@ export default { transferTargetKeys: [], transferSelectedKeys: [], originTargetKeys: [], + pageSizeOptions: ['10', '25', '50', '100'], - pagination: { - defaultPageSize: 20 - }, - showPagination: false, columnSearchText: { alias: '', name: '' @@ -121,7 +129,7 @@ export default { title: '名称', dataIndex: 'alias', sorter: false, - width: 200, + width: 250, scopedSlots: { customRender: 'aliasSearchRender', filterDropdown: 'filterDropdown', @@ -140,7 +148,7 @@ export default { title: '英文名', dataIndex: 'name', sorter: false, - width: 200, + width: 250, scopedSlots: { customRender: 'nameSearchRender', filterDropdown: 'filterDropdown', @@ -159,7 +167,7 @@ export default { title: '类型', dataIndex: 'value_type', sorter: false, - width: 100, + width: 80, scopedSlots: { customRender: 'value_type' }, customRender: (text) => valueTypeMap[text] @@ -167,7 +175,7 @@ export default { { title: '唯一', dataIndex: 'is_unique', - width: 80, + width: 50, sorter: false, scopedSlots: { customRender: 'is_check' } @@ -176,7 +184,7 @@ export default { title: '索引', dataIndex: 'is_index', sorter: false, - width: 80, + width: 50, scopedSlots: { customRender: 'is_check' } }, @@ -184,7 +192,7 @@ export default { title: '排序', dataIndex: 'is_sortable', sorter: false, - width: 80, + width: 50, scopedSlots: { customRender: 'is_check' } }, @@ -192,7 +200,7 @@ export default { title: '链接', dataIndex: 'is_link', sorter: false, - width: 80, + width: 50, scopedSlots: { customRender: 'is_check' } }, @@ -200,7 +208,7 @@ export default { title: '密码', dataIndex: 'is_password', sorter: false, - width: 100, + width: 50, scopedSlots: { customRender: 'is_check' } }, @@ -221,15 +229,22 @@ export default { } ], loadData: parameter => { + parameter['page_size'] = parameter['pageSize'] + parameter['page'] = parameter['pageNo'] + Object.assign(parameter, this.queryParam) console.log('loadData.parameter', parameter) - return searchAttributes() + return searchAttributes(parameter) .then(res => { - this.allAttributes = res.attributes - return { - data: res.attributes + res.pageNo = res.page + res.pageSize = res.total + res.totalCount = res.numfound + res.totalPage = Math.ceil(res.numfound / parameter.pageSize) + res.data = res.attributes - } + console.log('loadData.res', res) + this.allAttributes = res.attributes + return res }) }, @@ -285,17 +300,20 @@ export default { this.getAttributes() this.setScrollY() }, + inject: ['reload'], + methods: { handleSearch (selectedKeys, confirm, column) { confirm() this.columnSearchText[column.dataIndex] = selectedKeys[0] + this.queryParam[column.dataIndex] = selectedKeys[0] }, handleReset (clearFilters, column) { clearFilters() this.columnSearchText[column.dataIndex] = '' + this.queryParam[column.dataIndex] = '' }, - getAttributes () { searchAttributes().then(res => { this.allAttributes = res.attributes diff --git a/ui/src/views/cmdb/attributes/module/attributeForm.vue b/ui/src/views/cmdb/attributes/module/attributeForm.vue index 9959925..7c41f40 100644 --- a/ui/src/views/cmdb/attributes/module/attributeForm.vue +++ b/ui/src/views/cmdb/attributes/module/attributeForm.vue @@ -255,7 +255,6 @@ export default { e.preventDefault() this.form.validateFields((err, values) => { if (!err) { - // eslint-disable-next-line no-console console.log('Received values of form: ', values) if (values.choice_value) { values.choice_value = values.choice_value.split('\n') From 57541ab4860b581270503c1a1034001751033793 Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 18 Oct 2019 14:43:56 +0800 Subject: [PATCH 038/159] Update README.md create tables fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5eb63bd..a0c5001 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ cp api/settings.py.example api/settings.py - 后端: ```pipenv run pipenv install``` - 前端: ```cd ui && yarn install && cd ..``` -- 创建数据库表 ```flask run flask db-setup``` +- 创建数据库表 ```pipenv run flask db-setup``` - 启动服务 - 后端: ```pipenv run flask run``` From 9105f92c827bebe06f57598496654392e730fe35 Mon Sep 17 00:00:00 2001 From: pycook Date: Mon, 21 Oct 2019 21:55:07 +0800 Subject: [PATCH 039/159] update README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a0c5001..473d187 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,8 @@ Overview 安装 ---- +- 启动mysql服务, redis服务 + - 创建数据库cmdb - 拉取代码 From 0a36330852c1613dea1fa25c3c7eb2274a23e338 Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 23 Oct 2019 10:43:27 +0800 Subject: [PATCH 040/159] fix attributes paginate --- api/models/account.py | 12 ++++----- ui/src/views/cmdb/attributes/index.vue | 4 +-- ui/src/views/cmdb/ci_type/attributesTable.vue | 18 ++++++++++--- ui/src/views/cmdb/ci_type/list.vue | 27 ++++++++++++++++--- 4 files changed, 45 insertions(+), 16 deletions(-) diff --git a/api/models/account.py b/api/models/account.py index 807476e..15bb04c 100644 --- a/api/models/account.py +++ b/api/models/account.py @@ -14,6 +14,7 @@ from api.lib.database import CRUDModel class UserQuery(BaseQuery): + def authenticate(self, login, password): user = self.filter(db.or_(User.username == login, User.email == login)).first() @@ -28,8 +29,8 @@ class UserQuery(BaseQuery): user = self.filter(User.key == key).filter(User.block == 0).first() if not user: return None, False - if user and hashlib.sha1('%s%s%s' % ( - path, user.secret, "".join(args))).hexdigest() == secret: + if user and hashlib.sha1('{0}{1}{2}'.format( + path, user.secret, "".join(args)).encode("utf-8")).hexdigest() == secret: authenticated = True else: authenticated = False @@ -79,9 +80,6 @@ class User(CRUDModel): wx_id = db.Column(db.String(32)) avatar = db.Column(db.String(128)) - def __init__(self, *args, **kwargs): - super(User, self).__init__(*args, **kwargs) - def __str__(self): return self.username @@ -99,7 +97,7 @@ class User(CRUDModel): return self._password def _set_password(self, password): - self._password = hashlib.md5(password).hexdigest() + self._password = hashlib.md5(password.encode('utf-8')).hexdigest() password = db.synonym("_password", descriptor=property(_get_password, @@ -176,7 +174,7 @@ class RoleCache(object): @classmethod def get(cls, rid): role = None - if isinstance(rid, (int, long)): + if isinstance(rid, six.integer_types): role = cache.get("Role::rid::%s" % rid) if not role: role = db.session.query(Role).filter(Role.rid == rid).first() diff --git a/ui/src/views/cmdb/attributes/index.vue b/ui/src/views/cmdb/attributes/index.vue index 9fac323..ce00592 100644 --- a/ui/src/views/cmdb/attributes/index.vue +++ b/ui/src/views/cmdb/attributes/index.vue @@ -135,7 +135,7 @@ export default { filterDropdown: 'filterDropdown', filterIcon: 'filterIcon' }, - onFilter: (value, record) => record.alias.toLowerCase().includes(value.toLowerCase()), + onFilter: (value, record) => record.alias && record.alias.toLowerCase().includes(value.toLowerCase()), onFilterDropdownVisibleChange: (visible) => { if (visible) { setTimeout(() => { @@ -154,7 +154,7 @@ export default { filterDropdown: 'filterDropdown', filterIcon: 'filterIcon' }, - onFilter: (value, record) => record.name.toLowerCase().includes(value.toLowerCase()), + onFilter: (value, record) => record.name && record.name.toLowerCase().includes(value.toLowerCase()), onFilterDropdownVisibleChange: (visible) => { if (visible) { setTimeout(() => { diff --git a/ui/src/views/cmdb/ci_type/attributesTable.vue b/ui/src/views/cmdb/ci_type/attributesTable.vue index 22adaf3..eb58508 100644 --- a/ui/src/views/cmdb/ci_type/attributesTable.vue +++ b/ui/src/views/cmdb/ci_type/attributesTable.vue @@ -16,6 +16,7 @@ :showPagination="showPagination" ref="table" size="middle" + >
编辑 - 删除 + + + 删除 + @@ -84,7 +93,7 @@ placement="right" width="30%" > - + + + +
{{ item.alias || item.name }}
@@ -89,9 +92,13 @@ > {{ item.alias || item.name }} @@ -130,7 +137,7 @@ + + diff --git a/ui/src/views/cmdb/acl/roles.vue b/ui/src/views/cmdb/acl/roles.vue new file mode 100644 index 0000000..6d9c248 --- /dev/null +++ b/ui/src/views/cmdb/acl/roles.vue @@ -0,0 +1,10 @@ + + + + + diff --git a/ui/src/views/cmdb/acl/users.vue b/ui/src/views/cmdb/acl/users.vue new file mode 100644 index 0000000..6d9c248 --- /dev/null +++ b/ui/src/views/cmdb/acl/users.vue @@ -0,0 +1,10 @@ + + + + + From e28048ac4fa1e90f538ca586efaa89caaedb979d Mon Sep 17 00:00:00 2001 From: qiqi Date: Thu, 14 Nov 2019 20:55:48 +0800 Subject: [PATCH 080/159] =?UTF-8?q?[=E6=9B=B4=E6=96=B0]=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9EQ=E7=BE=A4=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++++ statics/imgs/qr_code.jpg | Bin 0 -> 51836 bytes 2 files changed, 5 insertions(+) create mode 100644 statics/imgs/qr_code.jpg diff --git a/README.md b/README.md index 6a250fc..7f8e780 100644 --- a/README.md +++ b/README.md @@ -86,3 +86,8 @@ cp api/settings.py.example api/settings.py - 启动API: ```make api``` - 启动UI: ```make ui``` - 启动worker: ```make worker``` + + + +_**欢迎加入CMDB运维开发QQ群(336164978),本群主旨在于开发出足够任何企业、个人通用的CMDB。随手留一个CMDB,让工作足够简单、有一个好的开端。再次欢迎大家进群探讨!**_ +![image](statics/imgs/qr_code.jpg) \ No newline at end of file diff --git a/statics/imgs/qr_code.jpg b/statics/imgs/qr_code.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4b1d10914ce3f4d5eca32e672d0e261da973cda GIT binary patch literal 51836 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 literal 0 HcmV?d00001 From 59f8dea1b14e9ed8b87edba77297c8587068e85e Mon Sep 17 00:00:00 2001 From: qiqi Date: Thu, 14 Nov 2019 21:00:24 +0800 Subject: [PATCH 081/159] =?UTF-8?q?[=E6=9B=B4=E6=96=B0]=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=AF=B4=E6=98=8E=E6=96=87=E4=BB=B6=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7f8e780..b1ad77a 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,6 @@ cp api/settings.py.example api/settings.py - 启动worker: ```make worker``` - +---- _**欢迎加入CMDB运维开发QQ群(336164978),本群主旨在于开发出足够任何企业、个人通用的CMDB。随手留一个CMDB,让工作足够简单、有一个好的开端。再次欢迎大家进群探讨!**_ -![image](statics/imgs/qr_code.jpg) \ No newline at end of file +![QQ群](statics/imgs/qr_code.jpg) \ No newline at end of file From 163d84f69e6bd43832450149bc546aa3b8b42ce9 Mon Sep 17 00:00:00 2001 From: qiqi Date: Thu, 14 Nov 2019 21:48:36 +0800 Subject: [PATCH 082/159] =?UTF-8?q?[=E6=9B=B4=E6=96=B0]=20=E6=9B=B4?= =?UTF-8?q?=E6=8D=A2=E5=9B=BE=E7=89=87=E4=BD=8D=E7=BD=AE=E3=80=81=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- statics/imgs/qr_code.jpg | Bin 51836 -> 0 bytes ui/public/qr_code.jpg | Bin 0 -> 10568 bytes 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 statics/imgs/qr_code.jpg create mode 100644 ui/public/qr_code.jpg diff --git a/README.md b/README.md index b1ad77a..c7882ae 100644 --- a/README.md +++ b/README.md @@ -89,5 +89,5 @@ cp api/settings.py.example api/settings.py ---- -_**欢迎加入CMDB运维开发QQ群(336164978),本群主旨在于开发出足够任何企业、个人通用的CMDB。随手留一个CMDB,让工作足够简单、有一个好的开端。再次欢迎大家进群探讨!**_ -![QQ群](statics/imgs/qr_code.jpg) \ No newline at end of file +_**欢迎加入CMDB运维开发QQ群(336164978)**_ +![QQ群](ui/public/qr_code.jpg) \ No newline at end of file diff --git a/statics/imgs/qr_code.jpg b/statics/imgs/qr_code.jpg deleted file mode 100644 index e4b1d10914ce3f4d5eca32e672d0e261da973cda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51836 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 diff --git a/ui/public/qr_code.jpg b/ui/public/qr_code.jpg new file mode 100644 index 0000000000000000000000000000000000000000..742cdc4888a588a9c7fdcf931202ec530d89e3d1 GIT binary patch literal 10568 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 literal 0 HcmV?d00001 From daec5286bb45d0b7a944e3e1456216d823f6e214 Mon Sep 17 00:00:00 2001 From: qiqi Date: Thu, 14 Nov 2019 21:51:58 +0800 Subject: [PATCH 083/159] =?UTF-8?q?[=E6=9B=B4=E6=96=B0]=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c7882ae..e0e475f 100644 --- a/README.md +++ b/README.md @@ -90,4 +90,5 @@ cp api/settings.py.example api/settings.py ---- _**欢迎加入CMDB运维开发QQ群(336164978)**_ + ![QQ群](ui/public/qr_code.jpg) \ No newline at end of file From e437996df6fdb9ceb381fbdc95f971596070446e Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 15 Nov 2019 16:54:56 +0800 Subject: [PATCH 084/159] update acl --- README.md | 3 +++ api/lib/database.py | 6 +++--- api/lib/perm/acl/user.py | 25 +++++++++++++++++++++++-- api/models/acl.py | 12 ++++++++---- api/views/acl/user.py | 22 ++++++++++++++++++++-- 5 files changed, 57 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e0e475f..5a168e5 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,9 @@ - username: admin - password: admin +> **重要提示**: `master` 分支在开发过程中可能处于 *不稳定的状态* 。 +请通过[releases](https://github.com/pycook/cmdb/releases)获取 + Overview ---- ![基础资源视图](https://raw.githubusercontent.com/pycook/cmdb/master/ui/public/cmdb01.jpeg) diff --git a/api/lib/database.py b/api/lib/database.py index 82c6c62..7b50d38 100644 --- a/api/lib/database.py +++ b/api/lib/database.py @@ -10,9 +10,9 @@ from api.lib.exception import CommitException class FormatMixin(object): def to_dict(self): - return dict([(k.name, - getattr(self, k.name) if not isinstance(getattr(self, k.name), datetime.datetime) else getattr( - self, k.name).strftime('%Y-%m-%d %H:%M:%S')) for k in getattr(self, "__table__").columns]) + return dict([(k.name, isinstance(getattr(self, k.name), datetime.datetime) and + getattr(self, k.name).strftime('%Y-%m-%d %H:%M:%S')) or + getattr(self, k.name) for k in getattr(self, "__table__").columns]) @classmethod def get_columns(cls): diff --git a/api/lib/perm/acl/user.py b/api/lib/perm/acl/user.py index 5832a47..178502c 100644 --- a/api/lib/perm/acl/user.py +++ b/api/lib/perm/acl/user.py @@ -1,7 +1,12 @@ # -*- coding:utf-8 -*- +import uuid +import string +import random + from flask import abort +from flask import g from api.extensions import db from api.lib.perm.acl.cache import UserCache @@ -20,12 +25,21 @@ class UserCRUD(object): return numfound, query.offset((page - 1) * page_size).limit(page_size) @staticmethod - def add(**kwargs): + def _gen_key_secret(): + key = uuid.uuid4().hex + secret = ''.join(random.sample(string.ascii_letters + string.digits + '~!@#$%^&*?', 32)) + + return key, secret + + @classmethod + def add(cls, **kwargs): existed = User.get_by(username=kwargs['username'], email=kwargs['email']) existed and abort(400, "User <{0}> is already existed".format(kwargs['username'])) - kwargs['nickname'] = kwargs['username'] if not kwargs.get('nickname') else kwargs['nickname'] + kwargs['nickname'] = kwargs.get('nickname') or kwargs['username'] kwargs['block'] = 0 + kwargs['key'], kwargs['secret'] = cls._gen_key_secret() + return User.create(**kwargs) @staticmethod @@ -36,6 +50,13 @@ class UserCRUD(object): return user.update(**kwargs) + @classmethod + def reset_key_secret(cls): + key, secret = cls._gen_key_secret() + g.user.update(key=key, secret=secret) + + return key, secret + @classmethod def delete(cls, uid): user = User.get_by_id(uid) or abort(404, "User <{0}> does not exist".format(uid)) diff --git a/api/models/acl.py b/api/models/acl.py index d1b3056..b6e43e0 100644 --- a/api/models/acl.py +++ b/api/models/acl.py @@ -11,6 +11,7 @@ from flask_sqlalchemy import BaseQuery from api.extensions import db from api.lib.database import CRUDModel from api.lib.database import Model +from api.lib.database import SoftDeleteMixin class App(Model): @@ -34,6 +35,7 @@ class UserQuery(BaseQuery): authenticated = user.check_password(password) else: authenticated = False + return user, authenticated def authenticate_with_key(self, key, secret, args, path): @@ -45,6 +47,7 @@ class UserQuery(BaseQuery): authenticated = True else: authenticated = False + return user, authenticated def search(self, key): @@ -55,18 +58,21 @@ class UserQuery(BaseQuery): def get_by_username(self, username): user = self.filter(User.username == username).first() + return user def get_by_nickname(self, nickname): user = self.filter(User.nickname == nickname).first() + return user def get(self, uid): user = self.filter(User.uid == uid).first() + return copy.deepcopy(user) -class User(CRUDModel): +class User(CRUDModel, SoftDeleteMixin): __tablename__ = 'users' __bind_key__ = "user" query_class = UserQuery @@ -107,9 +113,7 @@ class User(CRUDModel): def _set_password(self, password): self._password = hashlib.md5(password.encode('utf-8')).hexdigest() - password = db.synonym("_password", - descriptor=property(_get_password, - _set_password)) + password = db.synonym("_password", descriptor=property(_get_password, _set_password)) def check_password(self, password): if self.password is None: diff --git a/api/views/acl/user.py b/api/views/acl/user.py index 9e0d576..e564535 100644 --- a/api/views/acl/user.py +++ b/api/views/acl/user.py @@ -6,8 +6,8 @@ from flask import session from flask_login import current_user from api.lib.decorator import args_required -from api.lib.perm.acl.user import UserCRUD from api.lib.perm.acl.role import RoleRelationCRUD +from api.lib.perm.acl.user import UserCRUD from api.lib.utils import get_page from api.lib.utils import get_page_size from api.resource import APIView @@ -36,11 +36,17 @@ class UserView(APIView): id2parents = RoleRelationCRUD.get_parents(uids=[i.uid for i in users]) + users = [i.to_dict() for i in users] + for u in users: + u.pop('password', None) + u.pop('key', None) + u.pop('secret', None) + return self.jsonify(numfound=numfound, page=page, page_size=page_size, id2parents=id2parents, - users=[i.to_dict() for i in users]) + users=users) @args_required('username') @args_required('email') @@ -58,3 +64,15 @@ class UserView(APIView): UserCRUD.delete(uid) return self.jsonify(uid=uid) + + +class UserResetKeySecretView(APIView): + url_prefix = "/users/reset_key_secret" + + def post(self): + key, secret = UserCRUD.reset_key_secret() + + return self.jsonify(key=key, secret=secret) + + def put(self): + return self.post() From dc9cb6dc5a684abe657af14f6f290c5df9f8de72 Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 15 Nov 2019 18:03:06 +0800 Subject: [PATCH 085/159] pep8 --- api/lib/database.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/api/lib/database.py b/api/lib/database.py index 7b50d38..cc43a56 100644 --- a/api/lib/database.py +++ b/api/lib/database.py @@ -10,9 +10,14 @@ from api.lib.exception import CommitException class FormatMixin(object): def to_dict(self): - return dict([(k.name, isinstance(getattr(self, k.name), datetime.datetime) and - getattr(self, k.name).strftime('%Y-%m-%d %H:%M:%S')) or - getattr(self, k.name) for k in getattr(self, "__table__").columns]) + res = dict() + for k in getattr(self, "__table__").columns: + if not isinstance(getattr(self, k.name), datetime.datetime): + res[k.name] = getattr(self, k.name) + else: + res[k.name] = getattr(self, k.name).strftime('%Y-%m-%d %H:%M:%S') + + return res @classmethod def get_columns(cls): From 7737469da1705495b6e3346033b6e86e36a5e474 Mon Sep 17 00:00:00 2001 From: qiqi Date: Sun, 17 Nov 2019 09:32:39 +0800 Subject: [PATCH 086/159] =?UTF-8?q?[=E6=9B=B4=E6=96=B0]=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/src/api/acl/user.js | 41 +++ ui/src/views/cmdb/acl/module/userForm.vue | 271 ++++++++++++++++ ui/src/views/cmdb/acl/users.vue | 365 +++++++++++++++++++++- 3 files changed, 674 insertions(+), 3 deletions(-) create mode 100644 ui/src/api/acl/user.js create mode 100644 ui/src/views/cmdb/acl/module/userForm.vue diff --git a/ui/src/api/acl/user.js b/ui/src/api/acl/user.js new file mode 100644 index 0000000..37e55c8 --- /dev/null +++ b/ui/src/api/acl/user.js @@ -0,0 +1,41 @@ +import { axios } from '@/utils/request' + +const urlPrefix = '/v0.1' + +export function currentUser () { + return axios({ + url: urlPrefix + `/users/info`, + method: 'GET' + }) +} + +export function searchUser (params) { + return axios({ + url: urlPrefix + `/users?${params}`, + method: 'GET' + }) +} + +export function addUser (params) { + return axios({ + url: urlPrefix + '/users', + method: 'POST', + data: params + }) +} + +export function updateUserById (id, params) { + return axios({ + url: urlPrefix + `/users/${id}`, + method: 'PUT', + data: params + }) +} + +export function deleteUserById (id) { + return axios({ + url: urlPrefix + `/users/${id}`, + method: 'DELETE' + }) +} + diff --git a/ui/src/views/cmdb/acl/module/userForm.vue b/ui/src/views/cmdb/acl/module/userForm.vue new file mode 100644 index 0000000..20bba40 --- /dev/null +++ b/ui/src/views/cmdb/acl/module/userForm.vue @@ -0,0 +1,271 @@ + + + + + diff --git a/ui/src/views/cmdb/acl/users.vue b/ui/src/views/cmdb/acl/users.vue index 6d9c248..5e50201 100644 --- a/ui/src/views/cmdb/acl/users.vue +++ b/ui/src/views/cmdb/acl/users.vue @@ -1,10 +1,369 @@ - From 712a102f53bb1e63738a46dc9c4d60cf01a872d7 Mon Sep 17 00:00:00 2001 From: kdyq007 Date: Sun, 17 Nov 2019 17:09:24 +0800 Subject: [PATCH 087/159] =?UTF-8?q?[=E6=9B=B4=E6=96=B0]=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90roles=E5=9F=BA=E6=9C=AC=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/models/acl.py | 2 +- ui/package.json | 9 +- ui/src/api/acl/app.js | 34 ++ ui/src/api/acl/resource.js | 34 ++ ui/src/api/acl/role.js | 34 ++ ui/src/api/acl/user.js | 8 +- ui/src/config/router.config.js | 6 +- ui/src/views/cmdb/acl/module/resourceForm.vue | 218 ++++++++++++ ui/src/views/cmdb/acl/module/roleForm.vue | 221 ++++++++++++ ui/src/views/cmdb/acl/module/userForm.vue | 3 +- ui/src/views/cmdb/acl/resources.vue | 333 +++++++++++++++++- ui/src/views/cmdb/acl/roles.vue | 333 +++++++++++++++++- ui/src/views/cmdb/acl/users.vue | 16 +- 13 files changed, 1223 insertions(+), 28 deletions(-) create mode 100644 ui/src/api/acl/app.js create mode 100644 ui/src/api/acl/resource.js create mode 100644 ui/src/api/acl/role.js create mode 100644 ui/src/views/cmdb/acl/module/resourceForm.vue create mode 100644 ui/src/views/cmdb/acl/module/roleForm.vue diff --git a/api/models/acl.py b/api/models/acl.py index d1b3056..79328f7 100644 --- a/api/models/acl.py +++ b/api/models/acl.py @@ -68,7 +68,7 @@ class UserQuery(BaseQuery): class User(CRUDModel): __tablename__ = 'users' - __bind_key__ = "user" + # __bind_key__ = "user" query_class = UserQuery uid = db.Column(db.Integer, primary_key=True, autoincrement=True) diff --git a/ui/package.json b/ui/package.json index 43220ed..0f71589 100644 --- a/ui/package.json +++ b/ui/package.json @@ -13,10 +13,14 @@ }, "dependencies": { "@antv/data-set": "^0.10.2", + "@handsontable-pro/vue": "^3.1.1", + "@handsontable/vue": "^4.1.1", "ant-design-vue": "^1.4.2", "axios": "^0.19.0", "core-js": "^3.1.2", "enquire.js": "^2.1.6", + "handsontable": "^7.2.2", + "handsontable-pro": "^6.2.3", "js-cookie": "^2.2.0", "json2csv": "^4.5.2", "lodash.get": "^4.4.2", @@ -37,10 +41,7 @@ "vuex": "^3.1.1", "wangeditor": "^3.1.1", "xlsx": "latest", - "@handsontable-pro/vue": "^3.1.1", - "@handsontable/vue": "^4.1.1", - "handsontable": "^7.2.2", - "handsontable-pro": "^6.2.3" + "yarn": "^1.19.1" }, "devDependencies": { "@ant-design/colors": "^3.2.1", diff --git a/ui/src/api/acl/app.js b/ui/src/api/acl/app.js new file mode 100644 index 0000000..c134f36 --- /dev/null +++ b/ui/src/api/acl/app.js @@ -0,0 +1,34 @@ +import { axios } from '@/utils/request' + +const urlPrefix = '/v1/acl' + +export function searchRole (params) { + return axios({ + url: urlPrefix + `/roles`, + method: 'GET', + params: params + }) +} + +export function addRole (params) { + return axios({ + url: urlPrefix + '/roles', + method: 'POST', + data: params + }) +} + +export function updateRoleById (id, params) { + return axios({ + url: urlPrefix + `/roles/${id}`, + method: 'PUT', + data: params + }) +} + +export function deleteRoleById (id) { + return axios({ + url: urlPrefix + `/roles/${id}`, + method: 'DELETE' + }) +} diff --git a/ui/src/api/acl/resource.js b/ui/src/api/acl/resource.js new file mode 100644 index 0000000..106562a --- /dev/null +++ b/ui/src/api/acl/resource.js @@ -0,0 +1,34 @@ +import { axios } from '@/utils/request' + +const urlPrefix = '/v1/acl' + +export function searchResource (params) { + return axios({ + url: urlPrefix + `/resources`, + method: 'GET', + params: params + }) +} + +export function addResource (params) { + return axios({ + url: urlPrefix + '/resources', + method: 'POST', + data: params + }) +} + +export function updateResourceById (id, params) { + return axios({ + url: urlPrefix + `/resources/${id}`, + method: 'PUT', + data: params + }) +} + +export function deleteResourceById (id) { + return axios({ + url: urlPrefix + `/resources/${id}`, + method: 'DELETE' + }) +} diff --git a/ui/src/api/acl/role.js b/ui/src/api/acl/role.js new file mode 100644 index 0000000..c134f36 --- /dev/null +++ b/ui/src/api/acl/role.js @@ -0,0 +1,34 @@ +import { axios } from '@/utils/request' + +const urlPrefix = '/v1/acl' + +export function searchRole (params) { + return axios({ + url: urlPrefix + `/roles`, + method: 'GET', + params: params + }) +} + +export function addRole (params) { + return axios({ + url: urlPrefix + '/roles', + method: 'POST', + data: params + }) +} + +export function updateRoleById (id, params) { + return axios({ + url: urlPrefix + `/roles/${id}`, + method: 'PUT', + data: params + }) +} + +export function deleteRoleById (id) { + return axios({ + url: urlPrefix + `/roles/${id}`, + method: 'DELETE' + }) +} diff --git a/ui/src/api/acl/user.js b/ui/src/api/acl/user.js index 37e55c8..f81a43f 100644 --- a/ui/src/api/acl/user.js +++ b/ui/src/api/acl/user.js @@ -1,6 +1,6 @@ import { axios } from '@/utils/request' -const urlPrefix = '/v0.1' +const urlPrefix = '/v1/acl' export function currentUser () { return axios({ @@ -11,8 +11,9 @@ export function currentUser () { export function searchUser (params) { return axios({ - url: urlPrefix + `/users?${params}`, - method: 'GET' + url: urlPrefix + `/users`, + method: 'GET', + data: params }) } @@ -38,4 +39,3 @@ export function deleteUserById (id) { method: 'DELETE' }) } - diff --git a/ui/src/config/router.config.js b/ui/src/config/router.config.js index ec48c6f..be7ab04 100644 --- a/ui/src/config/router.config.js +++ b/ui/src/config/router.config.js @@ -78,21 +78,21 @@ const cmdbRouter = [ name: 'acl_users', hideChildrenInMenu: true, component: () => import('@/views/cmdb/acl/users'), - meta: { title: 'Users', keepAlive: true } + meta: { title: '用户管理', keepAlive: true } }, { path: '/acl/roles', name: 'acl_roles', hideChildrenInMenu: true, component: () => import('@/views/cmdb/acl/roles'), - meta: { title: 'Roles', keepAlive: true } + meta: { title: '角色管理', keepAlive: true } }, { path: '/acl/resources', name: 'acl_resources', hideChildrenInMenu: true, component: () => import('@/views/cmdb/acl/resources'), - meta: { title: 'Resources', keepAlive: true } + meta: { title: '资源管理', keepAlive: true } } ] } diff --git a/ui/src/views/cmdb/acl/module/resourceForm.vue b/ui/src/views/cmdb/acl/module/resourceForm.vue new file mode 100644 index 0000000..556f666 --- /dev/null +++ b/ui/src/views/cmdb/acl/module/resourceForm.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/ui/src/views/cmdb/acl/module/roleForm.vue b/ui/src/views/cmdb/acl/module/roleForm.vue new file mode 100644 index 0000000..37917a9 --- /dev/null +++ b/ui/src/views/cmdb/acl/module/roleForm.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/ui/src/views/cmdb/acl/module/userForm.vue b/ui/src/views/cmdb/acl/module/userForm.vue index 20bba40..a76863f 100644 --- a/ui/src/views/cmdb/acl/module/userForm.vue +++ b/ui/src/views/cmdb/acl/module/userForm.vue @@ -129,10 +129,9 @@ export default { }, data () { return { - drawerTitle: '新增用户', drawerVisible: false, - formLayout: 'vertical', + formLayout: 'vertical' } }, diff --git a/ui/src/views/cmdb/acl/resources.vue b/ui/src/views/cmdb/acl/resources.vue index 6d9c248..c3eb9eb 100644 --- a/ui/src/views/cmdb/acl/resources.vue +++ b/ui/src/views/cmdb/acl/resources.vue @@ -1,10 +1,337 @@ - diff --git a/ui/src/views/cmdb/acl/roles.vue b/ui/src/views/cmdb/acl/roles.vue index 6d9c248..8968342 100644 --- a/ui/src/views/cmdb/acl/roles.vue +++ b/ui/src/views/cmdb/acl/roles.vue @@ -1,10 +1,337 @@ - diff --git a/ui/src/views/cmdb/acl/users.vue b/ui/src/views/cmdb/acl/users.vue index 5e50201..3fbedc6 100644 --- a/ui/src/views/cmdb/acl/users.vue +++ b/ui/src/views/cmdb/acl/users.vue @@ -43,9 +43,9 @@

-