├── CHANGELOG.md ├── CONTRIBUTING.md ├── CONTRIBUTORS.md ├── LICENSES ├── AGPL-3.0-or-later.txt ├── Apache-2.0.txt ├── CC-BY-3.0.txt ├── CC0-1.0.txt └── MIT.txt ├── MANIFEST.in ├── NEWS.md ├── README.md ├── SECURITY.md ├── contrib └── manager-apache.conf ├── intelmq_manager ├── __init__.py ├── build.py ├── manager-apache.conf ├── static │ ├── css │ │ ├── management.css │ │ ├── management.css.map │ │ ├── sb-admin-2.css │ │ ├── sb-admin-2.css.map │ │ ├── style.css │ │ └── style.css.map │ ├── images │ │ ├── 1140x319.gif │ │ ├── about.png │ │ ├── abouticon-20.png │ │ ├── abouticon-24.png │ │ ├── botnet.png │ │ ├── check.png │ │ ├── check.svg │ │ ├── config.png │ │ ├── logo.png │ │ ├── logo2.png │ │ ├── logo_no_margin_6.png │ │ ├── monitor.png │ │ ├── redrawicon-20.png │ │ ├── saveicon-128.png │ │ ├── saveicon-20.png │ │ ├── saveicon-24.png │ │ ├── trashicon-20.png │ │ └── waiting.gif │ ├── js │ │ ├── about.js │ │ ├── check.js │ │ ├── config.js │ │ ├── configs.js │ │ ├── defaults.js │ │ ├── intelmq-manager.js │ │ ├── management.js │ │ ├── monitor.js │ │ ├── network-configuration.js │ │ ├── positions.js │ │ ├── runtime.js │ │ ├── sb-admin-2.js │ │ └── static.js │ ├── less │ │ ├── management.less │ │ ├── sb-admin-2.less │ │ └── style.less │ └── plugins │ │ ├── bootstrap │ │ ├── bootstrap.css │ │ ├── bootstrap.js │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.js │ │ ├── dataTables │ │ ├── dataTables.bootstrap.css │ │ ├── dataTables.bootstrap.js │ │ └── jquery.dataTables.js │ │ ├── font-awesome-4.1.0 │ │ ├── css │ │ │ ├── font-awesome.css │ │ │ └── font-awesome.min.css │ │ ├── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ └── fontawesome-webfont.woff │ │ ├── less │ │ │ ├── bordered-pulled.less │ │ │ ├── core.less │ │ │ ├── fixed-width.less │ │ │ ├── font-awesome.less │ │ │ ├── icons.less │ │ │ ├── larger.less │ │ │ ├── list.less │ │ │ ├── mixins.less │ │ │ ├── path.less │ │ │ ├── rotated-flipped.less │ │ │ ├── spinning.less │ │ │ ├── stacked.less │ │ │ └── variables.less │ │ └── scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _core.scss │ │ │ ├── _fixed-width.scss │ │ │ ├── _icons.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _mixins.scss │ │ │ ├── _path.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _spinning.scss │ │ │ ├── _stacked.scss │ │ │ ├── _variables.scss │ │ │ └── font-awesome.scss │ │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ └── glyphicons-halflings-regular.woff │ │ ├── jquery-3.5.1.js │ │ ├── jquery-3.5.1.min.js │ │ ├── jquery-3.5.1.min.map │ │ ├── metisMenu │ │ ├── metisMenu.css │ │ ├── metisMenu.js │ │ ├── metisMenu.min.css │ │ └── metisMenu.min.js │ │ └── vis.js │ │ ├── img │ │ ├── graph │ │ │ ├── acceptDeleteIcon.png │ │ │ ├── addNodeIcon.png │ │ │ ├── backIcon.png │ │ │ ├── connectIcon.png │ │ │ ├── cross.png │ │ │ ├── cross2.png │ │ │ ├── deleteIcon.png │ │ │ ├── downArrow.png │ │ │ ├── editIcon.png │ │ │ ├── leftArrow.png │ │ │ ├── minus.png │ │ │ ├── plus.png │ │ │ ├── rightArrow.png │ │ │ ├── upArrow.png │ │ │ └── zoomExtends.png │ │ ├── network │ │ │ ├── acceptDeleteIcon.png │ │ │ ├── addNodeIcon.png │ │ │ ├── backIcon.png │ │ │ ├── connectIcon.png │ │ │ ├── cross.png │ │ │ ├── cross2.png │ │ │ ├── deleteIcon.png │ │ │ ├── downArrow.png │ │ │ ├── editIcon.png │ │ │ ├── leftArrow.png │ │ │ ├── minus.png │ │ │ ├── plus.png │ │ │ ├── rightArrow.png │ │ │ ├── upArrow.png │ │ │ └── zoomExtends.png │ │ └── timeline │ │ │ └── delete.png │ │ ├── vis-graph3d.min.js │ │ ├── vis-network.min.css │ │ ├── vis-network.min.js │ │ ├── vis-timeline-graph2d.min.css │ │ ├── vis-timeline-graph2d.min.js │ │ ├── vis.css │ │ ├── vis.js │ │ ├── vis.js.map │ │ ├── vis.map │ │ ├── vis.min.css │ │ └── vis.min.js ├── templates │ ├── about.mako │ ├── base.mako │ ├── check.mako │ ├── configs.mako │ ├── dynvar.mako │ ├── index.mako │ ├── management.mako │ └── monitor.mako └── version.py ├── pyproject.toml └── setup.py /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | # Contributing Hints 8 | 9 | ## CSS 10 | 11 | Please apply changes only to the LESS-files and convert them to CSS. 12 | 13 | ## Licenses 14 | 15 | If external components are added or updated, make sure the copyright notices are complete. Check the `debian/copyright` file, which maps files to licenses and the `LICENSES` directory where all licenses used by IntelMQ Manager must be stored. 16 | 17 | ## Code submissions and workflow 18 | 19 | Please see the developer guide of IntelMQ for a complete description and workflow: https://github.com/certtools/intelmq/blob/master/docs/Developers-Guide.md#code-submission-rules 20 | -------------------------------------------------------------------------------- /CONTRIBUTORS.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | ### Contributors 8 | 9 | We would like to thank the following contributors (sorted alphabetically): 10 | 11 | Aaron Kaplan 12 | Alexander J 13 | Arno Esterhammer 14 | Bernhard E. Reiter 15 | Bernhard Herzog 16 | Chema García 17 | Edvard Rejthar 18 | Filip Pokorny 19 | JesseBowling 20 | Mauro Silva 21 | Marcos Gonzalez 22 | Sascha Wilde 23 | Sebastian Wagner 24 | Tomás Lima 25 | Sybil Ehrensberger 26 | ondj 27 | sbilly 28 | 29 | ### Start contributing 30 | 31 | * [Find bugs](https://github.com/certtools/intelmq-manager/issues) 32 | * [Send requests](https://github.com/certtools/intelmq-manager/issues) 33 | * [Write documentation](https://github.com/certtools/intelmq-manager/tree/master/docs) 34 | -------------------------------------------------------------------------------- /LICENSES/Apache-2.0.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | 3 | Version 2.0, January 2004 4 | 5 | http://www.apache.org/licenses/ 6 | 7 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 8 | 9 | 1. Definitions. 10 | 11 | "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 16 | 17 | "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. 18 | 19 | "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. 20 | 21 | "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. 22 | 23 | "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). 24 | 25 | "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. 26 | 27 | "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." 28 | 29 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 30 | 31 | 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 32 | 33 | 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 34 | 35 | 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: 36 | 37 | You must give any other recipients of the Work or Derivative Works a copy of this License; and 38 | You must cause any modified files to carry prominent notices stating that You changed the files; and 39 | You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and 40 | If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. 41 | 42 | You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 43 | 44 | 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 45 | 46 | 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 47 | 48 | 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 49 | 50 | 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 51 | 52 | 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. 53 | -------------------------------------------------------------------------------- /LICENSES/CC0-1.0.txt: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | -------------------------------------------------------------------------------- /LICENSES/MIT.txt: -------------------------------------------------------------------------------- 1 | Valid-License-Identifier: MIT 2 | License-Text: 3 | 4 | MIT License 5 | 6 | Copyright (c) 7 | 8 | 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: 9 | 10 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 11 | 12 | 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. 13 | 14 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | # 3 | # SPDX-License-Identifier: CC0-1.0 4 | include CHANGELOG.md CONTRIBUTING.md CONTRIBUTORS.md 5 | include NEWS.md README.md SECURITY.md 6 | include LICENSES/* 7 | recursive-include contrib * 8 | graft intelmq_manager/templates/ 9 | graft intelmq_manager/static/ 10 | -------------------------------------------------------------------------------- /NEWS.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | NEWS 8 | ==== 9 | 10 | See the changelog for a full list of changes. 11 | 12 | 13 | 3.2.0 (2023-07-19) 14 | ------------------ 15 | 16 | Clear the browser cache for your IntelMQ instance (in Firefox: Ctrl+Shift+R). 17 | 18 | 19 | 3.0.1 (2021-09-02) 20 | ------------------ 21 | 22 | Clear the browser cache for your IntelMQ instance (in Firefox: Ctrl+Shift+R). 23 | 24 | 25 | 3.0.0 (2021-07-02) 26 | ------------------ 27 | 28 | Clear the browser cache for your IntelMQ instance (in Firefox: Ctrl+Shift+R). 29 | 30 | 31 | 2.3.1 (2021-03-25) 32 | ------------------ 33 | 34 | No changes are required by administrators. 35 | 36 | 37 | 2.3.0 (2021-03-04) 38 | ------------------ 39 | The IntelMQ Manager backend has been rewritten in Python and split off to the IntelMQ API. 40 | An installation of intelmq-api is now required to run the IntelMQ Manager. 41 | For deb/rpm-installations, you only need to upgrade the packages. Additional requirements are automatically pulled in. 42 | For manual installations, please follow the installation instructions: 43 | - for [intelmq-api](https://intelmq.readthedocs.io/en/maintenance/user/intelmq-api.html) 44 | - for [intelmq-manager](https://intelmq.readthedocs.io/en/maintenance/user/intelmq-manager.html) 45 | 46 | 47 | 2.2.1 (2020-07-30) 48 | ------------------ 49 | This IntelMQ Manager version requires IntelMQ >= 2.2.1. 50 | 51 | 2.2.0 (2020-06-23) 52 | ------------------ 53 | This IntelMQ Manager version requires IntelMQ >= 2.2.0. 54 | 55 | ### Paths 56 | The paths for configuration files are queried from the IntelMQ Core. 57 | Thus, the environment variables `INTELMQ_ROOT_DIR` and `INTELMQ_PATHS_NO_OPT`/`INTELMQ_PATHS_OPT` are now respected. 58 | 59 | 60 | 2.1.1 (2020-04-27) 61 | ------------------ 62 | 63 | ### Security 64 | * **Never ever run intelmq-manager on a public webserver without SSL and proper authentication**. 65 | * Bernhard Herzog (Intevation) discovered that the backend incorrectly handled messages given by user-input in the "send" functionality of the Inspect-tool of the Monitor component. An attacker with access to the IntelMQ Manager could possibly use this issue to execute arbitrary code with the privileges of the webserver (CVE-2020-11016). 66 | * Use IntelMQ Manager only from a browser that can only access internal, trusted sites. (Because CSRF development is under way, see [#111](github.com/certtools/intelmq/issues/111)). 67 | 68 | ### Configuration 69 | The environment variable name was corrected from `INTELMQ_MANGER_CONTROLLER_CMD` to `INTELMQ_MANGAER_CONTROLLER_CMD` you might need to adapt your configuration. 70 | The old name will be available until version 3.0. 71 | 72 | 73 | 2.1.0 (2019-10-15) 74 | ------------------ 75 | The environment variable name was corrected from `INTELMQ_MANGER_CONTROLER_CMD` to `INTELMQ_MANGER_CONTROLLER_CMD` you might need to adapt your configuration. 76 | 77 | 78 | 2.0.0 (2019-05-22) 79 | ------------------ 80 | 81 | No changes are required by administrators. 82 | 83 | 84 | 1.1.0 (2018-11-12) 85 | ------------------ 86 | 87 | No changes are required by administrators. 88 | 89 | 1.0.1 (2018-09-24) 90 | ------------------ 91 | 92 | No changes are required by administrators. 93 | 94 | 95 | 1.0.0 (2018-04-23) 96 | ------------------ 97 | 98 | No changes are required by administrators. 99 | 100 | 101 | 0.3.1 102 | ----- 103 | 104 | No changes are required by administrators. 105 | 106 | 107 | 0.3 108 | --- 109 | * The IntelMQ Manager is now capable of saving the positions of bots. 110 | You need to create the file `/opt/intelmq/etc/manager/positions.conf` and 111 | allow the webserver process to write to it, e.g.: 112 | ```bash 113 | mkdir /opt/intelmq/etc/manager/ 114 | touch /opt/intelmq/etc/manager/positions.conf 115 | chgrp www-data /opt/intelmq/etc/manager/positions.conf 116 | chmod g+w /opt/intelmq/etc/manager/positions.conf 117 | ``` 118 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | ![IntelMQ](https://github.com/certtools/intelmq/raw/develop/docs/static/images/Logo_Intel_MQ.svg) 8 | 9 | **IntelMQ Manager** is a graphical interface to manage configurations for the [IntelMQ](https://github.com/certtools/intelmq) framework. 10 | A IntelMQ configuration is a set of config files which describe which bots and processing steps should be run in which order. It is similar to describing the dataflow in [dataflow oriented](https://en.wikipedia.org/wiki/Dataflow_programming) languages. 11 | **IntelMQ Manager** is therefore an intuitive tool to allow non-programmers to specify the data flow in IntelMQ. 12 | 13 | ## Documentation 14 | 15 | The documentation for IntelMQ-Manager is part of the [IntelMQ documentation]([https://intelmq.readthedocs.io/en/latest/user/intelmq-manager.html](https://docs.intelmq.org/latest/user/manager/)). 16 | 17 | ## Licence 18 | 19 | This software (IntelMQ and its components) is licensed under these licenses: 20 | * Apache License 2.0 21 | * GNU Affero Public License version v3.0 22 | * MIT License 23 | 24 | See [LICENSES](LICENSES) for all license texts and [debian/copyright](debian/copyright) for a list of components and it's licenses. 25 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | IntelMQ Manager Security Notes 8 | ============================== 9 | 10 | Running IntelMQ Manager securely 11 | -------------------------------- 12 | 13 | Please read the installation documentation at [`docs/INSTALL.md`, section "Security considerations"](docs/INSTALL.md#security-considerations). 14 | 15 | Found a security issue? 16 | ----------------------- 17 | 18 | In case you find security-relevant bugs in IntelMQ, please contact team@cert.at. 19 | More information including the PGP key can be found on [CERT.at's website](https://www.cert.at/about/contact/contact_en.html). 20 | 21 | -------------------------------------------------------------------------------- /contrib/manager-apache.conf: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | # 3 | # SPDX-License-Identifier: CC0-1.0 4 | 5 | Alias /intelmq-manager /usr/share/intelmq_manager/html/ 6 | 7 | 8 | 9 | Header set Content-Security-Policy "script-src 'self'" 10 | Header set X-Content-Security-Policy "script-src 'self'" 11 | 12 | Require all granted 13 | 14 | -------------------------------------------------------------------------------- /intelmq_manager/__init__.py: -------------------------------------------------------------------------------- 1 | """Python __init__ file that provides the path to the module 2 | 3 | SPDX-FileCopyrightText: 2020 IntelMQ Team 4 | SPDX-License-Identifier: AGPL-3.0-or-later 5 | 6 | """ 7 | import pathlib 8 | from .version import __version__, __version_info__ # noqa 9 | 10 | path = pathlib.Path(__file__).parent 11 | -------------------------------------------------------------------------------- /intelmq_manager/build.py: -------------------------------------------------------------------------------- 1 | """ 2 | Build statically rendered files. 3 | 4 | SPDX-FileCopyrightText: 2021 Birger Schacht , Mikk Margus Möll , Sebastian Wagner 5 | SPDX-License-Identifier: AGPL-3.0-or-later 6 | """ 7 | import argparse 8 | import pathlib 9 | import shutil 10 | from mako.lookup import TemplateLookup 11 | 12 | 13 | def render_page(pagename: str, **template_args) -> str: 14 | template_dir = pathlib.Path(__file__).parent / 'templates' 15 | template_lookup = TemplateLookup(directories=[template_dir], default_filters=["h"], input_encoding='utf8') 16 | template = template_lookup.get_template(f'{pagename}.mako') 17 | 18 | return template.render(pagename=pagename, **template_args) 19 | 20 | 21 | def buildhtml(outputdir: pathlib.Path = pathlib.Path('html')): 22 | outputdir.mkdir(parents=True, exist_ok=True) 23 | 24 | htmlfiles = ["configs", "management", "monitor", "check", "about", "index"] 25 | for filename in htmlfiles: 26 | print(f"Rendering {filename}.html") 27 | html = render_page(filename) 28 | outputdir.joinpath(f"{filename}.html").write_text(html) 29 | 30 | staticfiles = ["css", "images", "js", "plugins", "less"] 31 | for filename in staticfiles: 32 | print(f"Copying {filename} recursively") 33 | src = pathlib.Path(__file__).parent / 'static' / filename 34 | dst = outputdir / filename 35 | if dst.exists(): 36 | shutil.rmtree(dst) 37 | shutil.copytree(src, dst) 38 | 39 | print('rendering dynvar.js') 40 | rendered = render_page('dynvar', allowed_path='/opt/intelmq/var/lib/bots/', controller_cmd='intelmq') 41 | outputdir.joinpath('js/dynvar.js').write_text(rendered) 42 | 43 | 44 | def main(): 45 | parser = argparse.ArgumentParser( 46 | prog='intelmq-manager-build', 47 | description='Build statically rendered files for intelmq-manager.', 48 | epilog='This command renders and saves all files required for IntelMQ Manager at the given directory, which can be served by Webservers statically', 49 | formatter_class=argparse.RawDescriptionHelpFormatter, 50 | ) 51 | 52 | parser.add_argument('--output-dir', '-o', default='html', 53 | type=pathlib.Path, 54 | help='The destination directory, will be created if needed.') 55 | args = parser.parse_args() 56 | buildhtml(outputdir=args.output_dir) 57 | 58 | 59 | if __name__ == '__main__': 60 | main() 61 | -------------------------------------------------------------------------------- /intelmq_manager/manager-apache.conf: -------------------------------------------------------------------------------- 1 | ../contrib/manager-apache.conf -------------------------------------------------------------------------------- /intelmq_manager/static/css/management.css: -------------------------------------------------------------------------------- 1 | #botnet-panels > div.panel .panel-div { 2 | margin-bottom: 16px; 3 | } 4 | #botnet-status { 5 | padding: 8px; 6 | } 7 | #graph-container { 8 | margin-top: 16px; 9 | overflow: auto; 10 | } 11 | #bot-table-panel { 12 | overflow: auto; 13 | } 14 | /*# sourceMappingURL=management.css.map */ -------------------------------------------------------------------------------- /intelmq_manager/static/css/management.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../less/management.less"],"names":[],"mappings":"AAAA,cAAe,MAAK,MAChB;EACI,mBAAA;;AAIR;EACI,YAAA;;AAGJ;EACI,gBAAA;EACA,cAAA;;AAGJ;EACI,cAAA","file":"management.css"} -------------------------------------------------------------------------------- /intelmq_manager/static/css/sb-admin-2.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - SB Admin 2 Bootstrap Admin Theme (http://startbootstrap.com) 3 | * Code licensed under the Apache License v2.0. 4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0. 5 | */ 6 | body { 7 | background-color: #f8f8f8; 8 | overflow: auto; 9 | } 10 | @media (min-width: 768px) { 11 | body { 12 | overflow: hidden; 13 | } 14 | } 15 | #page-wrapper { 16 | margin: 0px; 17 | padding: 0px; 18 | min-height: 568px; 19 | background-color: #fff; 20 | } 21 | #page-wrapper-with-sidebar { 22 | padding: 0px; 23 | min-height: 568px; 24 | background-color: #fff; 25 | } 26 | @media (min-width: 768px) { 27 | #page-wrapper-with-sidebar { 28 | position: inherit; 29 | margin: 0 0 0 250px; 30 | padding: 0px; 31 | border-left: 1px solid #e7e7e7; 32 | } 33 | } 34 | .navbar-top-links li { 35 | display: inline-block; 36 | } 37 | .navbar-top-links li:last-child { 38 | margin-right: 15px; 39 | } 40 | .navbar-top-links li a { 41 | padding: 15px; 42 | min-height: 50px; 43 | } 44 | .navbar-top-links .dropdown-menu li { 45 | display: block; 46 | } 47 | .navbar-top-links .dropdown-menu li:last-child { 48 | margin-right: 0; 49 | } 50 | .navbar-top-links .dropdown-menu li a { 51 | padding: 3px 20px; 52 | min-height: 0; 53 | } 54 | .navbar-top-links .dropdown-menu li a div { 55 | white-space: normal; 56 | } 57 | .navbar-top-links .dropdown-messages, 58 | .navbar-top-links .dropdown-tasks, 59 | .navbar-top-links .dropdown-alerts { 60 | width: 310px; 61 | min-width: 0; 62 | } 63 | .navbar-top-links .dropdown-messages { 64 | margin-left: 5px; 65 | } 66 | .navbar-top-links .dropdown-tasks { 67 | margin-left: -59px; 68 | } 69 | .navbar-top-links .dropdown-alerts { 70 | margin-left: -123px; 71 | } 72 | .navbar-top-links .dropdown-user { 73 | right: 0; 74 | left: auto; 75 | } 76 | .sidebar .sidebar-nav.navbar-collapse { 77 | padding-right: 0; 78 | padding-left: 0; 79 | } 80 | .sidebar .sidebar-search { 81 | padding: 15px; 82 | } 83 | .sidebar ul li { 84 | border-bottom: 1px solid #e7e7e7; 85 | } 86 | .sidebar ul li a.active { 87 | background-color: #eee; 88 | } 89 | .sidebar .arrow { 90 | float: right; 91 | } 92 | .sidebar .fa.arrow:before { 93 | content: "\f104"; 94 | } 95 | .sidebar .active > a > .fa.arrow:before { 96 | content: "\f107"; 97 | } 98 | .sidebar .nav-second-level li, 99 | .sidebar .nav-third-level li { 100 | border-bottom: 0!important; 101 | } 102 | .sidebar .nav-second-level li a { 103 | padding-left: 37px; 104 | } 105 | .sidebar .nav-third-level li a { 106 | padding-left: 52px; 107 | } 108 | #customListItem { 109 | border-bottom: none; 110 | padding-top: 10px; 111 | padding-bottom: 10px; 112 | text-align: center; 113 | } 114 | @media (min-width: 768px) { 115 | .sidebar { 116 | z-index: 1; 117 | position: absolute; 118 | width: 250px; 119 | margin-top: 0px; 120 | } 121 | .navbar-top-links .dropdown-messages, 122 | .navbar-top-links .dropdown-tasks, 123 | .navbar-top-links .dropdown-alerts { 124 | margin-left: auto; 125 | } 126 | } 127 | .btn-outline { 128 | color: inherit; 129 | background-color: transparent; 130 | transition: all .5s; 131 | } 132 | .btn-primary.btn-outline { 133 | color: #428bca; 134 | } 135 | .btn-success.btn-outline { 136 | color: #5cb85c; 137 | } 138 | .btn-info.btn-outline { 139 | color: #5bc0de; 140 | } 141 | .btn-warning.btn-outline { 142 | color: #f0ad4e; 143 | } 144 | .btn-danger.btn-outline { 145 | color: #d9534f; 146 | } 147 | .btn-primary.btn-outline:hover, 148 | .btn-success.btn-outline:hover, 149 | .btn-info.btn-outline:hover, 150 | .btn-warning.btn-outline:hover, 151 | .btn-danger.btn-outline:hover { 152 | color: #fff; 153 | } 154 | .chat { 155 | margin: 0; 156 | padding: 0; 157 | list-style: none; 158 | } 159 | .chat li { 160 | margin-bottom: 10px; 161 | padding-bottom: 5px; 162 | border-bottom: 1px dotted #999; 163 | } 164 | .chat li.left .chat-body { 165 | margin-left: 60px; 166 | } 167 | .chat li.right .chat-body { 168 | margin-right: 60px; 169 | } 170 | .chat li .chat-body p { 171 | margin: 0; 172 | } 173 | .panel .slidedown .glyphicon, 174 | .chat .glyphicon { 175 | margin-right: 5px; 176 | } 177 | .chat-panel .panel-body { 178 | height: 350px; 179 | overflow-y: scroll; 180 | } 181 | .login-panel { 182 | margin-top: 25%; 183 | } 184 | .flot-chart { 185 | display: block; 186 | height: 400px; 187 | } 188 | .flot-chart-content { 189 | width: 100%; 190 | height: 100%; 191 | } 192 | table.dataTable thead .sorting, 193 | table.dataTable thead .sorting_asc, 194 | table.dataTable thead .sorting_desc { 195 | background: transparent; 196 | } 197 | table.dataTable thead .sorting_asc:after { 198 | content: "\f0de"; 199 | float: right; 200 | font-family: fontawesome; 201 | } 202 | table.dataTable thead .sorting_desc:after { 203 | content: "\f0dd"; 204 | float: right; 205 | font-family: fontawesome; 206 | } 207 | table.dataTable thead .sorting:after { 208 | content: "\f0dc"; 209 | float: right; 210 | font-family: fontawesome; 211 | color: rgba(50, 50, 50, 0.5); 212 | } 213 | .highlightHovering td:first-child:hover { 214 | font-weight: bold; 215 | cursor: pointer; 216 | } 217 | .btn-circle { 218 | width: 30px; 219 | height: 30px; 220 | padding: 6px 0; 221 | border-radius: 15px; 222 | text-align: center; 223 | font-size: 12px; 224 | line-height: 1.428571429; 225 | } 226 | .btn-circle.btn-lg { 227 | width: 50px; 228 | height: 50px; 229 | padding: 10px 16px; 230 | border-radius: 25px; 231 | font-size: 18px; 232 | line-height: 1.33; 233 | } 234 | .btn-circle.btn-xl { 235 | width: 70px; 236 | height: 70px; 237 | padding: 10px 16px; 238 | border-radius: 35px; 239 | font-size: 24px; 240 | line-height: 1.33; 241 | } 242 | .show-grid [class^=col-] { 243 | padding-top: 10px; 244 | padding-bottom: 10px; 245 | border: 1px solid #ddd; 246 | background-color: #eee!important; 247 | } 248 | .show-grid { 249 | margin: 15px 0; 250 | } 251 | .huge { 252 | font-size: 40px; 253 | } 254 | .panel-green { 255 | border-color: #5cb85c; 256 | } 257 | .panel-green .panel-heading { 258 | border-color: #5cb85c; 259 | color: #fff; 260 | background-color: #5cb85c; 261 | } 262 | .panel-green a { 263 | color: #5cb85c; 264 | } 265 | .panel-green a:hover { 266 | color: #3d8b3d; 267 | } 268 | .panel-red { 269 | border-color: #d9534f; 270 | } 271 | .panel-red .panel-heading { 272 | border-color: #d9534f; 273 | color: #fff; 274 | background-color: #d9534f; 275 | } 276 | .panel-red a { 277 | color: #d9534f; 278 | } 279 | .panel-red a:hover { 280 | color: #b52b27; 281 | } 282 | .panel-yellow { 283 | border-color: #f0ad4e; 284 | } 285 | .panel-yellow .panel-heading { 286 | border-color: #f0ad4e; 287 | color: #fff; 288 | background-color: #f0ad4e; 289 | } 290 | .panel-yellow a { 291 | color: #f0ad4e; 292 | } 293 | .panel-yellow a:hover { 294 | color: #df8a13; 295 | } 296 | .jumbotron { 297 | margin-bottom: 15px; 298 | margin-top: 15px; 299 | margin-left: auto; 300 | margin-right: auto; 301 | padding: 0px; 302 | text-align: center; 303 | height: 100%; 304 | max-width: 90%; 305 | } 306 | .jumbotron .page-header-text { 307 | background-color: #000000; 308 | background-size: contain; 309 | max-width: 100%; 310 | } 311 | .jumbotron .page-header-text span { 312 | color: #ffffff; 313 | text-align: center; 314 | height: 100%; 315 | } 316 | .jumbotron-row { 317 | margin-top: 15px; 318 | } 319 | .center-row { 320 | text-align: center; 321 | } 322 | .center-row-content { 323 | overflow: auto; 324 | display: inline-block; 325 | float: none; 326 | margin: auto; 327 | } 328 | .header-img img { 329 | height: 100px; 330 | padding: 5px; 331 | } 332 | .thumbnail img { 333 | width: 128px; 334 | height: 128px; 335 | padding: 15px; 336 | } 337 | .form-group { 338 | margin-bottom: 45px; 339 | } 340 | #bot-table td:first-child:hover { 341 | font-weight: bold; 342 | cursor: pointer; 343 | } 344 | #network-popUp { 345 | display: none; 346 | position: absolute; 347 | top: 15%; 348 | left: 5%; 349 | margin: auto; 350 | z-index: 299; 351 | background-color: #FFFFFF; 352 | border-style: solid; 353 | border-width: 3px; 354 | border-color: #5394ed; 355 | padding: 10px; 356 | width: 90%; 357 | text-align: center; 358 | } 359 | @media (min-width: 768px) { 360 | #network-popUp { 361 | left: 25%; 362 | width: 50%; 363 | } 364 | } 365 | #network-popUp-fields { 366 | background: #FFFFFF; 367 | width: 100%; 368 | } 369 | #network-popUp-fields input { 370 | width: 100%; 371 | } 372 | #network-popUp-fields td { 373 | text-align: left; 374 | } 375 | form { 376 | display: inline-block; 377 | margin-bottom: 10px; 378 | } 379 | #border { 380 | text-align: center !important; 381 | font-weight: bold; 382 | } 383 | #network-popUp-title { 384 | width: 100%; 385 | font-size: 28px; 386 | display: inherit; 387 | } 388 | #network-row { 389 | display: none; 390 | height: 90%; 391 | } 392 | #network-row.col-xs-10 { 393 | height: 100%; 394 | } 395 | #network-row.col-xs-2 { 396 | height: 100%; 397 | } 398 | #network-tab { 399 | height: 100%; 400 | } 401 | .with-bot { 402 | max-height: 75%; 403 | overflow-y: auto; 404 | } 405 | #logs-panel { 406 | margin-top: 15px; 407 | } 408 | #queues-panel { 409 | margin-top: 15px; 410 | } 411 | #queues-panel .width-80 { 412 | width: 80%; 413 | } 414 | #queues-panel .width-20 { 415 | width: 20%; 416 | } 417 | .waiting { 418 | background-image: url('../images/waiting.gif'); 419 | background-repeat: no-repeat; 420 | background-size: 16px; 421 | background-position: right 10px center; 422 | } 423 | .row { 424 | margin: 0px; 425 | } 426 | .navbar-config { 427 | margin-right: 16px; 428 | } 429 | .index-link:hover { 430 | text-decoration: none; 431 | box-shadow: 1px 1px 16px #000000; 432 | } 433 | .index-link { 434 | display: block; 435 | box-shadow: 1px 1px 16px rgba(0, 0, 0, 0.2); 436 | } 437 | /*# sourceMappingURL=sb-admin-2.css.map */ -------------------------------------------------------------------------------- /intelmq_manager/static/css/sb-admin-2.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../less/sb-admin-2.less"],"names":[],"mappings":";;;;;AAMA;EACI,yBAAA;EACA,cAAA;;AAGJ,QAAwB;EACpB;IACI,gBAAA;;;AAIR;EACI,WAAA;EACA,YAAA;EACA,iBAAA;EACA,sBAAA;;AAGJ;EACI,YAAA;EACA,iBAAA;EACA,sBAAA;;AAGJ,QAAwB;EACpB;IACI,iBAAA;IACA,mBAAA;IACA,YAAA;IACA,8BAAA;;;AAIR,iBAAkB;EACd,qBAAA;;AAGJ,iBAAkB,GAAE;EAChB,kBAAA;;AAGJ,iBAAkB,GAAG;EACjB,aAAA;EACA,gBAAA;;AAGJ,iBAAkB,eAAe;EAC7B,cAAA;;AAGJ,iBAAkB,eAAe,GAAE;EAC/B,eAAA;;AAGJ,iBAAkB,eAAe,GAAG;EAChC,iBAAA;EACA,aAAA;;AAGJ,iBAAkB,eAAe,GAAG,EAAE;EAClC,mBAAA;;AAGJ,iBAAkB;AAClB,iBAAkB;AAClB,iBAAkB;EACd,YAAA;EACA,YAAA;;AAGJ,iBAAkB;EACd,gBAAA;;AAGJ,iBAAkB;EACd,kBAAA;;AAGJ,iBAAkB;EACd,mBAAA;;AAGJ,iBAAkB;EACd,QAAA;EACA,UAAA;;AAGJ,QAAS,aAAY;EACjB,gBAAA;EACA,eAAA;;AAGJ,QAAS;EACL,aAAA;;AAGJ,QAAS,GAAG;EACR,gCAAA;;AAGJ,QAAS,GAAG,GAAG,EAAC;EACZ,sBAAA;;AAGJ,QAAS;EACL,YAAA;;AAGJ,QAAS,IAAG,MAAM;EACd,SAAS,OAAT;;AAGJ,QAAS,QAAO,IAAE,MAAI,MAAM;EACxB,SAAS,OAAT;;AAGJ,QAAS,kBAAkB;AAC3B,QAAS,iBAAiB;EACtB,0BAAA;;AAGJ,QAAS,kBAAkB,GAAG;EAC1B,kBAAA;;AAGJ,QAAS,iBAAiB,GAAG;EACzB,kBAAA;;AAGJ;EACI,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,kBAAA;;AAGJ,QAAwB;EACpB;IACI,UAAA;IACA,kBAAA;IACA,YAAA;IACA,eAAA;;EAGJ,iBAAkB;EAClB,iBAAkB;EAClB,iBAAkB;IACd,iBAAA;;;AAIR;EACI,cAAA;EACA,6BAAA;EACA,mBAAA;;AAGJ,YAAY;EACR,cAAA;;AAGJ,YAAY;EACR,cAAA;;AAGJ,SAAS;EACL,cAAA;;AAGJ,YAAY;EACR,cAAA;;AAGJ,WAAW;EACP,cAAA;;AAGJ,YAAY,YAAY;AACxB,YAAY,YAAY;AACxB,SAAS,YAAY;AACrB,YAAY,YAAY;AACxB,WAAW,YAAY;EACnB,WAAA;;AAGJ;EACI,SAAA;EACA,UAAA;EACA,gBAAA;;AAGJ,KAAM;EACF,mBAAA;EACA,mBAAA;EACA,8BAAA;;AAGJ,KAAM,GAAE,KAAM;EACV,iBAAA;;AAGJ,KAAM,GAAE,MAAO;EACX,kBAAA;;AAGJ,KAAM,GAAG,WAAW;EAChB,SAAA;;AAGJ,MAAO,WAAW;AAClB,KAAM;EACF,iBAAA;;AAGJ,WAAY;EACR,aAAA;EACA,kBAAA;;AAGJ;EACI,eAAA;;AAGJ;EACI,cAAA;EACA,aAAA;;AAGJ;EACI,WAAA;EACA,YAAA;;AAGJ,KAAK,UAAW,MAAM;AACtB,KAAK,UAAW,MAAM;AACtB,KAAK,UAAW,MAAM;EACpB,uBAAA;;AAGF,KAAK,UAAW,MAAM,aAAY;EAC9B,SAAS,OAAT;EACA,YAAA;EACA,wBAAA;;AAGJ,KAAK,UAAW,MAAM,cAAa;EAC/B,SAAS,OAAT;EACA,YAAA;EACA,wBAAA;;AAGJ,KAAK,UAAW,MAAM,SAAQ;EAC1B,SAAS,OAAT;EACA,YAAA;EACA,wBAAA;EACA,4BAAA;;AAGJ,kBAAmB,GAAE,YAAY;EAC7B,iBAAA;EACA,eAAA;;AAGJ;EACI,WAAA;EACA,YAAA;EACA,cAAA;EACA,mBAAA;EACA,kBAAA;EACA,eAAA;EACA,wBAAA;;AAGJ,WAAW;EACP,WAAA;EACA,YAAA;EACA,kBAAA;EACA,mBAAA;EACA,eAAA;EACA,iBAAA;;AAGJ,WAAW;EACP,WAAA;EACA,YAAA;EACA,kBAAA;EACA,mBAAA;EACA,eAAA;EACA,iBAAA;;AAGJ,UAAW;EACP,iBAAA;EACA,oBAAA;EACA,sBAAA;EACA,gCAAA;;AAGJ;EACI,cAAA;;AAGJ;EACI,eAAA;;AAGJ;EACI,qBAAA;;AAGJ,YAAa;EACT,qBAAA;EACA,WAAA;EACA,yBAAA;;AAGJ,YAAa;EACT,cAAA;;AAGJ,YAAa,EAAC;EACV,cAAA;;AAGJ;EACI,qBAAA;;AAGJ,UAAW;EACP,qBAAA;EACA,WAAA;EACA,yBAAA;;AAGJ,UAAW;EACP,cAAA;;AAGJ,UAAW,EAAC;EACR,cAAA;;AAGJ;EACI,qBAAA;;AAGJ,aAAc;EACV,qBAAA;EACA,WAAA;EACA,yBAAA;;AAGJ,aAAc;EACV,cAAA;;AAGJ,aAAc,EAAC;EACX,cAAA;;AAGJ;EACI,mBAAA;EACA,gBAAA;EACA,iBAAA;EACA,kBAAA;EACA,YAAA;EACA,kBAAA;EACA,YAAA;EACA,cAAA;;AAGJ,UAAW;EACP,yBAAA;EACA,wBAAA;EACA,eAAA;;AAGJ,UAAW,kBAAkB;EACzB,cAAA;EACA,kBAAA;EACA,YAAA;;AAGJ;EACI,gBAAA;;AAGJ;EACI,kBAAA;;AAGJ;EACI,cAAA;EACA,qBAAA;EACA,WAAA;EACA,YAAA;;AAGJ,WAAY;EACR,aAAA;EACA,YAAA;;AAGJ,UAAW;EACP,YAAA;EACA,aAAA;EACA,aAAA;;AAGJ;EACI,mBAAA;;AAGJ,UAAW,GAAE,YAAY;EACrB,iBAAA;EACA,eAAA;;AAGJ;EACI,aAAA;EACA,kBAAA;EACA,QAAA;EACA,QAAA;EACA,YAAA;EACA,YAAA;EACA,yBAAA;EACA,mBAAA;EACA,iBAAA;EACA,qBAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;;AAGJ,QAAwB;EACpB;IACI,SAAA;IACA,UAAA;;;AAIR;EACI,mBAAA;EACA,WAAA;;AAGJ,qBAAsB;EAClB,WAAA;;AAGJ,qBAAsB;EAClB,gBAAA;;AAGJ;EACI,qBAAA;EACA,mBAAA;;AAGJ;EACI,6BAAA;EACA,iBAAA;;AAGJ;EACI,WAAA;EACA,eAAA;EACA,gBAAA;;AAGJ;EACI,aAAA;EACA,WAAA;;AAGJ,YAAY;EACR,YAAA;;AAGJ,YAAY;EACR,YAAA;;AAGJ;EACI,YAAA;;AAGJ;EACI,eAAA;EACA,gBAAA;;AAOJ;EACI,gBAAA;;AAGJ;EACI,gBAAA;;AAGJ,aAAc;EACZ,UAAA;;AAGF,aAAc;EACZ,UAAA;;AAGF;EACI,sBAAsB,wBAAtB;EACA,4BAAA;EACA,qBAAA;EACA,sCAAA;;AAGJ;EACI,WAAA;;AAGJ;EACI,kBAAA;;AAGJ,WAAW;EACP,qBAAA;EACA,gCAAA;;AAGJ;EACI,cAAA;EACA,2CAAA","file":"sb-admin-2.css"} -------------------------------------------------------------------------------- /intelmq_manager/static/css/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Navigation 3 | */ 4 | nav ul.nav.navbar-top-links li.active { 5 | color: #555; 6 | cursor: default; 7 | background-color: #fff; 8 | border: 1px solid #ddd; 9 | border-bottom-color: transparent; 10 | } 11 | /* 12 | * Common elements 13 | */ 14 | #common-templates { 15 | display: none; 16 | } 17 | #wrapper .navbar #log-window { 18 | background-color: black; 19 | color: white; 20 | display: none; 21 | float: right; 22 | margin: 5px 5px; 23 | padding: 5px; 24 | width: 500px; 25 | height: 44px; 26 | overflow: hidden; 27 | resize: vertical; 28 | position: absolute; 29 | top: 0; 30 | right: 0; 31 | cursor: pointer; 32 | } 33 | #wrapper .navbar #log-window.extended { 34 | height: auto; 35 | max-height: 100vh; 36 | cursor: unset; 37 | overflow-y: auto; 38 | } 39 | #wrapper .navbar #log-window [role=close] { 40 | float: right; 41 | cursor: pointer; 42 | } 43 | #wrapper .navbar #log-window .command { 44 | display: block; 45 | padding: 9.5px; 46 | margin: 0 0 10px; 47 | font-size: 13px; 48 | line-height: 1.42857143; 49 | color: #333; 50 | word-break: break-all; 51 | word-wrap: break-word; 52 | background-color: #f5f5f5; 53 | border: 1px solid #ccc; 54 | border-radius: 4px; 55 | overflow: auto; 56 | font-family: Menlo, Monaco, Consolas, "Courier New", monospace; 57 | } 58 | #wrapper .navbar #log-window .alert a { 59 | text-decoration: underline; 60 | display: inline-block; 61 | padding: 4px; 62 | border: 1px solid #ccc; 63 | border-radius: 10px; 64 | } 65 | .fa { 66 | font-family: FontAwesome; 67 | } 68 | .control-buttons [data-url=status] { 69 | display: none; 70 | } 71 | /* 72 | * Management page 73 | */ 74 | #botnet-panels > .panel[data-botnet-group] { 75 | display: none; 76 | } 77 | #botnet-panels > .panel[data-botnet-group][data-botnet-group=botnet] { 78 | display: block; 79 | } 80 | /* 81 | * Monitor page 82 | */ 83 | #botnet-panels .panel .control-buttons [data-role=control-status] { 84 | display: none; 85 | } 86 | #inspect-panel .control-buttons { 87 | float: right; 88 | } 89 | #inspect-panel button[data-role="clear"] { 90 | float: right; 91 | } 92 | #inspect-panel #command-show { 93 | display: none; 94 | } 95 | #inspect-panel textarea { 96 | resize: vertical; 97 | } 98 | /* 99 | * Config page 100 | */ 101 | #templates { 102 | display: none; 103 | } 104 | #network-container .control-buttons { 105 | float: left; 106 | } 107 | #network-container .control-buttons button { 108 | height: 25px; 109 | } 110 | #network-container .control-buttons button span { 111 | top: -2px; 112 | } 113 | #network-container .monitor-button div a { 114 | color: black; 115 | } 116 | #network-container .duplicate-button { 117 | background-image: url('../plugins/vis.js/img/network/addNodeIcon.png'); 118 | } 119 | #network-container .network-right-menu > div { 120 | display: block; 121 | } 122 | #network-container .network-right-menu .vis-live-toggle, 123 | #network-container .network-right-menu .vis-physics-toggle { 124 | border-radius: 10px; 125 | position: absolute; 126 | right: 560px; 127 | top: 35px; 128 | white-space: nowrap; 129 | padding: 5px 0 5px 5px; 130 | cursor: pointer; 131 | } 132 | #network-container .network-right-menu .vis-live-toggle.running, 133 | #network-container .network-right-menu .vis-physics-toggle.running { 134 | background-color: #00D000; 135 | } 136 | #network-container .network-right-menu .vis-live-toggle .icon { 137 | background-image: url("../images/monitor.png"); 138 | background-repeat: no-repeat; 139 | background-size: 30%; 140 | padding-left: 30px; 141 | padding-right: 15px; 142 | position: relative; 143 | z-index: 20; 144 | } 145 | #network-container .network-right-menu .vis-physics-toggle { 146 | right: 480px; 147 | } 148 | -------------------------------------------------------------------------------- /intelmq_manager/static/css/style.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../less/style.less"],"names":[],"mappings":";;;AAGA,GAAI,GAAE,IAAI,iBAAkB,GAAE;EAC5B,WAAA;EACA,eAAA;EACA,sBAAA;EACA,sBAAA;EACA,gCAAA;;;;;AAMF;EACE,aAAA;;AAGF,QAAS,QAAQ;EACf,uBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,YAAA;EACA,YAAA;EACA,YAAA;EACA,cAAA;EACA,gBAAA;EACA,kBAAA;EACA,MAAA;EACA,QAAA;EACA,eAAA;;AAEA,QAhBO,QAAQ,YAgBd;EACC,YAAA;EACA,iBAAA;EACA,WAAA;EACA,aAAA;EACA,gBAAA;;AArBJ,QAAS,QAAQ,YAwBf;EACE,YAAA;EACA,eAAA;;AA1BJ,QAAS,QAAQ,YA6Bf;EACE,cAAA;EACA,cAAA;EACA,gBAAA;EACA,eAAA;EACA,uBAAA;EACA,WAAA;EACA,qBAAA;EACA,qBAAA;EACA,yBAAA;EACA,sBAAA;EACA,kBAAA;EACA,cAAA;EACA,sCAAsC,wBAAtC;;AA1CJ,QAAS,QAAQ,YA6Cb,OAAO;EACH,0BAAA;EACA,qBAAA;EACA,YAAA;EACA,sBAAA;EACA,mBAAA;;AAIR;EACE,wBAAA;;AAGF,gBAAiB;EACf,aAAA;;;;;AAMF,cAAe,SAAQ;EACrB,aAAA;;AACA,cAFa,SAAQ,mBAEpB;EACC,cAAA;;;;;AAOJ,cAAe,OAAO,iBAAiB;EACrC,aAAA;;AAGF,cACE;EACE,YAAA;;AAFJ,cAKE,OAAM;EACJ,YAAA;;AANJ,cASE;EACE,aAAA;;AAVJ,cAaE;EACE,gBAAA;;;;;AAQJ;EACE,aAAA;;AAMF,kBAEE;EACE,WAAA;;AAHJ,kBAEE,iBAGE;EACE,YAAA;;AANN,kBAEE,iBAGE,OAGE;EACE,SAAA;;AATR,kBAcE,gBAGE,IAAI;EACF,YAAA;;AAlBN,kBAsBE;EACE,sBAAsB,gDAAtB;;AAvBJ,kBA0BE,oBACE;EACE,cAAA;;AA5BN,kBA0BE,oBAKE;AA/BJ,kBA0BE,oBAKoB;EAChB,mBAAA;EACA,kBAAA;EACA,YAAA;EACA,SAAA;EACA,mBAAA;EACA,sBAAA;EACA,eAAA;;AAEA,kBAdJ,oBAKE,iBASG;AAAD,kBAdJ,oBAKoB,oBASf;EAGC,yBAAA;;AA3CR,kBA0BE,oBAqBE,iBAAiB;EACf,sBAAsB,wBAAtB;EACA,4BAAA;EACA,oBAAA;EACA,kBAAA;EACA,mBAAA;EACA,kBAAA;EACA,WAAA;;AAtDN,kBA0BE,oBA+BE;EACE,YAAA","file":"style.css"} -------------------------------------------------------------------------------- /intelmq_manager/static/images/1140x319.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/1140x319.gif -------------------------------------------------------------------------------- /intelmq_manager/static/images/about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/about.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/abouticon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/abouticon-20.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/abouticon-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/abouticon-24.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/botnet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/botnet.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/check.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 44 | 47 | 48 | 50 | 51 | 53 | image/svg+xml 54 | 56 | 57 | 58 | 59 | 60 | 65 | 73 | 82 | 91 | 100 | 106 | 111 | 116 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /intelmq_manager/static/images/config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/config.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/logo.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/logo2.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/logo_no_margin_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/logo_no_margin_6.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/monitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/monitor.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/redrawicon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/redrawicon-20.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/saveicon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/saveicon-128.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/saveicon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/saveicon-20.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/saveicon-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/saveicon-24.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/trashicon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/trashicon-20.png -------------------------------------------------------------------------------- /intelmq_manager/static/images/waiting.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/images/waiting.gif -------------------------------------------------------------------------------- /intelmq_manager/static/js/about.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | // 3 | // SPDX-License-Identifier: AGPL-3.0-or-later 4 | 'use strict'; 5 | 6 | function get_versions() { 7 | let intelmq_version_element = document.getElementById('intelmq-version'); 8 | let intelmq_api_version_element = document.getElementById('intelmq-api-version'); 9 | let intelmq_manager_version_element = document.getElementById('intelmq-manager-version'); 10 | 11 | authenticatedGetJson(managementUrl('version')) 12 | .done(function (data) { 13 | intelmq_version_element.innerHTML = data.intelmq; 14 | intelmq_api_version_element.innerHTML = data['intelmq-api']; 15 | intelmq_manager_version_element.innerHTML = '3.3.0'; 16 | }) 17 | .fail(function (jqxhr, textStatus, error) { 18 | let err = `${textStatus}, ${error}`; 19 | console.error(`Request Failed: ${err}`); 20 | alert('error getting version'); 21 | }); 22 | } 23 | function get_debug() { 24 | let section_element = document.getElementById('debugging'); 25 | 26 | authenticatedGetJson(managementUrl('debug')) 27 | .done(function (data) { 28 | for (const section in data) { 29 | let section_heading = document.createElement("h3"); 30 | section_heading.innerHTML = section; 31 | section_element.appendChild(section_heading); 32 | let table = document.createElement("table"); 33 | let tbody = document.createElement("table"); 34 | 35 | for (const [key, value] of Object.entries(data[section])) { 36 | let row = tbody.insertRow(-1); 37 | let cell0 = row.insertCell(0); 38 | cell0.innerHTML = `
${key}
`; 39 | let cell1 = row.insertCell(1); 40 | cell1.innerHTML = `
${value}
`; 41 | } 42 | table.appendChild(tbody); 43 | section_element.appendChild(table); 44 | } 45 | $('#debugging-heading').removeClass('waiting'); 46 | }) 47 | .fail(function (jqxhr, textStatus, error) { 48 | let err = `${textStatus}, ${error}`; 49 | console.error(`Request Failed: ${err}`); 50 | alert('Error getting debugging information. Do you have IntelMQ >= 2.2.0?'); 51 | }); 52 | } 53 | 54 | get_versions(); 55 | get_debug(); 56 | -------------------------------------------------------------------------------- /intelmq_manager/static/js/check.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | // 3 | // SPDX-License-Identifier: AGPL-3.0-or-later 4 | 'use strict'; 5 | 6 | let colors = {info: "alert-info", warning: "alert-warning", error: "alert-danger"}; 7 | let statuses = {success: "No error found.", error: "Some issues have been found, please check the output."} 8 | 9 | 10 | function get_check_output() { 11 | let tableEl = document.getElementById('check-output-table'); 12 | 13 | authenticatedGetJson(managementUrl('check')) 14 | .done(data => { 15 | //data = {"status": "error","lines": [["info", "Reading configuration files."], ["info", "Checking runtime configuration."], ["info", "Checking pipeline configuration."], ["warning", "Bot 'cert-bund-avalanche-parser' has no 'description'."], ["warning", "Bot 'mailsend-output-cz' has no 'name'."], ["error", "Misconfiguration: No source queue for 'mailsend-output-cz'."], ["error", "Misconfiguration: No pipeline configuration found for 'vxvault-collector'."], ["error", "Misconfiguration: No pipeline configuration found for 'vxvault-parser'."], ["info", "Checking harmoization configuration."], ["info", "Checking for bots."]]}; 16 | tableEl.innerHTML = `Status${statuses[data.status]}`; 17 | for (let line of data.lines) { 18 | tableEl.innerHTML += `${line[0]}${line[1]}`; 19 | } 20 | }) 21 | .fail((jqxhr, textStatus, error) => { 22 | let err = `${textStatus}, ${error}`; 23 | console.error(`Request Failed: ${err}`); 24 | alert('error getting check command output'); 25 | }); 26 | } 27 | 28 | get_check_output(); 29 | -------------------------------------------------------------------------------- /intelmq_manager/static/js/config.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/js/config.js -------------------------------------------------------------------------------- /intelmq_manager/static/js/defaults.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 IntelMQ Team , 2020 Edvard Rejthar , 2021 Mikk Margus Möll 2 | // 3 | // SPDX-License-Identifier: AGPL-3.0-or-later 4 | 'use strict'; 5 | 6 | function generate_defaults_conf(defaults) { 7 | return JSON.stringify(sortObjectByPropertyName(defaults), undefined, 4); 8 | } 9 | 10 | function read_defaults_conf(config) { 11 | let global = {}; 12 | 13 | for (let key in config.global) { 14 | try { 15 | global[key] = JSON.parse(config.global[key]); 16 | } catch (err) { 17 | global[key] = config.global[key]; 18 | } 19 | } 20 | 21 | return global; 22 | } 23 | 24 | function remove_defaults(nodes) { 25 | for (let id in nodes) { 26 | delete nodes[id].defaults; 27 | } 28 | 29 | return nodes; 30 | } 31 | 32 | function get_reverse_nodes(dest_bot_id) { 33 | let out = []; 34 | let dest_bot = app.nodes[dest_bot_id]; 35 | if (dest_bot === undefined) { 36 | // for example for newly configured bots 37 | return out; 38 | } 39 | 40 | let connected_nodes = app.network.getConnectedNodes(dest_bot_id); 41 | let queue_id = `${dest_bot_id}-queue`; 42 | let reverse_allowed_neighbors = REVERSE_ACCEPTED_NEIGHBORS[dest_bot.group]; 43 | 44 | for (let src_bot of connected_nodes.map(src_bot_id => app.nodes[src_bot_id]).filter(src_bot => reverse_allowed_neighbors.includes(src_bot.group))) { 45 | for (let list of Object.values(src_bot.parameters.destination_queues)) { 46 | if (list.includes(queue_id)) { 47 | out.push(src_bot.bot_id); 48 | break; 49 | } 50 | } 51 | } 52 | 53 | return out; 54 | } 55 | 56 | function get_reverse_edges(dest_bot_id) { 57 | let out = [], queue_id = `${dest_bot_id}-queue`; 58 | for (let edge_id of app.network.getConnectedEdges(dest_bot_id)) { 59 | let [from, to, path] = from_edge_id(edge_id); 60 | if (to === queue_id) { 61 | out.push(edge_id); 62 | } 63 | } 64 | 65 | return out; 66 | } 67 | 68 | function to_edge_id(from, to, path) { // e.g HTTP-Collector|JSON-Parser-queue|_default 69 | return [from, to.replace(/-queue$/, ''), path].map(escape).join('|'); 70 | } 71 | 72 | function from_edge_id(edge_id) { 73 | let [from, to, path] = edge_id.split('|').map(unescape); 74 | return [from, `${to}-queue`, path]; 75 | } 76 | 77 | function gen_new_id(prefix) { 78 | if (!(prefix in app.nodes)) { // no need to add numeric suffix 79 | return prefix; 80 | } 81 | 82 | let i = 1, new_id; 83 | //reserve a new unique name 84 | do { 85 | new_id = `${prefix}-${++i}`; 86 | } while (new_id in app.nodes); 87 | 88 | return new_id; 89 | 90 | } 91 | -------------------------------------------------------------------------------- /intelmq_manager/static/js/intelmq-manager.js: -------------------------------------------------------------------------------- 1 | /* intelmq-manager.js javascript file for intelmq-manager 2 | * 3 | * SPDX-FileCopyrightText: 2020 IntelMQ Team 4 | * SPDX-License-Identifier: AGPL-3.0-or-later 5 | * 6 | * Do not change this file! If you want to customize the settings, 7 | * create a 'var.js' file and define the custom settings there with 8 | * var VARIABLENAME = value 9 | */ 10 | 11 | /* 12 | * ROOT points to the URI of the API service. 13 | * Set this for example to `https://intelmq.organization.tld/` 14 | * By default ROOT points to the host the manager runs on, but the path '/intelmq' 15 | */ 16 | 'use strict'; 17 | 18 | var arr = window.location.href.split('/'); 19 | var ROOT = ROOT ?? `${arr[0]}//${arr[2]}/intelmq`; 20 | 21 | /* 22 | * If there are multiple versions of the API, they can be defined here 23 | */ 24 | var API_V1 = ROOT + '/v1/api/' 25 | 26 | /* 27 | * use a specific version when accessing the API variable 28 | */ 29 | var API = API_V1 30 | -------------------------------------------------------------------------------- /intelmq_manager/static/js/management.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | // 3 | // SPDX-License-Identifier: AGPL-3.0-or-later 4 | 'use strict'; 5 | 6 | var BOT_STATUS_DEFINITION = BOT_STATUS_DEFINITION || {}; 7 | var BOT_CLASS_DEFINITION = BOT_CLASS_DEFINITION || {}; 8 | var bot_status = bot_status || {}; 9 | var botnet_status = botnet_status || {}; 10 | var reload_interval; 11 | 12 | $('#bot-table').dataTable({ 13 | lengthMenu: [[5, 10, 25, -1], [5, 10, 25, "All"]], 14 | pageLength: -1, 15 | columns: ['bot_id', 'bot_status', 'actions'].map(data => {return {data}}), 16 | createdRow: (row, data) => $("td:eq(2)", row).append(generate_control_buttons(data.bot_id, false, refresh_status)), 17 | 18 | }); 19 | 20 | window.onresize = function () { 21 | $('#bot-table').dataTable().fnAdjustColumnSizing(); 22 | $('#bot-table').dataTable().fnDraw(); 23 | }; 24 | 25 | var $bt = $('#bot-table'); 26 | $(function () { 27 | load_file(RUNTIME_FILE, config => read_runtime_conf(config)); 28 | 29 | $bt.dataTable().fnClearTable(); 30 | 31 | // generate control buttons for every panel 32 | $("#botnet-panels [data-botnet-group]").each(function () { 33 | $(this).find("h4").data().waiting_count = 0; 34 | $(".panel-body .panel-div", $(this)).after(generate_control_buttons(false, $(this).attr("data-botnet-group"), refresh_status, true)); 35 | }); 36 | 37 | // fetch info from server 38 | reload_interval = new Interval(() => { 39 | $('#botnet-panels [data-botnet-group=botnet] [data-url=status]').click(); 40 | }, RELOAD_STATE_EVERY * 1000, true).call_now(); 41 | 42 | // 43 | $bt.on("click", 'tr td:first-child', event => click_link(MONITOR_BOT_URL.format(event.target.innerText), event)); 44 | }); 45 | 46 | 47 | function refresh_status(bot, finished) { 48 | if (reload_interval) { 49 | reload_interval.stop(); 50 | } 51 | 52 | // Refresh bot table 53 | let redraw_table = false; 54 | let pending = false; // any bot is in an unknown state 55 | for (let bot_id in bot_status) { 56 | let class_ = BOT_CLASS_DEFINITION[bot_status[bot_id]]; 57 | let status = bot_status[bot_id]; 58 | let $bot = $(`tr[data-bot-id=${bot_id}]`, $bt); 59 | if ($bot.length) { 60 | // row exist, just update the status 61 | if (!$bot.text() !== status) {// class of this bot changes (note that multiple statuses may share the same class ".warning") 62 | for (let state of Object.values(BOT_CLASS_DEFINITION)) { // remove any other status-class 63 | $bot.removeClass(state); 64 | } 65 | $bot.addClass(class_); 66 | $("td:eq(1)", $bot).text(status); 67 | } 68 | } else { 69 | $bt.dataTable().api().row.add({ 70 | bot_id, 71 | bot_status: status, 72 | actions: "", 73 | DT_RowClass: class_, 74 | DT_RowAttr: {"data-bot-id": bot_id} 75 | }); 76 | redraw_table = true; 77 | } 78 | if (status === BOT_STATUS_DEFINITION.unknown) { 79 | pending = true; 80 | } 81 | 82 | } 83 | if (finished) { 84 | // If there is some unknown bots, we re-ask the server to get current information immediately, else re-start the fetching interval. 85 | // (in case of botnets of 100 bots, intelmqctl returns 'unknown' state when bot couldn't start/stop in time) 86 | if (pending) { 87 | reload_interval.call_now(); 88 | } else { 89 | reload_interval.start(); 90 | } 91 | } 92 | 93 | // If there is a new row in the table, we ll redraw 94 | if (redraw_table) { 95 | $bt.dataTable().fnAdjustColumnSizing(); 96 | $bt.dataTable().fnDraw(); 97 | $('#botnet-panels [data-botnet-group]').show(); // showed on the first run 98 | } 99 | 100 | 101 | // Analyze botnet panels 102 | let atLeastOneStopped = {}; 103 | let atLeastOneRunning = {}; 104 | for (let bot_id in bot_status) { // analyze all bots status 105 | if (bot_status[bot_id] === BOT_STATUS_DEFINITION.stopped || bot_status[bot_id] === BOT_STATUS_DEFINITION.unknown) { 106 | atLeastOneStopped.botnet = atLeastOneStopped[bot_definition[bot_id].groupname] = true; 107 | } else if (bot_status[bot_id] === BOT_STATUS_DEFINITION.running) { 108 | atLeastOneRunning.botnet = atLeastOneRunning[bot_definition[bot_id].groupname] = true; 109 | } 110 | } 111 | let get_group_status = function (stopped, running) { 112 | if (stopped && running || !stopped && !running) { 113 | return BOT_STATUS_DEFINITION.incomplete; 114 | } else if (stopped && !running) { 115 | return BOT_STATUS_DEFINITION.stopped; 116 | } else if (!stopped && running) { 117 | return BOT_STATUS_DEFINITION.running; 118 | } 119 | }; 120 | 121 | // Highlight waiting icon of current panel if any operation is pending (we may click "start" and "stop", waiting both operations resolve) 122 | let $el; 123 | if (bot in botnet_status) { // bot button was clicked: highlight its panel (ex: Parsers) 124 | $el = $(this).closest(".panel").find("h4"); 125 | } else { // panel button was clicked 126 | $el = $(`.panel[data-botnet-group=${bot_definition[bot].groupname}]`).find("h4"); 127 | } 128 | $el.toggleClass("waiting", ($el.data().waiting_count += (finished === 0) ? 1 : -1) > 0); 129 | 130 | // Refresh botnet panels 131 | let waiting_total = 0; 132 | $("#botnet-panels > [data-botnet-group]").each(function () { 133 | waiting_total += $(this).find("h4").data().waiting_count; 134 | let botnet = $(this).attr("data-botnet-group"); 135 | botnet_status[botnet] = get_group_status(atLeastOneStopped[botnet], atLeastOneRunning[botnet]); 136 | $('[data-role=control-status]', this).trigger("update"); 137 | 138 | // due to esthetics, fetch the status-info to the line above 139 | if (($el = $(".control-buttons [data-role=control-status]", $(this)).clone())) { 140 | if ($el.text()) { 141 | $(".panel-div", $(this)).html("Status: " + ($el[0].outerHTML || 'Unknown')); 142 | } 143 | } 144 | }); 145 | 146 | // Highlight "Whole Botnet Status" operation in any panel is pending 147 | $('#botnet-panels [data-botnet-group=botnet] h4').toggleClass('waiting', waiting_total > 0); 148 | } 149 | -------------------------------------------------------------------------------- /intelmq_manager/static/js/network-configuration.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 IntelMQ Team , 2020 Edvard Rejthar , 2021 Mikk Margus Möll 2 | // 3 | // SPDX-License-Identifier: AGPL-3.0-or-later 4 | 5 | /** 6 | * Big variable options, passed to vis library. 7 | * There are also all the manipulation methods. 8 | */ 9 | 'use strict'; 10 | 11 | var NETWORK_OPTIONS = { 12 | physics: { 13 | hierarchicalRepulsion: { 14 | nodeDistance: 200, 15 | springLength: 200 16 | }, 17 | stabilization: { 18 | enabled: true, 19 | fit: true 20 | }, 21 | solver: 'hierarchicalRepulsion' 22 | }, 23 | interaction: { 24 | tooltipDelay: 1000, 25 | navigationButtons: true, 26 | keyboard: { 27 | bindToWindow: false 28 | } 29 | }, 30 | nodes: { 31 | font: { 32 | size: 14, // px 33 | face: 'arial', 34 | align: 'center' 35 | } 36 | }, 37 | edges: { 38 | length: 200, 39 | arrows: { 40 | to: {enabled: true, scaleFactor: 1, type: 'arrow'} 41 | }, 42 | physics: true, 43 | font: { 44 | size: 14, // px 45 | face: 'arial', 46 | }, 47 | color: { 48 | inherit: false 49 | }, 50 | smooth: { 51 | enabled: true, 52 | type: 'continuous' 53 | } 54 | }, 55 | groups: { 56 | Collector: { 57 | shape: 'box', 58 | color: GROUP_COLORS['Collector'][0], 59 | }, 60 | Parser: { 61 | shape: 'box', 62 | color: GROUP_COLORS['Parser'][0] 63 | }, 64 | Expert: { 65 | shape: 'box', 66 | color: GROUP_COLORS['Expert'][0], 67 | fontColor: "#FFFFFF" 68 | }, 69 | Output: { 70 | shape: 'box', 71 | color: GROUP_COLORS['Output'][0] 72 | } 73 | }, 74 | 75 | manipulation: { 76 | enabled: true, 77 | initiallyActive: true, 78 | editEdge: false, 79 | 80 | addNode: (data, callback) => create_form("Add Node", data, callback), 81 | editNode: function (data, callback) { 82 | create_form("Edit Node", data, callback); 83 | fill_bot(data.id, undefined, undefined); 84 | }, 85 | deleteNode: function (data, callback) { 86 | callback(data); 87 | let node_set = new Set(data.nodes); 88 | 89 | for (let edge_index of data.edges) { 90 | let [from, to, path] = from_edge_id(edge_index); 91 | if (!node_set.has(from)) { // otherwise handled by node deletion below 92 | remove_edge(from, to, path); 93 | } 94 | } 95 | 96 | for (let node_name of data.nodes) { 97 | delete app.nodes[node_name]; 98 | } 99 | set_pending_change(); 100 | }, 101 | addEdge: function (data, callback) { 102 | if (data.from === data.to) { 103 | show_error('This action would cause an infinite loop'); 104 | return; 105 | } 106 | 107 | if (data.path === undefined) 108 | data.path = '_default'; 109 | 110 | let edit_needed = false; // there is path name clash 111 | let occupied_values = new Set(); // prevent edges from overlapping 112 | let roundness = 0; 113 | 114 | let edge_id = to_edge_id(data.from, data.to, data.path); 115 | let source_paths = app.nodes[data.from].parameters.destination_queues; 116 | for (let path_id in source_paths) { 117 | if (source_paths[path_id].includes(`${data.to}-queue`)) { 118 | let smooth = app.network_data.edges.get(edge_id).smooth; 119 | occupied_values.add(smooth ? smooth.roundness : 0); 120 | 121 | if(path_id === data.path) { 122 | show_error('There is already a link between those bots with the same path, rename.'); 123 | edit_needed = true; 124 | } 125 | } 126 | } 127 | 128 | if (occupied_values.size) { 129 | while(occupied_values.has(roundness)) { 130 | roundness += 0.3; 131 | } 132 | data.smooth = {type: 'curvedCCW', roundness}; 133 | } 134 | 135 | let group_from = app.nodes[data.from].group; 136 | let group_to = app.nodes[data.to].group; 137 | let neighbors = ACCEPTED_NEIGHBORS[group_from]; 138 | let available_neighbor = false; 139 | 140 | if (neighbors.includes(group_to)) { 141 | data.id = edge_id; 142 | callback(data); 143 | available_neighbor = true; 144 | let cautious = CAUTIOUS_NEIGHBORS[group_from] ?? []; 145 | if (cautious.includes(group_to)) { 146 | show_error(`Node type ${group_from} can connect to the ${group_to}, however it's not so common.`); 147 | } 148 | } 149 | 150 | if (!available_neighbor) { 151 | if (neighbors.length === 0) { 152 | show_error(`Node type ${group_from} can't connect to other nodes`); 153 | } else { 154 | show_error(`Node type ${group_from} can only connect to nodes of types: ${neighbors.join()}`); 155 | } 156 | return; 157 | } 158 | 159 | add_edge(data.from, data.to, data.path); 160 | 161 | set_pending_change(data.from); 162 | if (edit_needed) { 163 | editPath(app, data.id, true); 164 | } 165 | }, 166 | deleteEdge: function (data, callback) { 167 | let [from, to, path] = from_edge_id(data.edges[0]); 168 | let queue = app.nodes[from].parameters.destination_queues[path]; 169 | remove_edge(from, to, path); 170 | 171 | set_pending_change(from); 172 | callback(data); 173 | } 174 | }, 175 | layout: { 176 | hierarchical: false, 177 | randomSeed: undefined 178 | } 179 | }; 180 | 181 | /** 182 | * Setting path name of a queue. If path already exists between bots, dialog re-appears. 183 | * If cancelled, previous path name is restored, or queue is deleted (if was just being added). 184 | * As this is not a standard-vis function, it has to be a separate method. 185 | * 186 | * @param app 187 | * @param edge id of the edge 188 | * @param adding True if edge is just being added (and shall be removed if we fail to provide a unique path name). 189 | */ 190 | function editPath(app, edge, adding=false) { 191 | let ok_clicked = false; 192 | let [from, to, original_path] = from_edge_id(edge); 193 | let nondefault_path = original_path === '_default' ? undefined : original_path; 194 | let new_path, nondefault_new_path; 195 | 196 | let $input = $("", {placeholder: "_default", val: nondefault_path}); 197 | popupModal("Set the edge name", $input, () => { 198 | let in_val = $input.val(); 199 | [new_path, nondefault_new_path] = (in_val && in_val !== '_default') ? [in_val, in_val] : ['_default', undefined]; 200 | if (original_path === new_path) { 201 | return; 202 | } 203 | 204 | ok_clicked = true; 205 | set_pending_change(); 206 | }).on("hide.bs.modal", () => { 207 | let from_queues = app.nodes[from].parameters.destination_queues[new_path] ?? []; 208 | let duplicate_edge = from_queues.includes(to); 209 | 210 | if (duplicate_edge) { 211 | if (ok_clicked) { 212 | show_error(`Could not add the queue ${new_path}, there already is such queue.`); 213 | return editPath(app, edge, adding); 214 | } else if(adding) { 215 | show_error(`Removing duplicate edge ${new_path}.`); 216 | } else { 217 | show_error("Keeping original path name."); 218 | return; 219 | } 220 | } 221 | 222 | if (ok_clicked) { 223 | let new_id = to_edge_id(from, to, new_path); 224 | 225 | remove_edge(from, to, original_path); 226 | app.network_data.edges.remove({id: edge}); 227 | 228 | add_edge(from, to, new_path); 229 | app.network_data.edges.add({id: new_id, from, to: to.replace(/-queue$/, ''), label: nondefault_new_path}); 230 | } 231 | }); 232 | } 233 | 234 | /** 235 | * As this is not a standard-vis function, it has to be a separate method. 236 | */ 237 | function duplicateNode(app, bot) { 238 | let new_id = gen_new_id(bot); 239 | 240 | // deep copy old bot information 241 | let node = $.extend(true, {}, app.nodes[bot]); 242 | app.positions[new_id] = app.positions[bot]; 243 | node.id = new_id; 244 | node.bot_id = new_id; 245 | app.nodes[new_id] = node; 246 | // add to the Vis and focus 247 | app.network_data.nodes.add(convert_nodes([node], true)); 248 | for (let edge of app.network.getConnectedEdges(bot).map(edge => app.network_data.edges.get(edge))) { 249 | let [old_from, old_to, path] = from_edge_id(edge.id); 250 | if (edge.from === bot) { 251 | edge.from = new_id; 252 | } 253 | else if (edge.to === bot) { 254 | edge.to = new_id; 255 | } 256 | edge.id = to_edge_id(edge.from, edge.to, path); 257 | app.network_data.edges.add(edge); 258 | } 259 | 260 | app.network.selectNodes([new_id]); 261 | app.network.focus(new_id); 262 | set_pending_change(); 263 | } 264 | 265 | function remove_edge(from, to, path) { 266 | let queues = app.nodes[from].parameters.destination_queues; 267 | let queue = queues[path]; 268 | let to_index = queue.indexOf(to); 269 | if (to_index !== -1) 270 | queue.splice(to_index, 1); 271 | 272 | if (queue.length === 0) 273 | delete queues[path]; 274 | } 275 | 276 | function add_edge(from, to, path) { 277 | if (!to.endsWith('-queue')) { 278 | to += '-queue'; 279 | } 280 | let queues = app.nodes[from].parameters.destination_queues; 281 | let queue = path in queues ? queues[path] : (queues[path] = []); 282 | queue.push(to); 283 | } 284 | -------------------------------------------------------------------------------- /intelmq_manager/static/js/positions.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | // 3 | // SPDX-License-Identifier: AGPL-3.0-or-later 4 | 5 | var app = app || {}; 6 | 7 | function generate_positions_conf() { 8 | var new_positions = app.network.getPositions(); 9 | new_positions = sortObjectByPropertyName(new_positions); 10 | 11 | new_positions.settings = settings; 12 | return JSON.stringify(new_positions, undefined, 4); 13 | } 14 | 15 | function read_positions_conf(config) { 16 | if("settings" in config) { // reload settings 17 | settings = config.settings; 18 | if (settings.physics === null) { 19 | settings.physics = Object.keys(app.nodes).length < 40; // disable physics by default when there are more then 40 bots 20 | } 21 | delete config.settings; 22 | } 23 | return config; 24 | } 25 | -------------------------------------------------------------------------------- /intelmq_manager/static/js/runtime.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | // 3 | // SPDX-License-Identifier: AGPL-3.0-or-later 4 | 'use strict'; 5 | 6 | var app = {}; // will be later redefined as a VisModel object or any other object (used in Configuration and Monitor tab) 7 | 8 | //TODO: add global 9 | function generate_runtime_conf(nodes, defaults) { 10 | 11 | let tmp_nodes = nodes; 12 | tmp_nodes.global = defaults; 13 | 14 | sortObjectByPropertyName(tmp_nodes); 15 | for (let id in tmp_nodes) { 16 | let node = tmp_nodes[id]; 17 | delete node.id; 18 | if ('parameters' in node) { 19 | sortObjectByPropertyName(node.parameters); 20 | } 21 | sortObjectByPropertyName(node); 22 | } 23 | 24 | return JSON.stringify(tmp_nodes, undefined, 4); 25 | } 26 | 27 | function read_runtime_conf(config) { 28 | bot_definition = config; 29 | let nodes = {}; 30 | for (let bot_id in config) { 31 | if (bot_id != 'global') { 32 | bot_definition[bot_id].groupname = GROUPNAME_TO_GROUP[bot_definition[bot_id].group]; // translate ex: `Parser` to `parsers` 33 | let bot = config[bot_id]; 34 | bot.bot_id = bot_id; 35 | 36 | if (!('enabled' in bot)) { 37 | bot.enabled = true; 38 | } 39 | 40 | if (!('run_mode' in bot)) { 41 | bot.run_mode = 'continuous'; 42 | } 43 | 44 | if (bot.parameters.destination_queues === undefined) { 45 | bot.parameters.destination_queues = {}; 46 | } 47 | 48 | nodes[bot_id] = bot; 49 | } 50 | } 51 | 52 | return nodes; 53 | } 54 | 55 | function load_file(url, callback) { 56 | let escaped_url = escape_html(url); 57 | authenticatedGetJson(url) 58 | .done(function (json) { 59 | try { 60 | callback(json); 61 | } 62 | catch(e) { 63 | // don't bother to display error, I think the problem will be clearly seen with the resource itself, not within the processing 64 | console.log(e); 65 | show_error(`Failed to load config file properly ${escaped_url}.`, true); 66 | } 67 | }) 68 | .fail(function (jqxhr, textStatus, error) { 69 | let err = escape_html(`${textStatus}, ${error}`); 70 | show_error(`Get an error ${err} when trying to obtain config file properly ${escaped_url}.`, true); 71 | callback({}); 72 | }); 73 | } 74 | 75 | 76 | // Configuration files fetching 77 | function load_configuration(callback = () => {}) { 78 | load_file(RUNTIME_FILE, (config) => { 79 | app.defaults = read_defaults_conf(config); 80 | app.nodes = read_runtime_conf(config); 81 | if (typeof read_positions_conf !== "undefined") { // skipped on Monitor tab 82 | load_file(POSITIONS_FILE, (config) => { 83 | app.positions = read_positions_conf(config); 84 | draw(); 85 | resize(); 86 | 87 | callback(); 88 | }); 89 | } else { 90 | callback(); 91 | } 92 | }); 93 | } 94 | -------------------------------------------------------------------------------- /intelmq_manager/static/js/sb-admin-2.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | // 3 | // SPDX-License-Identifier: AGPL-3.0-or-later 4 | 'use strict'; 5 | 6 | $(() => $('#side-menu').metisMenu()); 7 | 8 | //Loads the correct sidebar on window load, 9 | //collapses the sidebar on window resize. 10 | // Sets the min-height of #page-wrapper to window size 11 | 12 | function resize_handler() { 13 | var window_height = (this.window.innerHeight > 0) ? this.window.innerHeight : this.screen.height; 14 | var window_width = (this.window.innerWidth > 0) ? this.window.innerWidth : this.screen.width; 15 | 16 | // Resize body 17 | var body = document.getElementsByTagName('body')[0]; 18 | body.style.height = `${window_height}px`; 19 | body.style.width = `${window_width}px`; 20 | 21 | var container = document.getElementById('page-wrapper-with-sidebar') || document.getElementById('page-wrapper'); 22 | container.style.height = `${window_height - container.offsetTop}px`; 23 | container.style.width = `${window_width - container.offsetLeft}px`; 24 | container.style.overflowX = "auto"; 25 | container.style.overflowY = "auto"; 26 | 27 | var title_height = (window_height * 0.10); 28 | $('.page-header-text').css('font-size', `${title_height}px`); 29 | $('.page-header-text').css('line-height', `${title_height * 2}px`); 30 | 31 | let topOffset = 50; 32 | let width = window_width; 33 | if (width < 768) { 34 | $('div.navbar-collapse').addClass('collapse') 35 | topOffset = 100; // 2-row-menu 36 | } else { 37 | $('div.navbar-collapse').removeClass('collapse') 38 | } 39 | 40 | let height = window_height - topOffset; 41 | if (height < 1) height = 1; 42 | if (height > topOffset) { 43 | $("#page-wrapper").css("min-height", `${height}px`); 44 | } 45 | 46 | $('#side-menu').css('max-height', `${height}px`); 47 | $('#side-menu').css('overflow', 'auto'); 48 | } 49 | 50 | $(window).bind("load resize", resize_handler); 51 | -------------------------------------------------------------------------------- /intelmq_manager/static/less/management.less: -------------------------------------------------------------------------------- 1 | #botnet-panels > div.panel { 2 | .panel-div { 3 | margin-bottom: 16px; 4 | } 5 | } 6 | 7 | #botnet-status { 8 | padding: 8px; 9 | } 10 | 11 | #graph-container { 12 | margin-top: 16px; 13 | overflow: auto; 14 | } 15 | 16 | #bot-table-panel { 17 | overflow: auto; 18 | } -------------------------------------------------------------------------------- /intelmq_manager/static/less/sb-admin-2.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - SB Admin 2 Bootstrap Admin Theme (http://startbootstrap.com) 3 | * Code licensed under the Apache License v2.0. 4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0. 5 | */ 6 | 7 | body { 8 | background-color: #f8f8f8; 9 | overflow: auto; 10 | } 11 | 12 | @media(min-width:768px) { 13 | body { 14 | overflow: hidden; 15 | } 16 | } 17 | 18 | #page-wrapper { 19 | margin: 0px; 20 | padding: 0px; 21 | min-height: 568px; 22 | background-color: #fff; 23 | } 24 | 25 | #page-wrapper-with-sidebar { 26 | padding: 0px; 27 | min-height: 568px; 28 | background-color: #fff; 29 | } 30 | 31 | @media(min-width:768px) { 32 | #page-wrapper-with-sidebar { 33 | position: inherit; 34 | margin: 0 0 0 250px; 35 | padding: 0px; 36 | border-left: 1px solid #e7e7e7; 37 | } 38 | } 39 | 40 | .navbar-top-links li { 41 | display: inline-block; 42 | } 43 | 44 | .navbar-top-links li:last-child { 45 | margin-right: 15px; 46 | } 47 | 48 | .navbar-top-links li a { 49 | padding: 15px; 50 | min-height: 50px; 51 | } 52 | 53 | .navbar-top-links .dropdown-menu li { 54 | display: block; 55 | } 56 | 57 | .navbar-top-links .dropdown-menu li:last-child { 58 | margin-right: 0; 59 | } 60 | 61 | .navbar-top-links .dropdown-menu li a { 62 | padding: 3px 20px; 63 | min-height: 0; 64 | } 65 | 66 | .navbar-top-links .dropdown-menu li a div { 67 | white-space: normal; 68 | } 69 | 70 | .navbar-top-links .dropdown-messages, 71 | .navbar-top-links .dropdown-tasks, 72 | .navbar-top-links .dropdown-alerts { 73 | width: 310px; 74 | min-width: 0; 75 | } 76 | 77 | .navbar-top-links .dropdown-messages { 78 | margin-left: 5px; 79 | } 80 | 81 | .navbar-top-links .dropdown-tasks { 82 | margin-left: -59px; 83 | } 84 | 85 | .navbar-top-links .dropdown-alerts { 86 | margin-left: -123px; 87 | } 88 | 89 | .navbar-top-links .dropdown-user { 90 | right: 0; 91 | left: auto; 92 | } 93 | 94 | .sidebar .sidebar-nav.navbar-collapse { 95 | padding-right: 0; 96 | padding-left: 0; 97 | } 98 | 99 | .sidebar .sidebar-search { 100 | padding: 15px; 101 | } 102 | 103 | .sidebar ul li { 104 | border-bottom: 1px solid #e7e7e7; 105 | } 106 | 107 | .sidebar ul li a.active { 108 | background-color: #eee; 109 | } 110 | 111 | .sidebar .arrow { 112 | float: right; 113 | } 114 | 115 | .sidebar .fa.arrow:before { 116 | content: "\f104"; 117 | } 118 | 119 | .sidebar .active>a>.fa.arrow:before { 120 | content: "\f107"; 121 | } 122 | 123 | .sidebar .nav-second-level li, 124 | .sidebar .nav-third-level li { 125 | border-bottom: 0!important; 126 | } 127 | 128 | .sidebar .nav-second-level li a { 129 | padding-left: 37px; 130 | } 131 | 132 | .sidebar .nav-third-level li a { 133 | padding-left: 52px; 134 | } 135 | 136 | #customListItem{ 137 | border-bottom: none; 138 | padding-top: 10px; 139 | padding-bottom: 10px; 140 | text-align: center; 141 | } 142 | 143 | @media(min-width:768px) { 144 | .sidebar { 145 | z-index: 1; 146 | position: absolute; 147 | width: 250px; 148 | margin-top: 0px; 149 | } 150 | 151 | .navbar-top-links .dropdown-messages, 152 | .navbar-top-links .dropdown-tasks, 153 | .navbar-top-links .dropdown-alerts { 154 | margin-left: auto; 155 | } 156 | } 157 | 158 | .btn-outline { 159 | color: inherit; 160 | background-color: transparent; 161 | transition: all .5s; 162 | } 163 | 164 | .btn-primary.btn-outline { 165 | color: #428bca; 166 | } 167 | 168 | .btn-success.btn-outline { 169 | color: #5cb85c; 170 | } 171 | 172 | .btn-info.btn-outline { 173 | color: #5bc0de; 174 | } 175 | 176 | .btn-warning.btn-outline { 177 | color: #f0ad4e; 178 | } 179 | 180 | .btn-danger.btn-outline { 181 | color: #d9534f; 182 | } 183 | 184 | .btn-primary.btn-outline:hover, 185 | .btn-success.btn-outline:hover, 186 | .btn-info.btn-outline:hover, 187 | .btn-warning.btn-outline:hover, 188 | .btn-danger.btn-outline:hover { 189 | color: #fff; 190 | } 191 | 192 | .chat { 193 | margin: 0; 194 | padding: 0; 195 | list-style: none; 196 | } 197 | 198 | .chat li { 199 | margin-bottom: 10px; 200 | padding-bottom: 5px; 201 | border-bottom: 1px dotted #999; 202 | } 203 | 204 | .chat li.left .chat-body { 205 | margin-left: 60px; 206 | } 207 | 208 | .chat li.right .chat-body { 209 | margin-right: 60px; 210 | } 211 | 212 | .chat li .chat-body p { 213 | margin: 0; 214 | } 215 | 216 | .panel .slidedown .glyphicon, 217 | .chat .glyphicon { 218 | margin-right: 5px; 219 | } 220 | 221 | .chat-panel .panel-body { 222 | height: 350px; 223 | overflow-y: scroll; 224 | } 225 | 226 | .login-panel { 227 | margin-top: 25%; 228 | } 229 | 230 | .flot-chart { 231 | display: block; 232 | height: 400px; 233 | } 234 | 235 | .flot-chart-content { 236 | width: 100%; 237 | height: 100%; 238 | } 239 | 240 | table.dataTable thead .sorting, 241 | table.dataTable thead .sorting_asc, 242 | table.dataTable thead .sorting_desc { 243 | background: transparent; 244 | } 245 | 246 | table.dataTable thead .sorting_asc:after { 247 | content: "\f0de"; 248 | float: right; 249 | font-family: fontawesome; 250 | } 251 | 252 | table.dataTable thead .sorting_desc:after { 253 | content: "\f0dd"; 254 | float: right; 255 | font-family: fontawesome; 256 | } 257 | 258 | table.dataTable thead .sorting:after { 259 | content: "\f0dc"; 260 | float: right; 261 | font-family: fontawesome; 262 | color: rgba(50,50,50,.5); 263 | } 264 | 265 | .highlightHovering td:first-child:hover { 266 | font-weight: bold; 267 | cursor: pointer; 268 | } 269 | 270 | .btn-circle { 271 | width: 30px; 272 | height: 30px; 273 | padding: 6px 0; 274 | border-radius: 15px; 275 | text-align: center; 276 | font-size: 12px; 277 | line-height: 1.428571429; 278 | } 279 | 280 | .btn-circle.btn-lg { 281 | width: 50px; 282 | height: 50px; 283 | padding: 10px 16px; 284 | border-radius: 25px; 285 | font-size: 18px; 286 | line-height: 1.33; 287 | } 288 | 289 | .btn-circle.btn-xl { 290 | width: 70px; 291 | height: 70px; 292 | padding: 10px 16px; 293 | border-radius: 35px; 294 | font-size: 24px; 295 | line-height: 1.33; 296 | } 297 | 298 | .show-grid [class^=col-] { 299 | padding-top: 10px; 300 | padding-bottom: 10px; 301 | border: 1px solid #ddd; 302 | background-color: #eee!important; 303 | } 304 | 305 | .show-grid { 306 | margin: 15px 0; 307 | } 308 | 309 | .huge { 310 | font-size: 40px; 311 | } 312 | 313 | .panel-green { 314 | border-color: #5cb85c; 315 | } 316 | 317 | .panel-green .panel-heading { 318 | border-color: #5cb85c; 319 | color: #fff; 320 | background-color: #5cb85c; 321 | } 322 | 323 | .panel-green a { 324 | color: #5cb85c; 325 | } 326 | 327 | .panel-green a:hover { 328 | color: #3d8b3d; 329 | } 330 | 331 | .panel-red { 332 | border-color: #d9534f; 333 | } 334 | 335 | .panel-red .panel-heading { 336 | border-color: #d9534f; 337 | color: #fff; 338 | background-color: #d9534f; 339 | } 340 | 341 | .panel-red a { 342 | color: #d9534f; 343 | } 344 | 345 | .panel-red a:hover { 346 | color: #b52b27; 347 | } 348 | 349 | .panel-yellow { 350 | border-color: #f0ad4e; 351 | } 352 | 353 | .panel-yellow .panel-heading { 354 | border-color: #f0ad4e; 355 | color: #fff; 356 | background-color: #f0ad4e; 357 | } 358 | 359 | .panel-yellow a { 360 | color: #f0ad4e; 361 | } 362 | 363 | .panel-yellow a:hover { 364 | color: #df8a13; 365 | } 366 | 367 | .jumbotron { 368 | margin-bottom: 15px; 369 | margin-top: 15px; 370 | margin-left: auto; 371 | margin-right: auto; 372 | padding: 0px; 373 | text-align: center; 374 | height: 100%; 375 | max-width: 90%; 376 | } 377 | 378 | .jumbotron .page-header-text { 379 | background-color: #000000; 380 | background-size: contain; 381 | max-width: 100%; 382 | } 383 | 384 | .jumbotron .page-header-text span { 385 | color: #ffffff; 386 | text-align: center; 387 | height: 100%; 388 | } 389 | 390 | .jumbotron-row { 391 | margin-top: 15px; 392 | } 393 | 394 | .center-row { 395 | text-align: center; 396 | } 397 | 398 | .center-row-content { 399 | overflow: auto; 400 | display: inline-block; 401 | float: none; 402 | margin: auto; 403 | } 404 | 405 | .header-img img { 406 | height: 100px; 407 | padding: 5px; 408 | } 409 | 410 | .thumbnail img { 411 | width: 128px; 412 | height: 128px; 413 | padding: 15px; 414 | } 415 | 416 | .form-group { 417 | margin-bottom: 45px; 418 | } 419 | 420 | #bot-table td:first-child:hover { 421 | font-weight: bold; 422 | cursor: pointer; 423 | } 424 | 425 | #network-popUp { 426 | display:none; 427 | position:absolute; 428 | top:15%; 429 | left:5%; 430 | margin: auto; 431 | z-index:299; 432 | background-color: #FFFFFF; 433 | border-style:solid; 434 | border-width:3px; 435 | border-color: #5394ed; 436 | padding:10px; 437 | width:90%; 438 | text-align: center; 439 | } 440 | 441 | @media(min-width:768px) { 442 | #network-popUp { 443 | left: 25%; 444 | width: 50%; 445 | } 446 | } 447 | 448 | #network-popUp-fields { 449 | background: #FFFFFF; 450 | width: 100%; 451 | } 452 | 453 | #network-popUp-fields input { 454 | width: 100%; 455 | } 456 | 457 | #network-popUp-fields td { 458 | text-align: left; 459 | } 460 | 461 | form { 462 | display: inline-block; 463 | margin-bottom: 10px; 464 | } 465 | 466 | #border{ 467 | text-align: center !important; 468 | font-weight: bold; 469 | } 470 | 471 | #network-popUp-title { 472 | width: 100%; 473 | font-size:28px; 474 | display: inherit; 475 | } 476 | 477 | #network-row { 478 | display: none; 479 | height: 90%; 480 | } 481 | 482 | #network-row.col-xs-10 { 483 | height: 100%; 484 | } 485 | 486 | #network-row.col-xs-2 { 487 | height: 100%; 488 | } 489 | 490 | #network-tab { 491 | height: 100%; 492 | } 493 | 494 | .with-bot { 495 | max-height: 75%; 496 | overflow-y: auto; 497 | } 498 | 499 | .without-bot { 500 | 501 | } 502 | 503 | #logs-panel { 504 | margin-top: 15px; 505 | } 506 | 507 | #queues-panel { 508 | margin-top: 15px; 509 | } 510 | 511 | #queues-panel .width-80 { 512 | width: 80%; 513 | } 514 | 515 | #queues-panel .width-20 { 516 | width: 20%; 517 | } 518 | 519 | .waiting { 520 | background-image: url('../images/waiting.gif'); 521 | background-repeat: no-repeat; 522 | background-size: 16px; 523 | background-position: right 10px center; 524 | } 525 | 526 | .row { 527 | margin: 0px; 528 | } 529 | 530 | .navbar-config { 531 | margin-right: 16px; 532 | } 533 | 534 | .index-link:hover { 535 | text-decoration: none; 536 | box-shadow: 1px 1px 16px rgba(0, 0, 0, 1); 537 | } 538 | 539 | .index-link { 540 | display: block; 541 | box-shadow: 1px 1px 16px rgba(0, 0, 0, 0.20); 542 | } 543 | -------------------------------------------------------------------------------- /intelmq_manager/static/less/style.less: -------------------------------------------------------------------------------- 1 | /* 2 | * Navigation 3 | */ 4 | nav ul.nav.navbar-top-links li.active { 5 | color: #555; 6 | cursor: default; 7 | background-color: #fff; 8 | border: 1px solid #ddd; 9 | border-bottom-color: transparent 10 | } 11 | 12 | /* 13 | * Common elements 14 | */ 15 | #common-templates { 16 | display: none; 17 | } 18 | 19 | #wrapper .navbar #log-window { 20 | background-color: black; 21 | color: white; 22 | display: none; 23 | float: right; 24 | margin: 5px 5px; 25 | padding: 5px; 26 | width: 500px; 27 | height: 44px; 28 | overflow: hidden; 29 | resize: vertical; 30 | position: absolute; 31 | top: 0; 32 | right: 0; 33 | cursor: pointer; 34 | 35 | &.extended { 36 | height: auto; 37 | max-height: 100vh; 38 | // width: auto; 39 | cursor: unset; 40 | overflow-y: auto; 41 | } 42 | 43 | [role=close] { 44 | float: right; 45 | cursor: pointer; 46 | } 47 | 48 | .command { 49 | display: block; 50 | padding: 9.5px; 51 | margin: 0 0 10px; 52 | font-size: 13px; 53 | line-height: 1.42857143; 54 | color: #333; 55 | word-break: break-all; 56 | word-wrap: break-word; 57 | background-color: #f5f5f5; 58 | border: 1px solid #ccc; 59 | border-radius: 4px; 60 | overflow: auto; 61 | font-family: Menlo, Monaco, Consolas, "Courier New", monospace; 62 | } 63 | 64 | .alert a { 65 | text-decoration: underline; 66 | display: inline-block; 67 | padding: 4px; 68 | border: 1px solid #ccc; 69 | border-radius: 10px; 70 | } 71 | } 72 | 73 | .fa { 74 | font-family: FontAwesome; 75 | } 76 | 77 | .control-buttons [data-url=status] { 78 | display: none; // this button is normally hidden, used only in script; may be revealed if found useful 79 | } 80 | 81 | /* 82 | * Management page 83 | */ 84 | #botnet-panels>.panel[data-botnet-group] { 85 | display: none; // initially, all other panels are hidden 86 | 87 | &[data-botnet-group=botnet] { 88 | display: block; 89 | } 90 | } 91 | 92 | /* 93 | * Monitor page 94 | */ 95 | #botnet-panels .panel .control-buttons [data-role=control-status] { 96 | display: none; // this info is fetched out to line above 97 | } 98 | 99 | #inspect-panel { 100 | .control-buttons { 101 | float: right; 102 | } 103 | 104 | button[data-role="clear"] { 105 | float: right; 106 | } 107 | 108 | #command-show { 109 | display: none; 110 | } 111 | 112 | textarea { 113 | resize: vertical; 114 | } 115 | } 116 | 117 | /* 118 | * Config page 119 | */ 120 | 121 | #templates { 122 | display: none; 123 | } 124 | 125 | #side-menu {} 126 | 127 | #network-container { 128 | 129 | .control-buttons { 130 | float: left; 131 | 132 | button { 133 | height: 25px; 134 | 135 | span { 136 | top: -2px; 137 | } 138 | } 139 | } 140 | 141 | .monitor-button { 142 | 143 | //background-image: url('../plugins/vis.js/img/network/rightArrow.png'); 144 | //background-size: 24%; 145 | div a { 146 | color: black; 147 | } 148 | } 149 | 150 | .duplicate-button { 151 | background-image: url('../plugins/vis.js/img/network/addNodeIcon.png'); 152 | } 153 | 154 | .network-right-menu { 155 | >div { 156 | display: block; 157 | } 158 | 159 | .vis-live-toggle, 160 | .vis-physics-toggle { 161 | border-radius: 10px; 162 | position: absolute; 163 | right: 560px; 164 | top: 35px; 165 | white-space: nowrap; 166 | padding: 5px 0 5px 5px; 167 | cursor: pointer; 168 | 169 | &.running { 170 | //padding: 4px 0 4px 4px; 171 | //border:1px solid green; 172 | background-color: #00D000; 173 | } 174 | } 175 | 176 | .vis-live-toggle .icon { 177 | background-image: url("../images/monitor.png"); 178 | background-repeat: no-repeat; 179 | background-size: 30%; // this is a big image 180 | padding-left: 30px; 181 | padding-right: 15px; 182 | position: relative; 183 | z-index: 20; 184 | } 185 | 186 | .vis-physics-toggle { 187 | right: 480px; 188 | } 189 | } 190 | } -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/dataTables/dataTables.bootstrap.css: -------------------------------------------------------------------------------- 1 | div.dataTables_length label { 2 | float: left; 3 | text-align: left; 4 | font-weight: normal; 5 | } 6 | 7 | div.dataTables_length select { 8 | width: 75px; 9 | } 10 | 11 | div.dataTables_filter label { 12 | float: right; 13 | font-weight: normal; 14 | } 15 | 16 | div.dataTables_filter input { 17 | width: 16em; 18 | } 19 | 20 | div.dataTables_info { 21 | padding-top: 8px; 22 | } 23 | 24 | div.dataTables_paginate { 25 | float: right; 26 | margin: 0; 27 | } 28 | 29 | div.dataTables_paginate ul.pagination { 30 | margin: 2px 0; 31 | white-space: nowrap; 32 | } 33 | 34 | table.dataTable, 35 | table.dataTable td, 36 | table.dataTable th { 37 | -webkit-box-sizing: content-box; 38 | -moz-box-sizing: content-box; 39 | box-sizing: content-box; 40 | } 41 | 42 | table.dataTable { 43 | clear: both; 44 | margin-top: 6px !important; 45 | margin-bottom: 6px !important; 46 | max-width: none !important; 47 | } 48 | 49 | table.dataTable thead .sorting, 50 | table.dataTable thead .sorting_asc, 51 | table.dataTable thead .sorting_desc, 52 | table.dataTable thead .sorting_asc_disabled, 53 | table.dataTable thead .sorting_desc_disabled { 54 | cursor: pointer; 55 | } 56 | 57 | table.dataTable thead .sorting { 58 | background: url('../images/sort_both.png') no-repeat center right; 59 | } 60 | 61 | table.dataTable thead .sorting_asc { 62 | background: url('../images/sort_asc.png') no-repeat center right; 63 | } 64 | 65 | table.dataTable thead .sorting_desc { 66 | background: url('../images/sort_desc.png') no-repeat center right; 67 | } 68 | 69 | table.dataTable thead .sorting_asc_disabled { 70 | background: url('../images/sort_asc_disabled.png') no-repeat center right; 71 | } 72 | 73 | table.dataTable thead .sorting_desc_disabled { 74 | background: url('../images/sort_desc_disabled.png') no-repeat center right; 75 | } 76 | 77 | table.dataTable th:active { 78 | outline: none; 79 | } 80 | 81 | /* Scrolling */ 82 | 83 | div.dataTables_scrollHead table { 84 | margin-bottom: 0 !important; 85 | border-bottom-left-radius: 0; 86 | border-bottom-right-radius: 0; 87 | } 88 | 89 | div.dataTables_scrollHead table thead tr:last-child th:first-child, 90 | div.dataTables_scrollHead table thead tr:last-child td:first-child { 91 | border-bottom-left-radius: 0 !important; 92 | border-bottom-right-radius: 0 !important; 93 | } 94 | 95 | div.dataTables_scrollBody table { 96 | margin-top: 0 !important; 97 | margin-bottom: 0 !important; 98 | border-top: none; 99 | } 100 | 101 | div.dataTables_scrollBody tbody tr:first-child th, 102 | div.dataTables_scrollBody tbody tr:first-child td { 103 | border-top: none; 104 | } 105 | 106 | div.dataTables_scrollFoot table { 107 | margin-top: 0 !important; 108 | border-top: none; 109 | } 110 | 111 | /* 112 | * TableTools styles 113 | */ 114 | 115 | .table tbody tr.active td, 116 | .table tbody tr.active th { 117 | color: white; 118 | background-color: #08C; 119 | } 120 | 121 | .table tbody tr.active:hover td, 122 | .table tbody tr.active:hover th { 123 | background-color: #0075b0 !important; 124 | } 125 | 126 | .table tbody tr.active a { 127 | color: white; 128 | } 129 | 130 | .table-striped tbody tr.active:nth-child(odd) td, 131 | .table-striped tbody tr.active:nth-child(odd) th { 132 | background-color: #017ebc; 133 | } 134 | 135 | table.DTTT_selectable tbody tr { 136 | cursor: pointer; 137 | } 138 | 139 | div.DTTT .btn { 140 | font-size: 12px; 141 | color: #333 !important; 142 | } 143 | 144 | div.DTTT .btn:hover { 145 | text-decoration: none !important; 146 | } 147 | 148 | ul.DTTT_dropdown.dropdown-menu { 149 | z-index: 2003; 150 | } 151 | 152 | ul.DTTT_dropdown.dropdown-menu a { 153 | color: #333 !important; /* needed only when demo_page.css is included */ 154 | } 155 | 156 | ul.DTTT_dropdown.dropdown-menu li { 157 | position: relative; 158 | } 159 | 160 | ul.DTTT_dropdown.dropdown-menu li:hover a { 161 | color: white !important; 162 | background-color: #0088cc; 163 | } 164 | 165 | div.DTTT_collection_background { 166 | z-index: 2002; 167 | } 168 | 169 | /* TableTools information display */ 170 | 171 | div.DTTT_print_info.modal { 172 | height: 150px; 173 | margin-top: -75px; 174 | text-align: center; 175 | } 176 | 177 | div.DTTT_print_info h6 { 178 | margin: 1em; 179 | font-size: 28px; 180 | font-weight: normal; 181 | line-height: 28px; 182 | } 183 | 184 | div.DTTT_print_info p { 185 | font-size: 14px; 186 | line-height: 20px; 187 | } 188 | 189 | /* 190 | * FixedColumns styles 191 | */ 192 | 193 | div.DTFC_LeftHeadWrapper table, 194 | div.DTFC_LeftFootWrapper table, 195 | div.DTFC_RightHeadWrapper table, 196 | div.DTFC_RightFootWrapper table, 197 | table.DTFC_Cloned tr.even { 198 | background-color: white; 199 | } 200 | 201 | div.DTFC_RightHeadWrapper table, 202 | div.DTFC_LeftHeadWrapper table { 203 | margin-bottom: 0 !important; 204 | border-top-right-radius: 0 !important; 205 | border-bottom-left-radius: 0 !important; 206 | border-bottom-right-radius: 0 !important; 207 | } 208 | 209 | div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child, 210 | div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child, 211 | div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child, 212 | div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child { 213 | border-bottom-left-radius: 0 !important; 214 | border-bottom-right-radius: 0 !important; 215 | } 216 | 217 | div.DTFC_RightBodyWrapper table, 218 | div.DTFC_LeftBodyWrapper table { 219 | margin-bottom: 0 !important; 220 | border-top: none; 221 | } 222 | 223 | div.DTFC_RightBodyWrapper tbody tr:first-child th, 224 | div.DTFC_RightBodyWrapper tbody tr:first-child td, 225 | div.DTFC_LeftBodyWrapper tbody tr:first-child th, 226 | div.DTFC_LeftBodyWrapper tbody tr:first-child td { 227 | border-top: none; 228 | } 229 | 230 | div.DTFC_RightFootWrapper table, 231 | div.DTFC_LeftFootWrapper table { 232 | border-top: none; 233 | } -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/dataTables/dataTables.bootstrap.js: -------------------------------------------------------------------------------- 1 | /* Set the defaults for DataTables initialisation */ 2 | $.extend(true, $.fn.dataTable.defaults, { 3 | "sDom": "<'row'<'col-sm-6'l><'col-sm-6'f>r>" + "t" + "<'row'<'col-sm-6'i><'col-sm-6'p>>", 4 | "oLanguage": { 5 | "sLengthMenu": "_MENU_ records per page" 6 | } 7 | }); 8 | 9 | 10 | /* Default class modification */ 11 | $.extend($.fn.dataTableExt.oStdClasses, { 12 | "sWrapper": "dataTables_wrapper form-inline", 13 | "sFilterInput": "form-control input-sm", 14 | "sLengthSelect": "form-control input-sm" 15 | }); 16 | 17 | // In 1.10 we use the pagination renderers to draw the Bootstrap paging, 18 | // rather than custom plug-in 19 | if ($.fn.dataTable.Api) { 20 | $.fn.dataTable.defaults.renderer = 'bootstrap'; 21 | $.fn.dataTable.ext.renderer.pageButton.bootstrap = function(settings, host, idx, buttons, page, pages) { 22 | var api = new $.fn.dataTable.Api(settings); 23 | var classes = settings.oClasses; 24 | var lang = settings.oLanguage.oPaginate; 25 | var btnDisplay, btnClass; 26 | 27 | var attach = function(container, buttons) { 28 | var i, ien, node, button; 29 | var clickHandler = function(e) { 30 | e.preventDefault(); 31 | if (e.data.action !== 'ellipsis') { 32 | api.page(e.data.action).draw(false); 33 | } 34 | }; 35 | 36 | for (i = 0, ien = buttons.length; i < ien; i++) { 37 | button = buttons[i]; 38 | 39 | if ($.isArray(button)) { 40 | attach(container, button); 41 | } else { 42 | btnDisplay = ''; 43 | btnClass = ''; 44 | 45 | switch (button) { 46 | case 'ellipsis': 47 | btnDisplay = '…'; 48 | btnClass = 'disabled'; 49 | break; 50 | 51 | case 'first': 52 | btnDisplay = lang.sFirst; 53 | btnClass = button + (page > 0 ? 54 | '' : ' disabled'); 55 | break; 56 | 57 | case 'previous': 58 | btnDisplay = lang.sPrevious; 59 | btnClass = button + (page > 0 ? 60 | '' : ' disabled'); 61 | break; 62 | 63 | case 'next': 64 | btnDisplay = lang.sNext; 65 | btnClass = button + (page < pages - 1 ? 66 | '' : ' disabled'); 67 | break; 68 | 69 | case 'last': 70 | btnDisplay = lang.sLast; 71 | btnClass = button + (page < pages - 1 ? 72 | '' : ' disabled'); 73 | break; 74 | 75 | default: 76 | btnDisplay = button + 1; 77 | btnClass = page === button ? 78 | 'active' : ''; 79 | break; 80 | } 81 | 82 | if (btnDisplay) { 83 | node = $('
  • ', { 84 | 'class': classes.sPageButton + ' ' + btnClass, 85 | 'aria-controls': settings.sTableId, 86 | 'tabindex': settings.iTabIndex, 87 | 'id': idx === 0 && typeof button === 'string' ? settings.sTableId + '_' + button : null 88 | }) 89 | .append($('', { 90 | 'href': '#' 91 | }) 92 | .html(btnDisplay) 93 | ) 94 | .appendTo(container); 95 | 96 | settings.oApi._fnBindAction( 97 | node, { 98 | action: button 99 | }, clickHandler 100 | ); 101 | } 102 | } 103 | } 104 | }; 105 | 106 | attach( 107 | $(host).empty().html('
      ').children('ul'), 108 | buttons 109 | ); 110 | } 111 | } else { 112 | // Integration for 1.9- 113 | $.fn.dataTable.defaults.sPaginationType = 'bootstrap'; 114 | 115 | /* API method to get paging information */ 116 | $.fn.dataTableExt.oApi.fnPagingInfo = function(oSettings) { 117 | return { 118 | "iStart": oSettings._iDisplayStart, 119 | "iEnd": oSettings.fnDisplayEnd(), 120 | "iLength": oSettings._iDisplayLength, 121 | "iTotal": oSettings.fnRecordsTotal(), 122 | "iFilteredTotal": oSettings.fnRecordsDisplay(), 123 | "iPage": oSettings._iDisplayLength === -1 ? 0 : Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength), 124 | "iTotalPages": oSettings._iDisplayLength === -1 ? 0 : Math.ceil(oSettings.fnRecordsDisplay() / oSettings._iDisplayLength) 125 | }; 126 | }; 127 | 128 | /* Bootstrap style pagination control */ 129 | $.extend($.fn.dataTableExt.oPagination, { 130 | "bootstrap": { 131 | "fnInit": function(oSettings, nPaging, fnDraw) { 132 | var oLang = oSettings.oLanguage.oPaginate; 133 | var fnClickHandler = function(e) { 134 | e.preventDefault(); 135 | if (oSettings.oApi._fnPageChange(oSettings, e.data.action)) { 136 | fnDraw(oSettings); 137 | } 138 | }; 139 | 140 | $(nPaging).append( 141 | '' 145 | ); 146 | var els = $('a', nPaging); 147 | $(els[0]).bind('click.DT', { 148 | action: "previous" 149 | }, fnClickHandler); 150 | $(els[1]).bind('click.DT', { 151 | action: "next" 152 | }, fnClickHandler); 153 | }, 154 | 155 | "fnUpdate": function(oSettings, fnDraw) { 156 | var iListLength = 5; 157 | var oPaging = oSettings.oInstance.fnPagingInfo(); 158 | var an = oSettings.aanFeatures.p; 159 | var i, ien, j, sClass, iStart, iEnd, iHalf = Math.floor(iListLength / 2); 160 | 161 | if (oPaging.iTotalPages < iListLength) { 162 | iStart = 1; 163 | iEnd = oPaging.iTotalPages; 164 | } else if (oPaging.iPage <= iHalf) { 165 | iStart = 1; 166 | iEnd = iListLength; 167 | } else if (oPaging.iPage >= (oPaging.iTotalPages - iHalf)) { 168 | iStart = oPaging.iTotalPages - iListLength + 1; 169 | iEnd = oPaging.iTotalPages; 170 | } else { 171 | iStart = oPaging.iPage - iHalf + 1; 172 | iEnd = iStart + iListLength - 1; 173 | } 174 | 175 | for (i = 0, ien = an.length; i < ien; i++) { 176 | // Remove the middle elements 177 | $('li:gt(0)', an[i]).filter(':not(:last)').remove(); 178 | 179 | // Add the new list items and their event handlers 180 | for (j = iStart; j <= iEnd; j++) { 181 | sClass = (j == oPaging.iPage + 1) ? 'class="active"' : ''; 182 | $('
    • ' + j + '
    • ') 183 | .insertBefore($('li:last', an[i])[0]) 184 | .bind('click', function(e) { 185 | e.preventDefault(); 186 | oSettings._iDisplayStart = (parseInt($('a', this).text(), 10) - 1) * oPaging.iLength; 187 | fnDraw(oSettings); 188 | }); 189 | } 190 | 191 | // Add / remove disabled classes from the static elements 192 | if (oPaging.iPage === 0) { 193 | $('li:first', an[i]).addClass('disabled'); 194 | } else { 195 | $('li:first', an[i]).removeClass('disabled'); 196 | } 197 | 198 | if (oPaging.iPage === oPaging.iTotalPages - 1 || oPaging.iTotalPages === 0) { 199 | $('li:last', an[i]).addClass('disabled'); 200 | } else { 201 | $('li:last', an[i]).removeClass('disabled'); 202 | } 203 | } 204 | } 205 | } 206 | }); 207 | } 208 | 209 | 210 | /* 211 | * TableTools Bootstrap compatibility 212 | * Required TableTools 2.1+ 213 | */ 214 | if ($.fn.DataTable.TableTools) { 215 | // Set the classes that TableTools uses to something suitable for Bootstrap 216 | $.extend(true, $.fn.DataTable.TableTools.classes, { 217 | "container": "DTTT btn-group", 218 | "buttons": { 219 | "normal": "btn btn-default", 220 | "disabled": "disabled" 221 | }, 222 | "collection": { 223 | "container": "DTTT_dropdown dropdown-menu", 224 | "buttons": { 225 | "normal": "", 226 | "disabled": "disabled" 227 | } 228 | }, 229 | "print": { 230 | "info": "DTTT_print_info modal" 231 | }, 232 | "select": { 233 | "row": "active" 234 | } 235 | }); 236 | 237 | // Have the collection use a bootstrap compatible dropdown 238 | $.extend(true, $.fn.DataTable.TableTools.DEFAULTS.oTags, { 239 | "collection": { 240 | "container": "ul", 241 | "button": "li", 242 | "liner": "a" 243 | } 244 | }); 245 | } 246 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/font-awesome-4.1.0/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/font-awesome-4.1.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/font-awesome-4.1.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/font-awesome-4.1.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .pull-right { float: right; } 11 | .pull-left { float: left; } 12 | 13 | .@{fa-css-prefix} { 14 | &.pull-left { margin-right: .3em; } 15 | &.pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font-family: FontAwesome; 7 | font-style: normal; 8 | font-weight: normal; 9 | line-height: 1; 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | } 13 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "spinning.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: -@fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon-rotate(@degrees, @rotation) { 5 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); 6 | -webkit-transform: rotate(@degrees); 7 | -moz-transform: rotate(@degrees); 8 | -ms-transform: rotate(@degrees); 9 | -o-transform: rotate(@degrees); 10 | transform: rotate(@degrees); 11 | } 12 | 13 | .fa-icon-flip(@horiz, @vert, @rotation) { 14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); 15 | -webkit-transform: scale(@horiz, @vert); 16 | -moz-transform: scale(@horiz, @vert); 17 | -ms-transform: scale(@horiz, @vert); 18 | -o-transform: scale(@horiz, @vert); 19 | transform: scale(@horiz, @vert); 20 | } 21 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: ~"url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}')"; 7 | src: ~"url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype')", 8 | ~"url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff')", 9 | ~"url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype')", 10 | ~"url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg')"; 11 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/less/spinning.less: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: spin 2s infinite linear; 6 | -moz-animation: spin 2s infinite linear; 7 | -o-animation: spin 2s infinite linear; 8 | animation: spin 2s infinite linear; 9 | } 10 | 11 | @-moz-keyframes spin { 12 | 0% { -moz-transform: rotate(0deg); } 13 | 100% { -moz-transform: rotate(359deg); } 14 | } 15 | @-webkit-keyframes spin { 16 | 0% { -webkit-transform: rotate(0deg); } 17 | 100% { -webkit-transform: rotate(359deg); } 18 | } 19 | @-o-keyframes spin { 20 | 0% { -o-transform: rotate(0deg); } 21 | 100% { -o-transform: rotate(359deg); } 22 | } 23 | @keyframes spin { 24 | 0% { 25 | -webkit-transform: rotate(0deg); 26 | transform: rotate(0deg); 27 | } 28 | 100% { 29 | -webkit-transform: rotate(359deg); 30 | transform: rotate(359deg); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .pull-right { float: right; } 11 | .pull-left { float: left; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.pull-left { margin-right: .3em; } 15 | &.pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font-family: FontAwesome; 7 | font-style: normal; 8 | font-weight: normal; 9 | line-height: 1; 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | } 13 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon-rotate($degrees, $rotation) { 5 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 6 | -webkit-transform: rotate($degrees); 7 | -moz-transform: rotate($degrees); 8 | -ms-transform: rotate($degrees); 9 | -o-transform: rotate($degrees); 10 | transform: rotate($degrees); 11 | } 12 | 13 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 15 | -webkit-transform: scale($horiz, $vert); 16 | -moz-transform: scale($horiz, $vert); 17 | -ms-transform: scale($horiz, $vert); 18 | -o-transform: scale($horiz, $vert); 19 | transform: scale($horiz, $vert); 20 | } 21 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 9 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 10 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 11 | //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/scss/_spinning.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: spin 2s infinite linear; 6 | -moz-animation: spin 2s infinite linear; 7 | -o-animation: spin 2s infinite linear; 8 | animation: spin 2s infinite linear; 9 | } 10 | 11 | @-moz-keyframes spin { 12 | 0% { -moz-transform: rotate(0deg); } 13 | 100% { -moz-transform: rotate(359deg); } 14 | } 15 | @-webkit-keyframes spin { 16 | 0% { -webkit-transform: rotate(0deg); } 17 | 100% { -webkit-transform: rotate(359deg); } 18 | } 19 | @-o-keyframes spin { 20 | 0% { -o-transform: rotate(0deg); } 21 | 100% { -o-transform: rotate(359deg); } 22 | } 23 | @keyframes spin { 24 | 0% { 25 | -webkit-transform: rotate(0deg); 26 | transform: rotate(0deg); 27 | } 28 | 100% { 29 | -webkit-transform: rotate(359deg); 30 | transform: rotate(359deg); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/font-awesome-4.1.0/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "spinning"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/metisMenu/metisMenu.css: -------------------------------------------------------------------------------- 1 | /* 2 | * metismenu - v1.0.3 3 | * Easy menu jQuery plugin for Twitter Bootstrap 3 4 | * https://github.com/onokumus/metisMenu 5 | * 6 | * Made by Osman Nuri Okumuş 7 | * Under MIT License 8 | */ 9 | .arrow { 10 | float: right; 11 | } 12 | 13 | .glyphicon.arrow:before { 14 | content: "\e079"; 15 | } 16 | 17 | .active > a > .glyphicon.arrow:before { 18 | content: "\e114"; 19 | } 20 | 21 | 22 | /* 23 | * Require Font-Awesome 24 | * http://fortawesome.github.io/Font-Awesome/ 25 | */ 26 | 27 | 28 | .fa.arrow:before { 29 | content: "\f104"; 30 | } 31 | 32 | .active > a > .fa.arrow:before { 33 | content: "\f107"; 34 | } 35 | 36 | .plus-times { 37 | float: right; 38 | } 39 | 40 | .fa.plus-times:before { 41 | content: "\f067"; 42 | } 43 | 44 | .active > a > .fa.plus-times { 45 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); 46 | -webkit-transform: rotate(45deg); 47 | -moz-transform: rotate(45deg); 48 | -ms-transform: rotate(45deg); 49 | -o-transform: rotate(45deg); 50 | transform: rotate(45deg); 51 | } 52 | 53 | .plus-minus { 54 | float: right; 55 | } 56 | 57 | .fa.plus-minus:before { 58 | content: "\f067"; 59 | } 60 | 61 | .active > a > .fa.plus-minus:before { 62 | content: "\f068"; 63 | } -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/metisMenu/metisMenu.js: -------------------------------------------------------------------------------- 1 | /* 2 | * metismenu - v1.0.3 3 | * Easy menu jQuery plugin for Twitter Bootstrap 3 4 | * https://github.com/onokumus/metisMenu 5 | * 6 | * Made by Osman Nuri Okumuş 7 | * Under MIT License 8 | */ 9 | ;(function ($, window, document, undefined) { 10 | 11 | var pluginName = "metisMenu", 12 | defaults = { 13 | toggle: true 14 | }; 15 | 16 | function Plugin(element, options) { 17 | this.element = element; 18 | this.settings = $.extend({}, defaults, options); 19 | this._defaults = defaults; 20 | this._name = pluginName; 21 | this.init(); 22 | } 23 | 24 | Plugin.prototype = { 25 | init: function () { 26 | 27 | var $this = $(this.element), 28 | $toggle = this.settings.toggle; 29 | 30 | if (this.isIE() <= 9) { 31 | $this.find("li.active").has("ul").children("ul").collapse("show"); 32 | $this.find("li").not(".active").has("ul").children("ul").collapse("hide"); 33 | } else { 34 | $this.find("li.active").has("ul").children("ul").addClass("collapse in"); 35 | $this.find("li").not(".active").has("ul").children("ul").addClass("collapse"); 36 | } 37 | 38 | $this.find("li").has("ul").children("a").on("click", function (e) { 39 | e.preventDefault(); 40 | 41 | $(this).parent("li").toggleClass("active").children("ul").collapse("toggle"); 42 | 43 | if ($toggle) { 44 | $(this).parent("li").siblings().removeClass("active").children("ul.in").collapse("hide"); 45 | } 46 | }); 47 | }, 48 | 49 | isIE: function() {//https://gist.github.com/padolsey/527683 50 | var undef, 51 | v = 3, 52 | div = document.createElement("div"), 53 | all = div.getElementsByTagName("i"); 54 | 55 | while ( 56 | div.innerHTML = "", 57 | all[0] 58 | ) { 59 | return v > 4 ? v : undef; 60 | } 61 | } 62 | }; 63 | 64 | $.fn[ pluginName ] = function (options) { 65 | return this.each(function () { 66 | if (!$.data(this, "plugin_" + pluginName) || options['restart']) { 67 | $.data(this, "plugin_" + pluginName, new Plugin(this, options)); 68 | } 69 | }); 70 | }; 71 | 72 | })(jQuery, window, document); 73 | -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/metisMenu/metisMenu.min.css: -------------------------------------------------------------------------------- 1 | .arrow{float:right}.glyphicon.arrow:before{content:"\e079"}.active>a>.glyphicon.arrow:before{content:"\e114"}.fa.arrow:before{content:"\f104"}.active>a>.fa.arrow:before{content:"\f107"}.plus-times{float:right}.fa.plus-times:before{content:"\f067"}.active>a>.fa.plus-times{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.plus-minus{float:right}.fa.plus-minus:before{content:"\f067"}.active>a>.fa.plus-minus:before{content:"\f068"} -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/metisMenu/metisMenu.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * metismenu - v1.0.3 3 | * Easy menu jQuery plugin for Twitter Bootstrap 3 4 | * https://github.com/onokumus/metisMenu 5 | * 6 | * Made by Osman Nuri Okumuş 7 | * Under MIT License 8 | */ 9 | !function(a,b,c){function d(b,c){this.element=b,this.settings=a.extend({},f,c),this._defaults=f,this._name=e,this.init()}var e="metisMenu",f={toggle:!0};d.prototype={init:function(){var b=a(this.element),c=this.settings.toggle;this.isIE()<=9?(b.find("li.active").has("ul").children("ul").collapse("show"),b.find("li").not(".active").has("ul").children("ul").collapse("hide")):(b.find("li.active").has("ul").children("ul").addClass("collapse in"),b.find("li").not(".active").has("ul").children("ul").addClass("collapse")),b.find("li").has("ul").children("a").on("click",function(b){b.preventDefault(),a(this).parent("li").toggleClass("active").children("ul").collapse("toggle"),c&&a(this).parent("li").siblings().removeClass("active").children("ul.in").collapse("hide")})},isIE:function(){for(var a,b=3,d=c.createElement("div"),e=d.getElementsByTagName("i");d.innerHTML="",e[0];)return b>4?b:a}},a.fn[e]=function(b){return this.each(function(){a.data(this,"plugin_"+e)||a.data(this,"plugin_"+e,new d(this,b))})}}(jQuery,window,document); -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/acceptDeleteIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/acceptDeleteIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/addNodeIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/addNodeIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/backIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/backIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/connectIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/connectIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/cross.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/cross2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/cross2.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/deleteIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/deleteIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/downArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/downArrow.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/editIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/editIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/leftArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/leftArrow.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/minus.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/plus.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/rightArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/rightArrow.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/upArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/upArrow.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/graph/zoomExtends.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/graph/zoomExtends.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/acceptDeleteIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/acceptDeleteIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/addNodeIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/addNodeIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/backIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/backIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/connectIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/connectIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/cross.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/cross2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/cross2.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/deleteIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/deleteIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/downArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/downArrow.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/editIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/editIcon.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/leftArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/leftArrow.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/minus.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/plus.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/rightArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/rightArrow.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/upArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/upArrow.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/network/zoomExtends.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/network/zoomExtends.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/img/timeline/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/certtools/intelmq-manager/1b417160d3b528a98ef25f8b708e7722d575c4c7/intelmq_manager/static/plugins/vis.js/img/timeline/delete.png -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/vis-network.min.css: -------------------------------------------------------------------------------- 1 | .vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis [class*=span]{min-height:0;width:auto}div.vis-configuration{position:relative;display:block;float:left;font-size:12px}div.vis-configuration-wrapper{display:block;width:700px}div.vis-configuration-wrapper::after{clear:both;content:"";display:block}div.vis-configuration.vis-config-option-container{display:block;width:495px;background-color:#fff;border:2px solid #f7f8fa;border-radius:4px;margin-top:20px;left:10px;padding-left:5px}div.vis-configuration.vis-config-button{display:block;width:495px;height:25px;vertical-align:middle;line-height:25px;background-color:#f7f8fa;border:2px solid #ceced0;border-radius:4px;margin-top:20px;left:10px;padding-left:5px;cursor:pointer;margin-bottom:30px}div.vis-configuration.vis-config-button.hover{background-color:#4588e6;border:2px solid #214373;color:#fff}div.vis-configuration.vis-config-item{display:block;float:left;width:495px;height:25px;vertical-align:middle;line-height:25px}div.vis-configuration.vis-config-item.vis-config-s2{left:10px;background-color:#f7f8fa;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s3{left:20px;background-color:#e4e9f0;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s4{left:30px;background-color:#cfd8e6;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-header{font-size:18px;font-weight:700}div.vis-configuration.vis-config-label{width:120px;height:25px;line-height:25px}div.vis-configuration.vis-config-label.vis-config-s3{width:110px}div.vis-configuration.vis-config-label.vis-config-s4{width:100px}div.vis-configuration.vis-config-colorBlock{top:1px;width:30px;height:19px;border:1px solid #444;border-radius:2px;padding:0;margin:0;cursor:pointer}input.vis-configuration.vis-config-checkbox{left:-5px}input.vis-configuration.vis-config-rangeinput{position:relative;top:-5px;width:60px;padding:1px;margin:0;pointer-events:none}input.vis-configuration.vis-config-range{-webkit-appearance:none;border:0 solid #fff;background-color:rgba(0,0,0,0);width:300px;height:20px}input.vis-configuration.vis-config-range::-webkit-slider-runnable-track{width:300px;height:5px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-configuration.vis-config-range::-webkit-slider-thumb{-webkit-appearance:none;border:1px solid #14334b;height:17px;width:17px;border-radius:50%;background:#3876c2;background:-moz-linear-gradient(top,#3876c2 0,#385380 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#3876c2),color-stop(100%,#385380));background:-webkit-linear-gradient(top,#3876c2 0,#385380 100%);background:-o-linear-gradient(top,#3876c2 0,#385380 100%);background:-ms-linear-gradient(top,#3876c2 0,#385380 100%);background:linear-gradient(to bottom,#3876c2 0,#385380 100%);box-shadow:#111927 0 0 1px 0;margin-top:-7px}input.vis-configuration.vis-config-range:focus{outline:0}input.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track{background:#9d9d9d;background:-moz-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#9d9d9d),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-o-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:linear-gradient(to bottom,#9d9d9d 0,#c8c8c8 99%)}input.vis-configuration.vis-config-range::-moz-range-track{width:300px;height:10px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-configuration.vis-config-range::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}input.vis-configuration.vis-config-range::-ms-track{width:300px;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}input.vis-configuration.vis-config-range::-ms-fill-lower{background:#777;border-radius:10px}input.vis-configuration.vis-config-range::-ms-fill-upper{background:#ddd;border-radius:10px}input.vis-configuration.vis-config-range::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:focus::-ms-fill-lower{background:#888}input.vis-configuration.vis-config-range:focus::-ms-fill-upper{background:#ccc}.vis-configuration-popup{position:absolute;background:rgba(57,76,89,.85);border:2px solid #f2faff;line-height:30px;height:30px;width:150px;text-align:center;color:#fff;font-size:14px;border-radius:4px;-webkit-transition:opacity .3s ease-in-out;-moz-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.vis-configuration-popup:after,.vis-configuration-popup:before{left:100%;top:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.vis-configuration-popup:after{border-color:rgba(136,183,213,0);border-left-color:rgba(57,76,89,.85);border-width:8px;margin-top:-8px}.vis-configuration-popup:before{border-color:rgba(194,225,245,0);border-left-color:#f2faff;border-width:12px;margin-top:-12px}div.vis-tooltip{position:absolute;visibility:hidden;padding:5px;white-space:nowrap;font-family:verdana;font-size:14px;color:#000;background-color:#f5f4ed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border:1px solid #808074;box-shadow:3px 3px 10px rgba(0,0,0,.2);pointer-events:none;z-index:5}div.vis-color-picker{position:absolute;top:0;left:30px;margin-top:-140px;margin-left:30px;width:310px;height:444px;z-index:1;padding:10px;border-radius:15px;background-color:#fff;display:none;box-shadow:rgba(0,0,0,.5) 0 0 10px 0}div.vis-color-picker div.vis-arrow{position:absolute;top:147px;left:5px}div.vis-color-picker div.vis-arrow::after,div.vis-color-picker div.vis-arrow::before{right:100%;top:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}div.vis-color-picker div.vis-arrow:after{border-color:rgba(255,255,255,0);border-right-color:#fff;border-width:30px;margin-top:-30px}div.vis-color-picker div.vis-color{position:absolute;width:289px;height:289px;cursor:pointer}div.vis-color-picker div.vis-brightness{position:absolute;top:313px}div.vis-color-picker div.vis-opacity{position:absolute;top:350px}div.vis-color-picker div.vis-selector{position:absolute;top:137px;left:137px;width:15px;height:15px;border-radius:15px;border:1px solid #fff;background:#4c4c4c;background:-moz-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4c4c4c),color-stop(12%,#595959),color-stop(25%,#666),color-stop(39%,#474747),color-stop(50%,#2c2c2c),color-stop(51%,#000),color-stop(60%,#111),color-stop(76%,#2b2b2b),color-stop(91%,#1c1c1c),color-stop(100%,#131313));background:-webkit-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-o-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-ms-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:linear-gradient(to bottom,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%)}div.vis-color-picker div.vis-new-color{position:absolute;width:140px;height:20px;border:1px solid rgba(0,0,0,.1);border-radius:5px;top:380px;left:159px;text-align:right;padding-right:2px;font-size:10px;color:rgba(0,0,0,.4);vertical-align:middle;line-height:20px}div.vis-color-picker div.vis-initial-color{position:absolute;width:140px;height:20px;border:1px solid rgba(0,0,0,.1);border-radius:5px;top:380px;left:10px;text-align:left;padding-left:2px;font-size:10px;color:rgba(0,0,0,.4);vertical-align:middle;line-height:20px}div.vis-color-picker div.vis-label{position:absolute;width:300px;left:10px}div.vis-color-picker div.vis-label.vis-brightness{top:300px}div.vis-color-picker div.vis-label.vis-opacity{top:338px}div.vis-color-picker div.vis-button{position:absolute;width:68px;height:25px;border-radius:10px;vertical-align:middle;text-align:center;line-height:25px;top:410px;border:2px solid #d9d9d9;background-color:#f7f7f7;cursor:pointer}div.vis-color-picker div.vis-button.vis-cancel{left:5px}div.vis-color-picker div.vis-button.vis-load{left:82px}div.vis-color-picker div.vis-button.vis-apply{left:159px}div.vis-color-picker div.vis-button.vis-save{left:236px}div.vis-color-picker input.vis-range{width:290px;height:20px}div.vis-network div.vis-manipulation{box-sizing:content-box;border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);padding-top:4px;position:absolute;left:0;top:0;width:100%;height:28px}div.vis-network div.vis-edit-mode{position:absolute;left:0;top:5px;height:30px}div.vis-network div.vis-close{position:absolute;right:0;top:0;width:30px;height:30px;background-position:20px 3px;background-repeat:no-repeat;background-image:url(img/network/cross.png);cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-close:hover{opacity:.6}div.vis-network div.vis-edit-mode div.vis-button,div.vis-network div.vis-manipulation div.vis-button{float:left;font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;display:inline-block;background-position:0 0;background-repeat:no-repeat;height:24px;margin-left:10px;cursor:pointer;padding:0 8px 0 8px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-manipulation div.vis-button:hover{box-shadow:1px 1px 8px rgba(0,0,0,.2)}div.vis-network div.vis-manipulation div.vis-button:active{box-shadow:1px 1px 8px rgba(0,0,0,.5)}div.vis-network div.vis-manipulation div.vis-button.vis-back{background-image:url(img/network/backIcon.png)}div.vis-network div.vis-manipulation div.vis-button.vis-none:hover{box-shadow:1px 1px 8px transparent;cursor:default}div.vis-network div.vis-manipulation div.vis-button.vis-none:active{box-shadow:1px 1px 8px transparent}div.vis-network div.vis-manipulation div.vis-button.vis-none{padding:0}div.vis-network div.vis-manipulation div.notification{margin:2px;font-weight:700}div.vis-network div.vis-manipulation div.vis-button.vis-add{background-image:url(img/network/addNodeIcon.png)}div.vis-network div.vis-edit-mode div.vis-button.vis-edit,div.vis-network div.vis-manipulation div.vis-button.vis-edit{background-image:url(img/network/editIcon.png)}div.vis-network div.vis-edit-mode div.vis-button.vis-edit.vis-edit-mode{background-color:#fcfcfc;border:1px solid #ccc}div.vis-network div.vis-manipulation div.vis-button.vis-connect{background-image:url(img/network/connectIcon.png)}div.vis-network div.vis-manipulation div.vis-button.vis-delete{background-image:url(img/network/deleteIcon.png)}div.vis-network div.vis-edit-mode div.vis-label,div.vis-network div.vis-manipulation div.vis-label{margin:0 0 0 23px;line-height:25px}div.vis-network div.vis-manipulation div.vis-separator-line{float:left;display:inline-block;width:1px;height:21px;background-color:#bdbdbd;margin:0 7px 0 15px}div.vis-network div.vis-navigation div.vis-button{width:34px;height:34px;-moz-border-radius:17px;border-radius:17px;position:absolute;display:inline-block;background-position:2px 2px;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-navigation div.vis-button:hover{box-shadow:0 0 3px 3px rgba(56,207,21,.3)}div.vis-network div.vis-navigation div.vis-button:active{box-shadow:0 0 1px 3px rgba(56,207,21,.95)}div.vis-network div.vis-navigation div.vis-button.vis-up{background-image:url(img/network/upArrow.png);bottom:50px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-down{background-image:url(img/network/downArrow.png);bottom:10px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-left{background-image:url(img/network/leftArrow.png);bottom:10px;left:15px}div.vis-network div.vis-navigation div.vis-button.vis-right{background-image:url(img/network/rightArrow.png);bottom:10px;left:95px}div.vis-network div.vis-navigation div.vis-button.vis-zoomIn{background-image:url(img/network/plus.png);bottom:10px;right:15px}div.vis-network div.vis-navigation div.vis-button.vis-zoomOut{background-image:url(img/network/minus.png);bottom:10px;right:55px}div.vis-network div.vis-navigation div.vis-button.vis-zoomExtends{background-image:url(img/network/zoomExtends.png);bottom:50px;right:15px} -------------------------------------------------------------------------------- /intelmq_manager/static/plugins/vis.js/vis-timeline-graph2d.min.css: -------------------------------------------------------------------------------- 1 | .vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis [class*=span]{min-height:0;width:auto}div.vis-configuration{position:relative;display:block;float:left;font-size:12px}div.vis-configuration-wrapper{display:block;width:700px}div.vis-configuration-wrapper::after{clear:both;content:"";display:block}div.vis-configuration.vis-config-option-container{display:block;width:495px;background-color:#fff;border:2px solid #f7f8fa;border-radius:4px;margin-top:20px;left:10px;padding-left:5px}div.vis-configuration.vis-config-button{display:block;width:495px;height:25px;vertical-align:middle;line-height:25px;background-color:#f7f8fa;border:2px solid #ceced0;border-radius:4px;margin-top:20px;left:10px;padding-left:5px;cursor:pointer;margin-bottom:30px}div.vis-configuration.vis-config-button.hover{background-color:#4588e6;border:2px solid #214373;color:#fff}div.vis-configuration.vis-config-item{display:block;float:left;width:495px;height:25px;vertical-align:middle;line-height:25px}div.vis-configuration.vis-config-item.vis-config-s2{left:10px;background-color:#f7f8fa;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s3{left:20px;background-color:#e4e9f0;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s4{left:30px;background-color:#cfd8e6;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-header{font-size:18px;font-weight:700}div.vis-configuration.vis-config-label{width:120px;height:25px;line-height:25px}div.vis-configuration.vis-config-label.vis-config-s3{width:110px}div.vis-configuration.vis-config-label.vis-config-s4{width:100px}div.vis-configuration.vis-config-colorBlock{top:1px;width:30px;height:19px;border:1px solid #444;border-radius:2px;padding:0;margin:0;cursor:pointer}input.vis-configuration.vis-config-checkbox{left:-5px}input.vis-configuration.vis-config-rangeinput{position:relative;top:-5px;width:60px;padding:1px;margin:0;pointer-events:none}input.vis-configuration.vis-config-range{-webkit-appearance:none;border:0 solid #fff;background-color:rgba(0,0,0,0);width:300px;height:20px}input.vis-configuration.vis-config-range::-webkit-slider-runnable-track{width:300px;height:5px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-configuration.vis-config-range::-webkit-slider-thumb{-webkit-appearance:none;border:1px solid #14334b;height:17px;width:17px;border-radius:50%;background:#3876c2;background:-moz-linear-gradient(top,#3876c2 0,#385380 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#3876c2),color-stop(100%,#385380));background:-webkit-linear-gradient(top,#3876c2 0,#385380 100%);background:-o-linear-gradient(top,#3876c2 0,#385380 100%);background:-ms-linear-gradient(top,#3876c2 0,#385380 100%);background:linear-gradient(to bottom,#3876c2 0,#385380 100%);box-shadow:#111927 0 0 1px 0;margin-top:-7px}input.vis-configuration.vis-config-range:focus{outline:0}input.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track{background:#9d9d9d;background:-moz-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#9d9d9d),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-o-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:linear-gradient(to bottom,#9d9d9d 0,#c8c8c8 99%)}input.vis-configuration.vis-config-range::-moz-range-track{width:300px;height:10px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-configuration.vis-config-range::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}input.vis-configuration.vis-config-range::-ms-track{width:300px;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}input.vis-configuration.vis-config-range::-ms-fill-lower{background:#777;border-radius:10px}input.vis-configuration.vis-config-range::-ms-fill-upper{background:#ddd;border-radius:10px}input.vis-configuration.vis-config-range::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:focus::-ms-fill-lower{background:#888}input.vis-configuration.vis-config-range:focus::-ms-fill-upper{background:#ccc}.vis-configuration-popup{position:absolute;background:rgba(57,76,89,.85);border:2px solid #f2faff;line-height:30px;height:30px;width:150px;text-align:center;color:#fff;font-size:14px;border-radius:4px;-webkit-transition:opacity .3s ease-in-out;-moz-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.vis-configuration-popup:after,.vis-configuration-popup:before{left:100%;top:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.vis-configuration-popup:after{border-color:rgba(136,183,213,0);border-left-color:rgba(57,76,89,.85);border-width:8px;margin-top:-8px}.vis-configuration-popup:before{border-color:rgba(194,225,245,0);border-left-color:#f2faff;border-width:12px;margin-top:-12px}div.vis-tooltip{position:absolute;visibility:hidden;padding:5px;white-space:nowrap;font-family:verdana;font-size:14px;color:#000;background-color:#f5f4ed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border:1px solid #808074;box-shadow:3px 3px 10px rgba(0,0,0,.2);pointer-events:none;z-index:5}.vis-current-time{background-color:#ff7f6e;width:2px;z-index:1;pointer-events:none}.vis-rolling-mode-btn{height:40px;width:40px;position:absolute;top:7px;right:20px;border-radius:50%;font-size:28px;cursor:pointer;opacity:.8;color:#fff;font-weight:700;text-align:center;background:#3876c2}.vis-rolling-mode-btn:before{content:"\26F6"}.vis-rolling-mode-btn:hover{opacity:1}.vis-custom-time{background-color:#6e94ff;width:2px;cursor:move;z-index:1}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-horizontal{position:absolute;width:100%;height:0;border-bottom:1px solid}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-minor{border-color:#e5e5e5}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-major{border-color:#bfbfbf}.vis-data-axis .vis-y-axis.vis-major{width:100%;position:absolute;color:#4d4d4d;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-major.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-minor{position:absolute;width:100%;color:#bebebe;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-minor.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title{position:absolute;color:#4d4d4d;white-space:nowrap;bottom:20px;text-align:center}.vis-data-axis .vis-y-axis.vis-title.vis-measure{padding:0;margin:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title.vis-left{bottom:0;-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left bottom;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.vis-data-axis .vis-y-axis.vis-title.vis-right{bottom:0;-webkit-transform-origin:right bottom;-moz-transform-origin:right bottom;-ms-transform-origin:right bottom;-o-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.vis-legend{background-color:rgba(247,252,255,.65);padding:5px;border:1px solid #b3b3b3;box-shadow:2px 2px 10px rgba(154,154,154,.55)}.vis-legend-text{white-space:nowrap;display:inline-block}.vis-item{position:absolute;color:#1a1a1a;border-color:#97b0f8;border-width:1px;background-color:#d5ddf6;display:inline-block;z-index:1}.vis-item.vis-selected{border-color:#ffc200;background-color:#fff785;z-index:2}.vis-editable.vis-selected{cursor:move}.vis-item.vis-point.vis-selected{background-color:#fff785}.vis-item.vis-box{text-align:center;border-style:solid;border-radius:2px}.vis-item.vis-point{background:0 0}.vis-item.vis-dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis-item.vis-range{border-style:solid;border-radius:2px;box-sizing:border-box}.vis-item.vis-background{border:none;background-color:rgba(213,221,246,.4);box-sizing:border-box;padding:0;margin:0}.vis-item .vis-item-overflow{position:relative;width:100%;height:100%;padding:0;margin:0;overflow:hidden}.vis-item-visible-frame{white-space:nowrap}.vis-item.vis-range .vis-item-content{position:relative;display:inline-block}.vis-item.vis-background .vis-item-content{position:absolute;display:inline-block}.vis-item.vis-line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis-item .vis-item-content{white-space:nowrap;box-sizing:border-box;padding:5px}.vis-item .vis-onUpdateTime-tooltip{position:absolute;background:#4f81bd;color:#fff;width:200px;text-align:center;white-space:nowrap;padding:5px;border-radius:1px;transition:.4s;-o-transition:.4s;-moz-transition:.4s;-webkit-transition:.4s}.vis-item .vis-delete,.vis-item .vis-delete-rtl{position:absolute;top:0;width:24px;height:24px;box-sizing:border-box;padding:0 5px;cursor:pointer;-webkit-transition:background .2s linear;-moz-transition:background .2s linear;-ms-transition:background .2s linear;-o-transition:background .2s linear;transition:background .2s linear}.vis-item .vis-delete{right:-24px}.vis-item .vis-delete-rtl{left:-24px}.vis-item .vis-delete-rtl:after,.vis-item .vis-delete:after{content:"\00D7";color:red;font-family:arial,sans-serif;font-size:22px;font-weight:700;-webkit-transition:color .2s linear;-moz-transition:color .2s linear;-ms-transition:color .2s linear;-o-transition:color .2s linear;transition:color .2s linear}.vis-item .vis-delete-rtl:hover,.vis-item .vis-delete:hover{background:red}.vis-item .vis-delete-rtl:hover:after,.vis-item .vis-delete:hover:after{color:#fff}.vis-item .vis-drag-center{position:absolute;width:100%;height:100%;top:0;left:0;cursor:move}.vis-item.vis-range .vis-drag-left{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;left:-4px;cursor:w-resize}.vis-item.vis-range .vis-drag-right{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;right:-4px;cursor:e-resize}.vis-range.vis-item.vis-readonly .vis-drag-left,.vis-range.vis-item.vis-readonly .vis-drag-right{cursor:auto}.vis-itemset{position:relative;padding:0;margin:0;box-sizing:border-box}.vis-itemset .vis-background,.vis-itemset .vis-foreground{position:absolute;width:100%;height:100%;overflow:visible}.vis-axis{position:absolute;width:100%;height:0;left:0;z-index:1}.vis-foreground .vis-group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis-foreground .vis-group:last-child{border-bottom:none}.vis-nesting-group{cursor:pointer}.vis-nested-group{background:#f5f5f5}.vis-label.vis-nesting-group.expanded:before{content:"\25BC"}.vis-label.vis-nesting-group.collapsed-rtl:before{content:"\25C0"}.vis-label.vis-nesting-group.collapsed:before{content:"\25B6"}.vis-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-labelset{position:relative;overflow:hidden;box-sizing:border-box}.vis-labelset .vis-label{position:relative;left:0;top:0;width:100%;color:#4d4d4d;box-sizing:border-box}.vis-labelset .vis-label{border-bottom:1px solid #bfbfbf}.vis-labelset .vis-label.draggable{cursor:pointer}.vis-labelset .vis-label:last-child{border-bottom:none}.vis-labelset .vis-label .vis-inner{display:inline-block;padding:5px}.vis-labelset .vis-label .vis-inner.vis-hidden{padding:0}.vis-panel{position:absolute;padding:0;margin:0;box-sizing:border-box}.vis-panel.vis-bottom,.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right,.vis-panel.vis-top{border:1px #bfbfbf}.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis-left.vis-panel.vis-vertical-scroll,.vis-right.vis-panel.vis-vertical-scroll{height:100%;overflow-x:hidden;overflow-y:scroll}.vis-left.vis-panel.vis-vertical-scroll{direction:rtl}.vis-left.vis-panel.vis-vertical-scroll .vis-content{direction:ltr}.vis-right.vis-panel.vis-vertical-scroll{direction:ltr}.vis-right.vis-panel.vis-vertical-scroll .vis-content{direction:rtl}.vis-panel.vis-bottom,.vis-panel.vis-center,.vis-panel.vis-top{border-left-style:solid;border-right-style:solid}.vis-background{overflow:hidden}.vis-panel>.vis-content{position:relative}.vis-panel .vis-shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px rgba(0,0,0,.8)}.vis-panel .vis-shadow.vis-top{top:-1px;left:0}.vis-panel .vis-shadow.vis-bottom{bottom:-1px;left:0}.vis-graph-group0{fill:#4f81bd;fill-opacity:0;stroke-width:2px;stroke:#4f81bd}.vis-graph-group1{fill:#f79646;fill-opacity:0;stroke-width:2px;stroke:#f79646}.vis-graph-group2{fill:#8c51cf;fill-opacity:0;stroke-width:2px;stroke:#8c51cf}.vis-graph-group3{fill:#75c841;fill-opacity:0;stroke-width:2px;stroke:#75c841}.vis-graph-group4{fill:#ff0100;fill-opacity:0;stroke-width:2px;stroke:#ff0100}.vis-graph-group5{fill:#37d8e6;fill-opacity:0;stroke-width:2px;stroke:#37d8e6}.vis-graph-group6{fill:#042662;fill-opacity:0;stroke-width:2px;stroke:#042662}.vis-graph-group7{fill:#00ff26;fill-opacity:0;stroke-width:2px;stroke:#00ff26}.vis-graph-group8{fill:#f0f;fill-opacity:0;stroke-width:2px;stroke:#f0f}.vis-graph-group9{fill:#8f3938;fill-opacity:0;stroke-width:2px;stroke:#8f3938}.vis-timeline .vis-fill{fill-opacity:.1;stroke:none}.vis-timeline .vis-bar{fill-opacity:.5;stroke-width:1px}.vis-timeline .vis-point{stroke-width:2px;fill-opacity:1}.vis-timeline .vis-legend-background{stroke-width:1px;fill-opacity:.9;fill:#fff;stroke:#c2c2c2}.vis-timeline .vis-outline{stroke-width:1px;fill-opacity:1;fill:#fff;stroke:#e5e5e5}.vis-timeline .vis-icon-fill{fill-opacity:.3;stroke:none}.vis-time-axis{position:relative;overflow:hidden}.vis-time-axis.vis-foreground{top:0;left:0;width:100%}.vis-time-axis.vis-background{position:absolute;top:0;left:0;width:100%;height:100%}.vis-time-axis .vis-text{position:absolute;color:#4d4d4d;padding:3px;overflow:hidden;box-sizing:border-box;white-space:nowrap}.vis-time-axis .vis-text.vis-measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis-time-axis .vis-grid.vis-vertical{position:absolute;border-left:1px solid}.vis-time-axis .vis-grid.vis-vertical-rtl{position:absolute;border-right:1px solid}.vis-time-axis .vis-grid.vis-minor{border-color:#e5e5e5}.vis-time-axis .vis-grid.vis-major{border-color:#bfbfbf}.vis-timeline{position:relative;border:1px solid #bfbfbf;overflow:hidden;padding:0;margin:0;box-sizing:border-box} -------------------------------------------------------------------------------- /intelmq_manager/templates/about.mako: -------------------------------------------------------------------------------- 1 | ## SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | ## SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | <%inherit file="base.mako" /> 5 | 6 | 7 |
      8 |
      9 |
       
      10 |
      11 | IntelMQ 12 |

      IntelMQ is a solution for IT security teams (CERTs, CSIRTs, abuse departments,...) 13 | for collecting and processing security feeds (such as log files) using a message queuing 14 | protocol. It's a community driven initiative called IHAP (Incident 15 | Handling Automation Project) which was conceptually designed by European 16 | CERTs/CSIRTs during several InfoSec events. Its main goal is to give to 17 | incident responders an easy way to collect & process threat intelligence 18 | thus improving the incident handling processes of CERTs.

      19 |

      IntelMQ's design was influenced by 20 | AbuseHelper, 21 | however it was re-written from scratch and aims at:

      22 |
        23 |
      • Reduce the complexity of system administration
      • 24 |
      • Reduce the complexity of writing new bots for new data feeds
      • 25 |
      • Reduce the probability of events lost in all process with persistence 26 | functionality (even system crash)
      • 27 |
      • Use and improve the existing Data Harmonization Ontology
      • 28 |
      • Use JSON format for all messages
      • 29 |
      • Integration of the existing tools (AbuseHelper, CIF)
      • 30 |
      • Provide easy way to store data into Log Collectors like 31 | ElasticSearch, Splunk, databases (such as PostgreSQL)
      • 32 |
      • Provide easy way to create your own black-lists
      • 33 |
      • Provide easy communication with other systems via HTTP RESTFUL API
      • 34 |
      35 |

      It follows the following basic meta-guidelines:

      36 |
        37 |
      • Don't break simplicity - KISS
      • 38 |
      • Keep it open source - forever
      • 39 |
      • Strive for perfection while keeping a deadline
      • 40 |
      • Reduce complexity/avoid feature bloat
      • 41 |
      • Embrace unit testing
      • 42 |
      • Code readability: test with unexperienced programmers
      • 43 |
      • Communicate clearly
      • 44 |
      45 |
      46 |
       
      47 |
      48 |
      49 |
       
      50 |
      51 |

      Version

      52 | 53 | 54 | 55 | 56 |
      IntelMQ
      IntelMQ API
      IntelMQ Manager
      57 |
      58 |
      59 |
      60 |
       
      61 |
      62 |

      Debugging

      63 |
      64 |
      65 |
      66 | -------------------------------------------------------------------------------- /intelmq_manager/templates/base.mako: -------------------------------------------------------------------------------- 1 | ## SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | ## SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | <%! 5 | import collections 6 | 7 | Page = collections.namedtuple("Page", ["name", "title", "icon", "libraries"]) 8 | pages = [Page("configs", "Configuration", "config.png", 9 | ["plugins/vis.js/vis.js", 10 | "js/runtime.js", 11 | "js/positions.js", 12 | "js/defaults.js", 13 | "js/network-configuration.js", 14 | "js/configs.js", 15 | ]), 16 | Page("management", "Management", "botnet.png", 17 | ["js/runtime.js", "js/management.js"]), 18 | Page("monitor", "Monitor", "monitor.png", 19 | ["js/runtime.js", 20 | "js/defaults.js", 21 | "js/monitor.js"]), 22 | Page("check", "Check", "check.png", ["js/check.js"]), 23 | Page("about", "About", "about.png", ["js/about.js"])] 24 | 25 | common_libraries = [ 26 | "js/dynvar.js", 27 | "js/var.js", 28 | "js/intelmq-manager.js", 29 | "js/static.js", 30 | "js/sb-admin-2.js", 31 | ## XX this don't have to be on every page: 32 | "plugins/dataTables/jquery.dataTables.js", 33 | "plugins/dataTables/dataTables.bootstrap.js", 34 | ] 35 | 36 | page_map = {page.name: page for page in pages} 37 | page_map["index"] = Page("index", "", "", []) 38 | %> 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | IntelMQ Manager 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 80 | 81 | 82 | 83 | 84 |
      85 | 86 | 87 | 115 | 116 | 153 | 154 | ${next.body()} 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | % for lib in common_libraries + page_map[pagename].libraries: 166 | 167 | % endfor 168 | ?> 169 | 170 |
      171 |
      172 |
      173 | 174 | 175 | 176 | 177 | 178 |
      179 |
      180 | 181 | 182 | -------------------------------------------------------------------------------- /intelmq_manager/templates/check.mako: -------------------------------------------------------------------------------- 1 | ## SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | ## SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | <%inherit file="base.mako" /> 5 | 6 | 7 |
      8 |
      9 |
       
      10 |
      11 | This tab asks intelmqctl for check subcommand. 12 |
      13 |
       
      14 |
      15 |
      16 |
       
      17 |
      18 |

      Check output

      19 | 20 | 21 |
      ...
      22 |
      23 |
      24 |
      25 | -------------------------------------------------------------------------------- /intelmq_manager/templates/configs.mako: -------------------------------------------------------------------------------- 1 | ## SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | ## SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | <%inherit file="base.mako" /> 5 | 6 | 13 | 14 | 15 | 16 |
      17 |
      18 |
      19 | Loading... 20 |
      21 |
      22 |
      23 | 24 |
      25 | node 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
      id
      name
      group
      module
      description
      run_mode
      49 |
      50 |
      51 | 52 |
      53 |
      54 | 55 |
      56 |
      57 |
      58 | 59 | 60 |
      61 |
        62 |
      • 63 | 64 | 69 |
      • 70 |
      71 | 72 | 89 | 103 | 104 |
      105 |
      106 |
      107 | Edit Path 108 |
      109 |
      110 |
      111 |
      112 |
      113 |
      114 | Duplicate 115 |
      116 |
      117 |
      118 |
      119 |
      120 | 121 | 122 | 123 |
      124 |
      125 |
      126 |
      127 |
      128 |
      129 | Live 130 |
      131 |
      132 |
      133 |
      134 | Physics 135 |
      136 |
      137 |
      138 |
      139 | Save Configuration 140 |
      141 |
      142 |
      143 |
      144 | Clear Configuration 145 |
      146 |
      147 |
      148 |
      149 | Redraw Botnet 150 |
      151 |
      152 | 153 |
      154 |
      155 | -------------------------------------------------------------------------------- /intelmq_manager/templates/dynvar.mako: -------------------------------------------------------------------------------- 1 | ## SPDX-FileCopyrightText: 2021 Mikk Margus Möll 2 | ## SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | var ALLOWED_PATH = "${allowed_path}"; 5 | var CONTROLLER_CMD = "${controller_cmd}"; 6 | -------------------------------------------------------------------------------- /intelmq_manager/templates/index.mako: -------------------------------------------------------------------------------- 1 | ## SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | ## SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | <%inherit file="base.mako" /> 5 | 6 | 7 | 91 | -------------------------------------------------------------------------------- /intelmq_manager/templates/management.mako: -------------------------------------------------------------------------------- 1 | ## SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | ## SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | <%inherit file="base.mako" /> 5 | 6 | 7 |
      8 |
      9 |
      10 |
      11 |
      12 |
      13 |

      Whole Botnet Status:

      14 |
      15 |
      16 |
      Status: Unknown
      17 |
      18 |
      19 | 20 |
      21 |
      22 |

      Collectors Status:

      23 |
      24 |
      25 |
      Status: Unknown
      26 |
      27 |
      28 | 29 |
      30 |
      31 |

      Parsers Status:

      32 |
      33 |
      34 |
      Status: Unknown
      35 |
      36 |
      37 | 38 |
      39 |
      40 |

      Experts Status:

      41 |
      42 |
      43 |
      Status: Unknown
      44 |
      45 |
      46 | 47 |
      48 |
      49 |

      Outputs Status:

      50 |
      51 |
      52 |
      Status: Unknown
      53 |
      54 |
      55 |
      56 |
      57 |
      58 |
      59 |

      Individual Bot Status:

      60 |
      61 |
      62 |
      63 | 64 | 65 | 66 | 67 | 68 | 69 |
      Bot IDStatusActions
      70 |
      71 |
      72 |
      73 |
      74 |
      75 |
      76 |
      77 | -------------------------------------------------------------------------------- /intelmq_manager/templates/monitor.mako: -------------------------------------------------------------------------------- 1 | ## SPDX-FileCopyrightText: 2020 IntelMQ Team 2 | ## SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | <%inherit file="base.mako" /> 5 | 6 | 12 | 13 | 14 | 15 |
      16 |
      17 |

      Monitoring: All

      18 |
      19 |
      20 |
      21 |
      22 |

      Queues

      23 |
      24 |
      25 |
      26 | 27 | 28 | 29 | 30 | 31 | 32 |
      Source QueueCount
      33 |
      34 |
      35 | 36 | 37 | 38 | 39 | 40 | 41 |
      Internal QueueCount
      42 |
      43 |
      44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 |
      Destination QueuePathCount
      57 |
      58 |
      59 |
      60 |
      61 |
      62 |
      63 |
      64 |

      Inspect

      65 |
      66 |
      67 |
      Message 68 | 69 | 70 | 71 | 72 |
      73 | 74 |
      75 | 76 | 80 | 84 | 88 | 89 |

      90 | 91 | 92 | 93 |
      94 |
      95 |
      96 |
      97 |
      98 |
      99 |
      100 |

      Logs

      101 |
      102 |
      103 |
      Log Level:
      111 |
      112 |
      113 | 114 | 115 | 116 | 117 | 118 | 119 |
      TimeIDLevelMessage
      120 |
      121 |
      122 |
      123 |
      124 |
      125 |
      126 |
      127 |

      Parameters

      128 |
      129 |
      130 | .. loading .. 131 |
      132 |
      133 |
      134 |
      135 |
      136 |
      137 | 138 | 139 | 151 | -------------------------------------------------------------------------------- /intelmq_manager/version.py: -------------------------------------------------------------------------------- 1 | """ Version file for intelmq-manager 2 | 3 | SPDX-FileCopyrightText: 2020-2021 Intelmq Team , 2022-2023 Intevation GmbH 4 | SPDX-License-Identifier: AGPL-3.0-or-later 5 | """ 6 | __version_info__ = (3, 3, 0) 7 | __version__ = '.'.join(map(str, __version_info__)) 8 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | # Pyproject for intelmq-manager 2 | # 3 | # SPDX-FileCopyrightText: 2020 IntelMQ Team 4 | # SPDX-License-Identifier: AGPL-3.0-or-later 5 | 6 | [build-system] 7 | requires = ["setuptools", "wheel", "mako>=1.0.7"] 8 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | """ 2 | Setup file for intelmq-manager 3 | 4 | SPDX-FileCopyrightText: 2020 IntelMQ Team 5 | SPDX-License-Identifier: AGPL-3.0-or-later 6 | """ 7 | 8 | from setuptools import find_packages, setup 9 | 10 | from intelmq_manager.version import __version__ 11 | 12 | 13 | setup( 14 | name="intelmq-manager", 15 | maintainer='IntelMQ Team', 16 | maintainer_email='intelmq-team@cert.at', 17 | version=__version__, 18 | python_requires='>=3.5', 19 | packages=find_packages(), 20 | install_requires=[ 21 | "intelmq-api", 22 | "mako", 23 | ], 24 | include_package_data=True, 25 | url='https://github.com/certtools/intelmq-manager/', 26 | description=("IntelMQ Manager is a graphical interface to manage" 27 | " configurations for the IntelMQ framework."), 28 | data_files=[('/etc/intelmq', ['contrib/manager-apache.conf'])], # required for deb packaging 29 | package_data={'': ('manager-apache.conf', # works for the wheel package 30 | 'templates/*', 31 | 'static/css/*', 32 | 'static/images/*', 33 | 'static/js/*', 34 | 'static/less/*', 35 | 'static/plugins/*', 36 | 'static/plugins/bootstrap/*', 37 | 'static/plugins/dataTables/*', 38 | 'static/plugins/font-awesome-4.1.0/*', 39 | 'static/plugins/font-awesome-4.1.0/css/*', 40 | 'static/plugins/font-awesome-4.1.0/fonts/*', 41 | 'static/plugins/font-awesome-4.1.0/less/*', 42 | 'static/plugins/font-awesome-4.1.0/scss/*', 43 | 'static/plugins/fonts/*', 44 | 'static/plugins/metisMenu/*', 45 | 'static/plugins/vis.js/*', 46 | 'static/plugins/vis.js/img/*', 47 | 'static/plugins/vis.js/img/graph/*', 48 | 'static/plugins/vis.js/img/network/*', 49 | 'static/plugins/vis.js/img/timeline/*', 50 | )}, 51 | entry_points={ 52 | 'console_scripts': [ 53 | 'intelmq-manager-build = intelmq_manager.build:main', 54 | ], 55 | }, 56 | ) 57 | --------------------------------------------------------------------------------