├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── build-issue.md │ ├── feature_request.md │ └── question.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── LICENSE ├── README.html ├── README.md ├── doc └── steup-temp.txt ├── pom.xml └── src └── main ├── java └── com │ └── zookeeper │ └── zkadmin │ ├── common │ ├── TemplateConfigs.java │ └── ZKAdminConstants.java │ ├── controller │ ├── exception │ │ └── WebExceptionHandler.java │ ├── filter │ │ └── CORSFilter.java │ ├── manager │ │ ├── ClusterInfoController.java │ │ ├── ClusterStatusController.java │ │ └── NodeInfoController.java │ ├── monitor │ │ └── AlarmSettingController.java │ └── system │ │ └── SystemController.java │ ├── core │ ├── GlobalInstance.java │ ├── InitSystemManager.java │ ├── ThreadPoolManager.java │ ├── parser │ │ ├── Parser.java │ │ └── impl │ │ │ ├── ConsParser.java │ │ │ ├── MntrParser.java │ │ │ ├── RuokParser.java │ │ │ ├── SrvrParser.java │ │ │ └── WchcParser.java │ └── task │ │ ├── ZKMessageSender.java │ │ ├── ZKServerAlarmCheckJob.java │ │ ├── ZKServerMntrTask.java │ │ ├── ZKServerSrvrTask.java │ │ └── ZKServerStatusCollectJob.java │ ├── dao │ ├── AlarmSettingDao.java │ ├── ZooKeeperClusterDAO.java │ ├── ZooKeeperServerDAO.java │ └── impl │ │ └── memory │ │ ├── AlarmSettingDaoImpl.java │ │ ├── ZooKeeperClusterDAOImpl.java │ │ └── ZooKeeperServerDAOImpl.java │ ├── entities │ ├── dto │ │ ├── ZooServerConnStatus.java │ │ ├── ZooServerStatus.java │ │ └── resObj │ │ │ ├── JSONPObjBuilder.java │ │ │ ├── ResultObj.java │ │ │ └── ResultObjBuilder.java │ └── model │ │ ├── AlarmSetting.java │ │ ├── ZooKeeperCluster.java │ │ ├── ZooKeeperServer.java │ │ └── metrics │ │ ├── Metrics.java │ │ └── impl │ │ ├── ConsMetrics.java │ │ ├── MntrMetrics.java │ │ ├── RuokMetrics.java │ │ ├── SrvrMetrics.java │ │ └── WchcMetrics.java │ ├── exception │ ├── DaoException.java │ └── SerializeException.java │ └── util │ ├── SocketUtil.java │ ├── SystemUtil.java │ ├── WarningUtil.java │ └── ZK_ZxidUtils.java ├── resources ├── configs │ └── template.properties ├── log4j.xml ├── spring-config.xml └── spring-servlet.xml └── webapp ├── WEB-INF └── web.xml ├── admin ├── alarm_cluster_settings.html ├── index.html ├── keeper_cluster_study.html ├── manager_cluster_machines.html ├── manager_cluster_nodes.html ├── manager_cluster_settings.html ├── manager_cluster_status.html ├── scripts │ ├── manager_cluster_machines.js │ └── manager_cluster_status.js └── system_cluster_about.html ├── assets ├── common │ ├── common.css │ ├── common.js │ └── utils.js ├── css │ ├── ace-ie.min.css │ ├── ace-part2.min.css │ ├── ace-rtl.min.css │ ├── ace-skins.min.css │ ├── ace.min.css │ ├── bootstrap-colorpicker.min.css │ ├── bootstrap-datepicker3.min.css │ ├── bootstrap-datetimepicker.min.css │ ├── bootstrap-duallistbox.min.css │ ├── bootstrap-editable.min.css │ ├── bootstrap-multiselect.min.css │ ├── bootstrap-timepicker.min.css │ ├── bootstrap.min.css │ ├── chosen-sprite.png │ ├── chosen-sprite@2x.png │ ├── chosen.min.css │ ├── colorbox.min.css │ ├── colorpicker.css │ ├── colorpicker.min.css │ ├── common.css │ ├── datepicker.min.css │ ├── daterangepicker.min.css │ ├── dropzone.min.css │ ├── font-awesome.min.css │ ├── fonts.googleapis.com.css │ ├── fullcalendar.min.css │ ├── images │ │ ├── border.png │ │ ├── controls.png │ │ ├── loading.gif │ │ ├── loading_background.png │ │ ├── meteorshower2.jpg │ │ ├── overlay.png │ │ └── pattern.jpg │ ├── img │ │ ├── alpha.png │ │ ├── hue.png │ │ └── saturation.png │ ├── jquery-ui.custom.min.css │ ├── jquery-ui.min.css │ ├── jquery.gritter.min.css │ ├── select2-spinner.gif │ ├── select2.min.css │ ├── select2.png │ ├── select2x2.png │ ├── ui.jqgrid.css │ └── ui.jqgrid.min.css ├── font-awesome │ ├── 4.1.0 │ │ ├── css │ │ │ └── font-awesome.min.css │ │ └── fonts │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ └── fontawesome-webfont.woff │ ├── 4.2.0 │ │ ├── css │ │ │ └── font-awesome.min.css │ │ └── fonts │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ └── fontawesome-webfont.woff │ └── 4.5.0 │ │ ├── css │ │ └── font-awesome.min.css │ │ └── fonts │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 ├── fonts │ ├── fonts.googleapis.com.css │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 ├── images │ ├── intro │ │ ├── code.png │ │ ├── dashboard.png │ │ ├── dashboard1.png │ │ └── keeper.png │ ├── system │ │ ├── favicon.ico │ │ ├── keeper.png │ │ └── user.jpg │ └── zkdoc │ │ ├── balance.png │ │ ├── idmaker.png │ │ ├── lock.png │ │ ├── master.png │ │ ├── queue.png │ │ └── subscribe.png ├── js │ ├── base │ │ ├── ace-editable.min.js │ │ ├── ace-elements.min.js │ │ ├── ace-extra.min.js │ │ ├── ace.min.js │ │ ├── additional-methods.min.js │ │ ├── autosize.min.js │ │ ├── bootbox.js │ │ ├── bootbox.min.js │ │ ├── bootstrap-colorpicker.min.js │ │ ├── bootstrap-datepicker.min.js │ │ ├── bootstrap-datetimepicker.min.js │ │ ├── bootstrap-editable.min.js │ │ ├── bootstrap-markdown.min.js │ │ ├── bootstrap-multiselect.min.js │ │ ├── bootstrap-tag.min.js │ │ ├── bootstrap-timepicker.min.js │ │ ├── bootstrap-wysiwyg.min.js │ │ ├── bootstrap.min.js │ │ ├── buttons.colVis.min.js │ │ ├── buttons.flash.min.js │ │ ├── buttons.html5.min.js │ │ ├── buttons.print.min.js │ │ ├── chosen.jquery.min.js │ │ ├── dataTables.buttons.min.js │ │ ├── dataTables.colVis.min.js │ │ ├── dataTables.select.min.js │ │ ├── dataTables.tableTools.min.js │ │ ├── daterangepicker.min.js │ │ ├── dropzone.min.js │ │ ├── excanvas.min.js │ │ ├── fuelux.spinner.min.js │ │ ├── fuelux.tree.min.js │ │ ├── fuelux.wizard.min.js │ │ ├── fullcalendar.min.js │ │ ├── grid.locale-en.js │ │ ├── holder.min.js │ │ ├── html5shiv.min.js │ │ ├── jquery-1.11.3.min.js │ │ ├── jquery-2.1.3.js │ │ ├── jquery-additional-methods.min.js │ │ ├── jquery-typeahead.js │ │ ├── jquery-ui.custom.min.js │ │ ├── jquery-ui.min.js │ │ ├── jquery.2.1.1.min.js │ │ ├── jquery.autosize.min.js │ │ ├── jquery.bootstrap-duallistbox.min.js │ │ ├── jquery.colorbox-min.js │ │ ├── jquery.colorbox.min.js │ │ ├── jquery.cookie.min.js │ │ ├── jquery.dataTables.bootstrap.js │ │ ├── jquery.dataTables.bootstrap.min.js │ │ ├── jquery.dataTables.min.js │ │ ├── jquery.easypiechart.min.js │ │ ├── jquery.flot.min.js │ │ ├── jquery.flot.pie.min.js │ │ ├── jquery.flot.resize.min.js │ │ ├── jquery.gritter.min.js │ │ ├── jquery.hotkeys.index.min.js │ │ ├── jquery.hotkeys.min.js │ │ ├── jquery.inputlimiter.1.3.1.min.js │ │ ├── jquery.inputlimiter.min.js │ │ ├── jquery.jqGrid.min.js │ │ ├── jquery.knob.min.js │ │ ├── jquery.maskedinput.min.js │ │ ├── jquery.min.js │ │ ├── jquery.mobile.custom.min.js │ │ ├── jquery.nestable.min.js │ │ ├── jquery.raty.min.js │ │ ├── jquery.slimscroll.min.js │ │ ├── jquery.sparkline.index.min.js │ │ ├── jquery.sparkline.min.js │ │ ├── jquery.ui.touch-punch.min.js │ │ ├── jquery.validate.min.js │ │ ├── jquery1x.min.js │ │ ├── markdown.min.js │ │ ├── moment.min.js │ │ ├── respond.min.js │ │ ├── select2.min.js │ │ ├── spin.js │ │ ├── spin.min.js │ │ ├── spinbox.min.js │ │ ├── tree.min.js │ │ ├── typeahead.jquery.min.js │ │ └── wizard.min.js │ └── plugins │ │ ├── bootstrapValidator │ │ ├── bootstrapValidator.min.css │ │ ├── bootstrapValidator.min.js │ │ └── zh_CN.js │ │ ├── datatables │ │ ├── dataTables.bootstrap.min.js │ │ ├── dataTables.min.css │ │ └── jquery.dataTables.min.js │ │ ├── echarts │ │ └── echarts3.3.3.js │ │ ├── formValidation │ │ ├── formValidation.min.css │ │ └── formValidation.min.js │ │ ├── jstree │ │ ├── .gitignore │ │ ├── LICENSE-MIT │ │ ├── README.md │ │ ├── bower.json │ │ ├── component.json │ │ ├── composer.json │ │ ├── demo │ │ │ ├── basic │ │ │ │ ├── index.html │ │ │ │ └── root.json │ │ │ ├── filebrowser │ │ │ │ ├── data │ │ │ │ │ └── .htaccess │ │ │ │ ├── file_sprite.png │ │ │ │ └── index.php │ │ │ ├── jquery.min.js │ │ │ └── sitebrowser │ │ │ │ ├── class.db.php │ │ │ │ ├── class.tree.php │ │ │ │ ├── data.sql │ │ │ │ └── index.php │ │ ├── dist │ │ │ ├── jstree.js │ │ │ ├── jstree.min.js │ │ │ └── themes │ │ │ │ ├── default-dark │ │ │ │ ├── 32px.png │ │ │ │ ├── 40px.png │ │ │ │ ├── style.css │ │ │ │ ├── style.min.css │ │ │ │ └── throbber.gif │ │ │ │ └── default │ │ │ │ ├── 32px.png │ │ │ │ ├── 40px.png │ │ │ │ ├── style.css │ │ │ │ ├── style.min.css │ │ │ │ └── throbber.gif │ │ ├── gruntfile.js │ │ ├── jstree.jquery.json │ │ ├── package.json │ │ ├── src │ │ │ ├── intro.js │ │ │ ├── jstree.changed.js │ │ │ ├── jstree.checkbox.js │ │ │ ├── jstree.conditionalselect.js │ │ │ ├── jstree.contextmenu.js │ │ │ ├── jstree.dnd.js │ │ │ ├── jstree.js │ │ │ ├── jstree.massload.js │ │ │ ├── jstree.search.js │ │ │ ├── jstree.sort.js │ │ │ ├── jstree.state.js │ │ │ ├── jstree.types.js │ │ │ ├── jstree.unique.js │ │ │ ├── jstree.wholerow.js │ │ │ ├── misc.js │ │ │ ├── outro.js │ │ │ ├── sample.js │ │ │ ├── themes │ │ │ │ ├── base.less │ │ │ │ ├── default-dark │ │ │ │ │ ├── 32px.png │ │ │ │ │ ├── 40px.png │ │ │ │ │ ├── style.css │ │ │ │ │ ├── style.less │ │ │ │ │ └── throbber.gif │ │ │ │ ├── default │ │ │ │ │ ├── 32px.png │ │ │ │ │ ├── 40px.png │ │ │ │ │ ├── style.css │ │ │ │ │ ├── style.less │ │ │ │ │ └── throbber.gif │ │ │ │ ├── main.less │ │ │ │ ├── mixins.less │ │ │ │ └── responsive.less │ │ │ └── vakata-jstree.js │ │ └── test │ │ │ ├── unit │ │ │ ├── index.html │ │ │ ├── libs │ │ │ │ ├── qunit.css │ │ │ │ └── qunit.js │ │ │ └── test.js │ │ │ └── visual │ │ │ ├── desktop │ │ │ └── index.html │ │ │ ├── mobile │ │ │ └── index.html │ │ │ └── screenshots │ │ │ ├── desktop │ │ │ ├── .png │ │ │ ├── desktop.png │ │ │ └── home.png │ │ │ └── mobile │ │ │ ├── .png │ │ │ ├── home.png │ │ │ └── mobile.png │ │ ├── ladda │ │ ├── ladda-themeless.min.css │ │ ├── ladda.min.js │ │ └── spin.min.js │ │ ├── layer │ │ ├── layer.js │ │ └── skin │ │ │ ├── default │ │ │ ├── icon-ext.png │ │ │ ├── icon.png │ │ │ ├── loading-0.gif │ │ │ ├── loading-1.gif │ │ │ └── loading-2.gif │ │ │ └── layer.css │ │ ├── mustache │ │ └── mustache.js │ │ ├── prettify │ │ ├── prettify.css │ │ └── prettify.js │ │ ├── scojs │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── css │ │ │ ├── sco.message.css │ │ │ └── scojs.css │ │ ├── js │ │ │ ├── sco.ajax.js │ │ │ ├── sco.collapse.js │ │ │ ├── sco.confirm.js │ │ │ ├── sco.countdown.js │ │ │ ├── sco.message.js │ │ │ ├── sco.modal.js │ │ │ ├── sco.panes.js │ │ │ ├── sco.tab.js │ │ │ ├── sco.tooltip.js │ │ │ └── sco.valid.js │ │ ├── package.json │ │ ├── sco.js.jquery.json │ │ └── tests │ │ │ ├── index.html │ │ │ ├── modal_content.html │ │ │ ├── unit │ │ │ ├── sco.collapse.js │ │ │ ├── sco.confirm.js │ │ │ ├── sco.modal.js │ │ │ ├── sco.panes.js │ │ │ ├── sco.tab.js │ │ │ ├── sco.tooltip.js │ │ │ └── sco.valid.js │ │ │ └── vendor │ │ │ ├── jquery-1.8.3.min.js │ │ │ ├── jquery-1.9.1.min.js │ │ │ ├── jquery.form.js │ │ │ ├── jquery.mockjax.js │ │ │ ├── qunit-1.11.0.css │ │ │ ├── qunit-1.11.0.js │ │ │ └── spin.js │ │ ├── select2 │ │ ├── i18n │ │ │ ├── ar.js │ │ │ ├── az.js │ │ │ ├── bg.js │ │ │ ├── ca.js │ │ │ ├── cs.js │ │ │ ├── da.js │ │ │ ├── de.js │ │ │ ├── el.js │ │ │ ├── en.js │ │ │ ├── es.js │ │ │ ├── et.js │ │ │ ├── eu.js │ │ │ ├── fa.js │ │ │ ├── fi.js │ │ │ ├── fr.js │ │ │ ├── gl.js │ │ │ ├── he.js │ │ │ ├── hi.js │ │ │ ├── hr.js │ │ │ ├── hu.js │ │ │ ├── id.js │ │ │ ├── is.js │ │ │ ├── it.js │ │ │ ├── ja.js │ │ │ ├── km.js │ │ │ ├── ko.js │ │ │ ├── lt.js │ │ │ ├── lv.js │ │ │ ├── mk.js │ │ │ ├── ms.js │ │ │ ├── nb.js │ │ │ ├── nl.js │ │ │ ├── pl.js │ │ │ ├── pt-BR.js │ │ │ ├── pt.js │ │ │ ├── ro.js │ │ │ ├── ru.js │ │ │ ├── sk.js │ │ │ ├── sr-Cyrl.js │ │ │ ├── sr.js │ │ │ ├── sv.js │ │ │ ├── th.js │ │ │ ├── tr.js │ │ │ ├── uk.js │ │ │ ├── vi.js │ │ │ ├── zh-CN.js │ │ │ └── zh-TW.js │ │ ├── select2.css │ │ ├── select2.full.js │ │ ├── select2.full.min.js │ │ ├── select2.js │ │ ├── select2.min.css │ │ └── select2.min.js │ │ ├── sockjs │ │ └── sockjs-0.3.min.js │ │ ├── term │ │ └── term.js │ │ ├── vertical │ │ ├── jOrgChart-master.zip │ │ ├── jOrgChart │ │ │ ├── dist │ │ │ │ ├── jquery.jOrgChart.css │ │ │ │ └── jquery.jOrgChart.js │ │ │ └── example │ │ │ │ ├── css │ │ │ │ ├── bootstrap.min.css │ │ │ │ ├── custom.css │ │ │ │ ├── jquery.jOrgChart.css │ │ │ │ └── prettify.css │ │ │ │ ├── example.html │ │ │ │ ├── images │ │ │ │ ├── bkgd.png │ │ │ │ └── raspberry.jpg │ │ │ │ ├── jquery-ui.min.js │ │ │ │ ├── jquery.2.1.1.min.js │ │ │ │ ├── jquery.jOrgChart.js │ │ │ │ ├── prettify.js │ │ │ │ └── test.html │ │ └── jquery-horizontal-tree.zip │ │ └── vue │ │ └── vue.js └── swf │ ├── copy_csv_xls_pdf.swf │ └── flashExport.swf ├── error-404.html ├── error-405.html ├── error-500.html └── index.html /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve ClickHouse 4 | title: '' 5 | labels: bug, issue 6 | assignees: '' 7 | 8 | --- 9 | 10 | (you don't have to strictly follow this form) 11 | 12 | **Describe the bug** 13 | A clear and concise description of what the bug is. 14 | 15 | **How to reproduce** 16 | * Which ClickHouse server version to use 17 | * Which interface to use, if matters 18 | * Non-default settings, if any 19 | * `CREATE TABLE` statements for all tables involved 20 | * Sample data for all these tables, use [clickhouse-obfuscator](https://github.com/yandex/ClickHouse/blob/master/dbms/programs/obfuscator/Obfuscator.cpp#L42-L80) if necessary 21 | * Queries to run that lead to unexpected result 22 | 23 | **Expected behavior** 24 | A clear and concise description of what you expected to happen. 25 | 26 | **Error message and/or stacktrace** 27 | If applicable, add screenshots to help explain your problem. 28 | 29 | **Additional context** 30 | Add any other context about the problem here. 31 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/build-issue.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Build issue 3 | about: Report failed ClickHouse build from master 4 | title: '' 5 | labels: build 6 | assignees: '' 7 | 8 | --- 9 | 10 | Make sure that `git diff` result is empty and you've just pulled fresh master. Try cleaning up cmake cache. Just in case, official build instructions are published here: https://clickhouse.yandex/docs/en/development/build/ 11 | 12 | **Operating system** 13 | OS kind or distribution, specific version/release, non-standard kernel if any. If you are trying to build inside virtual machine, please mention it too. 14 | 15 | **Cmake version** 16 | 17 | **Ninja version** 18 | 19 | **Compiler name and version** 20 | 21 | **Full cmake and/or ninja output** 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for ClickHouse 4 | title: '' 5 | labels: feature 6 | assignees: '' 7 | 8 | --- 9 | 10 | (you don't have to strictly follow this form) 11 | 12 | **Use case** 13 | A clear and concise description of what is the intended usage scenario is. 14 | 15 | **Describe the solution you'd like** 16 | A clear and concise description of what you want to happen. 17 | 18 | **Describe alternatives you've considered** 19 | A clear and concise description of any alternative solutions or features you've considered. 20 | 21 | **Additional context** 22 | Add any other context or screenshots about the feature request here. 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: Ask question about ClickHouse 4 | title: '' 5 | labels: question 6 | assignees: '' 7 | 8 | --- 9 | 10 | Make sure to check documentation https://clickhouse.yandex/docs/en/ first. If the question is concise and probably has a short answer, asking it in Telegram chat https://telegram.me/clickhouse_en is probably the fastest way to find the answer. For more complicated questions, consider asking them on StackOverflow with "clickhouse" tag https://stackoverflow.com/questions/tagged/clickhouse 11 | 12 | If you still prefer GitHub issues, remove all this text and ask your question here. 13 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Be sure to do all of the following checklist to help us incorporate 2 | your contribution quickly and easily: 3 | 4 | - [ ] Any interfaces changed? 5 | 6 | - [ ] Any backward compatibility impacted? 7 | 8 | - [ ] Document update required? 9 | 10 | - [ ] Testing done 11 | Please provide details on 12 | - Whether new unit test cases have been added or why no new tests are required? 13 | - How it is tested? Please attach test report. 14 | - Is it a performance related change? Please attach the performance test report. 15 | - Any additional information to help reviewers in testing this change. 16 | 17 | - [ ] For large changes, please consider breaking it into sub-tasks under an umbrella JIRA. 18 | 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | #git rm -r -f --cached . 2 | #git add . 3 | #git commit -m 'update .gitignore' 4 | 5 | .idea 6 | *.iml 7 | artJava-zookeeper-admin/target/ 8 | /target 9 | /.idea 10 | *.iml 11 | *.ipr 12 | *.iws 13 | .idea 14 | */*.log 15 | */target/ 16 | *.DS_Store 17 | *.classpath 18 | *.settings 19 | *.project -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # 重点 zookeeper-admin 第二版本改版中 3 | - 去除tomcat,采用spring-boot或者jetty方式开发 4 | - 默认采用leveldb进行存储 5 | - 打通 docker.io 直接构建可运行镜像 6 | 7 | # ZooKeeper Admin 8 | 9 | ### 简介 10 | Hadoop、Storm、Kafka、Hbase等大数据集群组件使用越来越多,依赖Zookeeper进行工作,自然而然ZooKeeper的维护工作尤为重要!!而,针对Zookeeper集群的监控工具相对较少或者监控比较片面。 11 | 12 | 基于此,Zookeeper Admin 应运而生!! 13 | 14 | ### 功能特点 15 | - **集群配置** 支持多Zookeeper集群配置,动态增减监控集群 16 | - **节点信息** 方便查询znode的 meta信息、acl信息及data值 17 | - **集群状态** 集群状态一目了然,可视化显示集群中各服务器的实时状态,以及事物处理量等 18 | - **监控方面** 实时监控预警,针对集群,可自定义设置监控项目,配置预警级别 19 | 20 | ### 主界面 21 | ![主界面](https://raw.githubusercontent.com/artJava/artJava-zookeeper-admin/master/src/main/webapp/assets/images/intro/dashboard1.png) 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /doc/steup-temp.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | git clone https://github.com/lamber-ken/zookeeper-admin.git 4 | cd zookeeper-admin 5 | 6 | mvn clean package 7 | sudo docker rm -f zkadmin-test 8 | sudo docker run -d \ 9 | --restart=always \ 10 | --name zkadmin-test \ 11 | --privileged=true \ 12 | --network host \ 13 | docker.io/tomcat 14 | sudo docker cp target/zookeeper-admin.war zkadmin-test:/usr/local/tomcat/webapps/ 15 | 16 | http://localhost:8080/zookeeper-admin 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/common/TemplateConfigs.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.common; 2 | 3 | import org.springframework.beans.factory.annotation.Value; 4 | import org.springframework.stereotype.Component; 5 | 6 | /** 7 | * @author lamber-ken 8 | * @date 2017-01-05 19:49 9 | * @since JDK1.7 10 | */ 11 | @Component 12 | public class TemplateConfigs { 13 | 14 | 15 | @Value("#{template.username}") 16 | private String username; 17 | 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/controller/exception/WebExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.controller.exception; 2 | 3 | import com.zookeeper.zkadmin.entities.dto.resObj.ResultObjBuilder; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | import org.springframework.web.bind.annotation.ControllerAdvice; 7 | import org.springframework.web.bind.annotation.ExceptionHandler; 8 | import org.springframework.web.bind.annotation.RequestParam; 9 | import org.springframework.web.bind.annotation.ResponseBody; 10 | 11 | import javax.servlet.http.HttpServletRequest; 12 | import java.util.Map; 13 | /** 14 | * @author lamber-ken 15 | * @date 2017-01-05 19:49 16 | * @since JDK1.7 17 | */ 18 | @ControllerAdvice 19 | public class WebExceptionHandler { 20 | 21 | private static final Logger logger = LoggerFactory.getLogger("SYSTEM_LOGGER"); 22 | 23 | @ExceptionHandler(Exception.class) 24 | @ResponseBody 25 | public Object handleBizExp(@RequestParam(value = "_callback", required = false) String callback, HttpServletRequest request, Exception ex) throws Exception { 26 | 27 | Map parameterMap = request.getParameterMap(); 28 | 29 | if (parameterMap.keySet().contains("_callback")) { 30 | return null; 31 | } else 32 | return ResultObjBuilder.buildFailAJ().setErrorInfo(null); 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/controller/filter/CORSFilter.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.controller.filter; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import javax.servlet.*; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | /** 9 | * @author lamber-ken 10 | * @date 2017-01-05 19:49 11 | * @since JDK1.7 12 | */ 13 | @Component 14 | public class CORSFilter implements Filter { 15 | 16 | public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 17 | HttpServletResponse response = (HttpServletResponse) res; 18 | response.setHeader("Access-Control-Allow-Origin", "*"); 19 | response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 20 | response.setHeader("Access-Control-Max-Age", "3600"); 21 | response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); 22 | chain.doFilter(req, res); 23 | } 24 | 25 | public void init(FilterConfig filterConfig) {} 26 | 27 | public void destroy() {} 28 | 29 | } -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/controller/system/SystemController.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.controller.system; 2 | 3 | import com.zookeeper.zkadmin.entities.dto.resObj.ResultObj; 4 | import com.zookeeper.zkadmin.entities.dto.resObj.ResultObjBuilder; 5 | import org.springframework.stereotype.Controller; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RequestParam; 8 | import org.springframework.web.bind.annotation.ResponseBody; 9 | 10 | import java.util.HashMap; 11 | import java.util.LinkedList; 12 | import java.util.List; 13 | import java.util.Map; 14 | 15 | /** 16 | * @author lamber-ken 17 | * @date 2017-01-05 19:49 18 | * @since JDK1.7 19 | */ 20 | @Controller 21 | @RequestMapping("system") 22 | public class SystemController { 23 | 24 | @ResponseBody 25 | @RequestMapping(value = "getMenus") 26 | public ResultObj system01() throws Exception { 27 | 28 | List> menus = new LinkedList<>(); 29 | 30 | Map menu = new HashMap<>(); 31 | menu.put("text", "测试"); 32 | menu.put("sref", "manager_cluster_nustatus.html"); 33 | 34 | menus.add(menu); 35 | 36 | return ResultObjBuilder.buildSuccessAJ().setData(menus); 37 | } 38 | 39 | @ResponseBody 40 | @RequestMapping(value = "login") 41 | public ResultObj system02(@RequestParam("username") String _username) 42 | throws Exception { 43 | return ResultObjBuilder.buildSuccessAJ().setData("artJava"); 44 | } 45 | 46 | /** 47 | */ 48 | @ResponseBody 49 | @RequestMapping(value = "userQuery") 50 | public ResultObj system03(@RequestParam("jobNum") String _jobNum) 51 | throws Exception { 52 | 53 | List list = new LinkedList(); 54 | 55 | Map user = new HashMap<>(); 56 | user.put("jobNum", "656360"); 57 | user.put("jobName", "artJava"); 58 | user.put("deptName", "大数据分布式研究组"); 59 | list.add(user); 60 | 61 | 62 | return ResultObjBuilder.buildSuccessAJ().setData(list); 63 | 64 | } 65 | 66 | /** 67 | * web broswer ajax check sysc timely 68 | */ 69 | @ResponseBody 70 | @RequestMapping(value = "checkOK") 71 | public ResultObj system04() 72 | throws Exception { 73 | 74 | return null; 75 | } 76 | 77 | 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/core/InitSystemManager.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.core; 2 | 3 | import com.zookeeper.zkadmin.dao.AlarmSettingDao; 4 | import com.zookeeper.zkadmin.dao.ZooKeeperClusterDAO; 5 | import com.zookeeper.zkadmin.entities.model.ZooKeeperCluster; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | import org.springframework.context.ApplicationContext; 9 | import org.springframework.context.ApplicationListener; 10 | import org.springframework.context.event.ContextRefreshedEvent; 11 | import org.springframework.stereotype.Service; 12 | 13 | import java.util.List; 14 | 15 | @Service 16 | public class InitSystemManager implements ApplicationListener { 17 | private static final Logger logger = LoggerFactory.getLogger("SYSTEM_LOGGER"); 18 | 19 | private GlobalInstance gInstance = GlobalInstance.getInstance(); 20 | private static ApplicationContext applicationContext = null; 21 | 22 | 23 | @Override 24 | public void onApplicationEvent(ContextRefreshedEvent event) { 25 | if (applicationContext == null) { 26 | applicationContext = event.getApplicationContext(); 27 | ZooKeeperClusterDAO zooKeeperClusterDAO = applicationContext.getBean(ZooKeeperClusterDAO.class); 28 | AlarmSettingDao alarmSettingDao = applicationContext.getBean(AlarmSettingDao.class); 29 | 30 | // curator clients & alarms 31 | List clusters = zooKeeperClusterDAO.getAllZooKeeperClusters(); 32 | for (ZooKeeperCluster zkc : clusters) { 33 | 34 | // alarms 35 | gInstance.addAlarmSetting(alarmSettingDao.getAlarmSetting(zkc.getClusterID())); 36 | 37 | // curator clients 38 | gInstance.startZooKeeperCluster(zkc); 39 | 40 | } 41 | 42 | // start collect job 43 | ThreadPoolManager.startZooKeeperStatusCollectJob(); 44 | 45 | // start check job 46 | ThreadPoolManager.startZKServerAlarmCheckJob(); 47 | 48 | //ThreadUtil.startThread( new CheckerJob( ) ); 49 | logger.info("**************** Zookeeper Admin Startup Success ****************"); 50 | 51 | } 52 | } 53 | 54 | public static ApplicationContext getApplicationContext() { 55 | return applicationContext; 56 | } 57 | 58 | } -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/core/ThreadPoolManager.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.core; 2 | 3 | import com.zookeeper.zkadmin.common.ZKAdminConstants; 4 | import com.zookeeper.zkadmin.core.task.ZKServerAlarmCheckJob; 5 | import com.zookeeper.zkadmin.core.task.ZKServerStatusCollectJob; 6 | 7 | import java.util.concurrent.ExecutorService; 8 | import java.util.concurrent.Executors; 9 | import java.util.concurrent.ScheduledThreadPoolExecutor; 10 | import java.util.concurrent.TimeUnit; 11 | /** 12 | * @author lamber-ken 13 | * @date 2017-01-05 19:49 14 | * @since JDK1.7 15 | */ 16 | public class ThreadPoolManager { 17 | 18 | /** 19 | * global executors 20 | */ 21 | private static final ScheduledThreadPoolExecutor scheduledExecutor = (ScheduledThreadPoolExecutor) Executors 22 | .newScheduledThreadPool(3); 23 | 24 | private static final ExecutorService executorService = Executors.newCachedThreadPool(); 25 | 26 | /** 27 | * collect job 28 | */ 29 | public static void startZooKeeperStatusCollectJob() { 30 | scheduledExecutor 31 | .scheduleAtFixedRate(new ZKServerStatusCollectJob(), 0, ZKAdminConstants.intervalTime, 32 | TimeUnit.MILLISECONDS); 33 | } 34 | 35 | /** 36 | * collect task 37 | */ 38 | public static void addZKServerStatusCollectorExecutor(Runnable command) { 39 | executorService.execute(command); 40 | } 41 | 42 | 43 | /** 44 | * check job 45 | */ 46 | public static void startZKServerAlarmCheckJob() { 47 | executorService.execute(new ZKServerAlarmCheckJob()); 48 | } 49 | 50 | /** 51 | * send message 52 | */ 53 | public static void addZKServerMessageExecutor(Runnable command) { 54 | executorService.execute(command); 55 | } 56 | 57 | 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/core/parser/Parser.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.core.parser; 2 | 3 | 4 | /** 5 | * @author lamber-ken 6 | * @date 2017-01-05 19:49 7 | * @since JDK1.7 8 | */ 9 | public interface Parser { 10 | 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/core/parser/impl/RuokParser.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.core.parser.impl; 2 | 3 | 4 | import com.zookeeper.zkadmin.core.parser.Parser; 5 | import com.zookeeper.zkadmin.entities.model.metrics.impl.RuokMetrics; 6 | 7 | /** 8 | * @author lamber-ken 9 | * @date 2017-01-05 19:49 10 | * @since JDK1.7 11 | */ 12 | public class RuokParser implements Parser { 13 | 14 | public static final String imok = "imok"; 15 | 16 | 17 | public static RuokMetrics parser(String str) { 18 | 19 | RuokMetrics ruokMetrics = new RuokMetrics(); 20 | 21 | if (str != null && str.equals(imok)){ 22 | ruokMetrics.setOk(true); 23 | }else { 24 | ruokMetrics.setOk(false); 25 | } 26 | 27 | return ruokMetrics; 28 | } 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/core/parser/impl/WchcParser.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.core.parser.impl; 2 | 3 | 4 | 5 | import com.zookeeper.zkadmin.core.parser.Parser; 6 | import com.zookeeper.zkadmin.entities.model.metrics.impl.WchcMetrics; 7 | 8 | import java.util.ArrayList; 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | /** 13 | * @author lamber-ken 14 | * @date 2017-01-05 19:49 15 | * @since JDK1.7 16 | */ 17 | public class WchcParser implements Parser { 18 | 19 | 20 | public static WchcMetrics parser(String str) { 21 | if (str == null || str.equals("")) return null; 22 | 23 | Map> mapSessionWatchPaths = new HashMap<>(); 24 | 25 | String sline[] = str.split("\n"); 26 | String key = null; 27 | String value = null; 28 | for (String l : sline) { 29 | if (l == null || l.equals("") || l.trim().equals("")) continue; 30 | String data = l.trim(); 31 | if (!data.contains("/")) { 32 | key = data; 33 | } else { 34 | value = data; 35 | setData(mapSessionWatchPaths, key, value); 36 | } 37 | } 38 | 39 | WchcMetrics wm = new WchcMetrics(); 40 | wm.setMapSessionWatchPaths(mapSessionWatchPaths); 41 | 42 | return wm; 43 | } 44 | 45 | 46 | private static void setData(Map> mwp, String key, String value) { 47 | if (key == null || value == null || key.equals("") || value.equals("")) return; 48 | 49 | if (mwp.containsKey(key)) { 50 | ArrayList valueList = mwp.get(key); 51 | if (valueList == null) { 52 | valueList = new ArrayList(); 53 | } 54 | valueList.add(value); 55 | mwp.put(key, valueList); 56 | } else { 57 | ArrayList valueList = new ArrayList(); 58 | valueList.add(value); 59 | mwp.put(key, valueList); 60 | } 61 | 62 | } 63 | 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/core/task/ZKMessageSender.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.core.task; 2 | 3 | import com.zookeeper.zkadmin.common.ZKAdminConstants; 4 | import com.zookeeper.zkadmin.util.WarningUtil; 5 | import org.apache.commons.lang.StringUtils; 6 | import org.joda.time.DateTime; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | 10 | import java.util.Arrays; 11 | import java.util.List; 12 | 13 | /** 14 | * @author lamber-ken 15 | * @date 2017-01-05 19:49 16 | * @since JDK1.7 17 | */ 18 | public class ZKMessageSender implements Runnable { 19 | 20 | private static final Logger logger = LoggerFactory.getLogger("SYSTEM_LOGGER"); 21 | private String title; 22 | private String message; 23 | private String[] jobNumList; // aa_bb_cc 24 | private List routeChannelIDs; // A_B_C_D weixin duanxin youjian dianhua 25 | 26 | public ZKMessageSender(String title, String message, String[] jobNumList, String[] routeChannelIDs) { 27 | this.title = title; 28 | this.message = message; 29 | this.jobNumList = jobNumList; 30 | this.routeChannelIDs = Arrays.asList(routeChannelIDs); 31 | } 32 | 33 | @Override 34 | public void run() { 35 | 36 | if (routeChannelIDs.contains(ZKAdminConstants.MESSAGE_WEIXIN)) { 37 | logger.warn("发送微信预警信息,{} {}", title, message); 38 | WarningUtil.sendMsg(StringUtils.join(jobNumList, ","), title, message); 39 | } 40 | 41 | if (routeChannelIDs.contains(ZKAdminConstants.MESSAGE_YOUJIAN)) { 42 | logger.warn("发送邮件预警信息,{} {}", title, message); 43 | // WarningUtil.sendMsg(StringUtils.join(jobNumList, ","), title, message); 44 | } 45 | 46 | if (routeChannelIDs.contains(ZKAdminConstants.MESSAGE_DUANXIN)) { 47 | logger.warn("发送短信预警信息,{} {}", title, message); 48 | // WarningUtil.sendMsg(StringUtils.join(jobNumList, ","), title, message); 49 | } 50 | 51 | if (routeChannelIDs.contains(ZKAdminConstants.MESSAGE_DIANHUA)) { 52 | logger.warn("发送电话预警信息,{} {}", title, message); 53 | // WarningUtil.sendMsg(StringUtils.join(jobNumList, ","), title, message); 54 | } 55 | 56 | 57 | } 58 | 59 | public static void main(String[] args) { 60 | 61 | 62 | WarningUtil.sendMsg("38154", "test", DateTime.now().toString("yyyy-MM-dd HH:mm:ss.S") + "\n" + "fv发送电话预警信息fcontent" 63 | + "\n" + DateTime.now().toString("yyyy-MM-dd HH:mm:ss.SSS")); 64 | 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/core/task/ZKServerMntrTask.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.core.task; 2 | import com.zookeeper.zkadmin.common.ZKAdminConstants; 3 | import com.zookeeper.zkadmin.core.GlobalInstance; 4 | import com.zookeeper.zkadmin.core.parser.impl.MntrParser; 5 | import com.zookeeper.zkadmin.entities.model.ZooKeeperServer; 6 | import com.zookeeper.zkadmin.entities.model.metrics.impl.MntrMetrics; 7 | import com.zookeeper.zkadmin.util.SocketUtil; 8 | import org.joda.time.DateTime; 9 | 10 | /** 11 | * @author lamber-ken 12 | * @date 2017-01-05 19:49 13 | * @since JDK1.7 14 | */ 15 | public class ZKServerMntrTask implements Runnable { 16 | 17 | ZooKeeperServer zkServer; 18 | GlobalInstance gInstance = GlobalInstance.getInstance(); 19 | 20 | public ZKServerMntrTask(ZooKeeperServer _zkServer) { 21 | this.zkServer = _zkServer; 22 | } 23 | 24 | @Override 25 | public void run() { 26 | 27 | try { 28 | System.out.println("正在收集 mntr 信息"); 29 | 30 | 31 | String date = DateTime.now().toString("yyyyMMdd"); 32 | String resp = SocketUtil.getRespByCMD(zkServer.getHost(), zkServer.getPort(), ZKAdminConstants.mntr); 33 | MntrMetrics mp = MntrParser.parser(resp); 34 | mp.setClusterID(zkServer.getClusterID()); 35 | mp.setServerID(zkServer.getServerID()); 36 | 37 | gInstance.addMetrics(mp); 38 | 39 | // redisClient.List().lpushBit(ZKAdminConstants.ZK_SERVER_DATE_MNTR_KEY_PREFIX + "_" + date + "_" + zkServer.getClusterID() + "_" + zkServer.getServerID() + "_" + "MNTR", SerializationUtils.serialize(mp)); 40 | 41 | } catch (Throwable e) { 42 | e.printStackTrace(); 43 | } 44 | 45 | } 46 | 47 | 48 | 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/core/task/ZKServerSrvrTask.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.core.task; 2 | 3 | import com.zookeeper.zkadmin.common.ZKAdminConstants; 4 | import com.zookeeper.zkadmin.core.parser.impl.SrvrParser; 5 | import com.zookeeper.zkadmin.entities.model.ZooKeeperServer; 6 | import com.zookeeper.zkadmin.entities.model.metrics.impl.SrvrMetrics; 7 | import com.zookeeper.zkadmin.util.SocketUtil; 8 | import org.joda.time.DateTime; 9 | 10 | /** 11 | * @author lamber-ken 12 | * @date 2017-01-05 19:49 13 | * @since JDK1.7 14 | */ 15 | public class ZKServerSrvrTask implements Runnable { 16 | 17 | ZooKeeperServer zkServer; 18 | 19 | public ZKServerSrvrTask(ZooKeeperServer _zkServer) { 20 | this.zkServer = _zkServer; 21 | } 22 | 23 | @Override 24 | public void run() { 25 | 26 | try { 27 | 28 | System.out.println("正在收集 srvr 信息"); 29 | String resp = SocketUtil.getRespByCMD(zkServer.getHost(), zkServer.getPort(), ZKAdminConstants.srvr); 30 | SrvrMetrics sm = SrvrParser.parser(resp); 31 | String date = DateTime.now().toString("yyyyMMdd"); 32 | 33 | // redisClient.List().rpushBit(ZKAdminConstants.ZK_SERVER_DATE_SRVR_KEY_PREFIX + "_" + date + "_" + zkServer.getServerID() + "_" + "SRVR", SerializationUtils.serialize(sm)); 34 | 35 | } catch (Throwable e) { 36 | e.printStackTrace(); 37 | } 38 | 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/core/task/ZKServerStatusCollectJob.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.core.task; 2 | 3 | import com.zookeeper.zkadmin.core.InitSystemManager; 4 | import com.zookeeper.zkadmin.dao.ZooKeeperClusterDAO; 5 | import com.zookeeper.zkadmin.dao.ZooKeeperServerDAO; 6 | import com.zookeeper.zkadmin.entities.model.ZooKeeperCluster; 7 | import com.zookeeper.zkadmin.entities.model.ZooKeeperServer; 8 | import org.springframework.context.ApplicationContext; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * @author lamber-ken 14 | * @date 2017-01-05 19:49 15 | * @since JDK1.7 16 | */ 17 | public class ZKServerStatusCollectJob implements Runnable { 18 | 19 | @Override 20 | public void run() { 21 | 22 | try { 23 | 24 | 25 | ApplicationContext ac = InitSystemManager.getApplicationContext(); 26 | 27 | ZooKeeperClusterDAO zooKeeperClusterDAO = ac.getBean(ZooKeeperClusterDAO.class); 28 | ZooKeeperServerDAO zooKeeperServerDAO = ac.getBean(ZooKeeperServerDAO.class); 29 | 30 | List allZooKeeperClusters = zooKeeperClusterDAO.getAllZooKeeperClusters(); 31 | 32 | for (ZooKeeperCluster zkc : allZooKeeperClusters) { 33 | 34 | List allZKServers = zooKeeperServerDAO.getAllZooKeepersServersByClusterID(zkc.getClusterID()); 35 | 36 | 37 | for (ZooKeeperServer zkServer : allZKServers) { 38 | 39 | /** srvr */ 40 | // ThreadPoolManager.addZKServerStatusCollectorExecutor(new ZKServerSrvrTask(zkServer)); 41 | 42 | /** mntr */ 43 | // ThreadPoolManager.addZKServerStatusCollectorExecutor(new ZKServerMntrTask(zkServer)); 44 | } 45 | 46 | } 47 | 48 | } catch (Throwable e) { 49 | e.printStackTrace(); 50 | } 51 | 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/dao/AlarmSettingDao.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.dao; 2 | 3 | 4 | import com.zookeeper.zkadmin.entities.model.AlarmSetting; 5 | import com.zookeeper.zkadmin.exception.DaoException; 6 | 7 | /** 8 | * @author lamber-ken 9 | * @date 2017-01-05 19:49 10 | * @since JDK1.7 11 | */ 12 | public interface AlarmSettingDao { 13 | 14 | 15 | /** 16 | * 添加或更新一个AlarmSetting集群 17 | */ 18 | void updateAlarmSetting(AlarmSetting alarmSetting) throws DaoException; 19 | 20 | /** 21 | * 获取单个 22 | */ 23 | AlarmSetting getAlarmSetting(String clusterId) throws DaoException; 24 | 25 | /** 删除集群 */ 26 | boolean removeAlarmSetting(String clusterID) throws DaoException; 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/dao/ZooKeeperClusterDAO.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.dao; 2 | 3 | 4 | import com.zookeeper.zkadmin.entities.model.ZooKeeperCluster; 5 | import com.zookeeper.zkadmin.exception.DaoException; 6 | 7 | import java.util.List; 8 | 9 | public interface ZooKeeperClusterDAO { 10 | 11 | /** 12 | * 添加一个zookeeper集群 13 | */ 14 | void addZooKeeperCluster(ZooKeeperCluster zooKeeperCluster) throws DaoException; 15 | 16 | /** 17 | * 获取单个 18 | */ 19 | ZooKeeperCluster getZooKeeperCluster(String clusterId) throws DaoException; 20 | 21 | /** 所有 */ 22 | List getAllZooKeeperClusters() throws DaoException; 23 | 24 | 25 | boolean updateZooKeeperCluster(ZooKeeperCluster zooKeeperCluster) throws DaoException; 26 | 27 | /** 删除集群 */ 28 | boolean removeZooKeeperCluster(String clusterID) throws DaoException; 29 | void removeAllZooKeeperCluster() throws DaoException; 30 | 31 | 32 | 33 | } -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/dao/ZooKeeperServerDAO.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.dao; 2 | 3 | 4 | import com.zookeeper.zkadmin.entities.model.ZooKeeperCluster; 5 | import com.zookeeper.zkadmin.entities.model.ZooKeeperServer; 6 | import com.zookeeper.zkadmin.exception.DaoException; 7 | 8 | import java.util.List; 9 | /** 10 | * @author lamber-ken 11 | * @date 2017-01-05 19:49 12 | * @since JDK1.7 13 | */ 14 | public interface ZooKeeperServerDAO { 15 | 16 | /** 17 | * 添加一个zookeeper zkserver 18 | */ 19 | void addZooKeeperServer(ZooKeeperServer ZooKeeperServer) throws DaoException; 20 | 21 | /** 22 | * 获取单个 23 | */ 24 | ZooKeeperServer getZooKeeperServer(String clusterID, String serverId) throws DaoException; 25 | 26 | /** 27 | * 所有 28 | */ 29 | List getAllZooKeepersServersByClusterID(String clusterID) throws DaoException; 30 | 31 | boolean updateZooKeeperClusterByClusterId(ZooKeeperCluster zooKeeperCluster) throws DaoException; 32 | 33 | /** 34 | * 删除服务器 35 | */ 36 | void removeZooKeeperServer(String clusterID, String serverID) throws DaoException; 37 | 38 | void removeAllZooKeeperByClusterID(String clusterID) throws DaoException; 39 | 40 | } -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/dao/impl/memory/AlarmSettingDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.dao.impl.memory; 2 | 3 | import com.zookeeper.zkadmin.dao.AlarmSettingDao; 4 | import com.zookeeper.zkadmin.entities.model.AlarmSetting; 5 | import com.zookeeper.zkadmin.exception.DaoException; 6 | import org.springframework.stereotype.Repository; 7 | 8 | import java.util.Map; 9 | import java.util.concurrent.ConcurrentHashMap; 10 | 11 | /** 12 | * org.artjava.zookeeper.dao.impl 13 | * 14 | * @author lamber-ken 15 | * @date 2017-02-09 18:04 16 | * @since JDK1.7 17 | */ 18 | @Repository 19 | public class AlarmSettingDaoImpl implements AlarmSettingDao { 20 | 21 | //private static CacheClientHA redisClient = RedisUtil.getCallRedisUtil(); 22 | Map alarms_map = new ConcurrentHashMap<>(); 23 | 24 | @Override public void updateAlarmSetting(AlarmSetting alarmSetting) throws DaoException { 25 | alarms_map.put(alarmSetting.getClusterID(), alarmSetting); 26 | } 27 | 28 | @Override public AlarmSetting getAlarmSetting(String clusterId) throws DaoException { 29 | return alarms_map.get(clusterId); 30 | } 31 | 32 | @Override public boolean removeAlarmSetting(String clusterID) throws DaoException { 33 | 34 | alarms_map.remove(clusterID); 35 | return true; 36 | 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/dao/impl/memory/ZooKeeperClusterDAOImpl.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.dao.impl.memory; 2 | 3 | import com.zookeeper.zkadmin.dao.ZooKeeperClusterDAO; 4 | import com.zookeeper.zkadmin.entities.model.ZooKeeperCluster; 5 | import com.zookeeper.zkadmin.exception.DaoException; 6 | import org.springframework.stereotype.Repository; 7 | 8 | import java.util.LinkedList; 9 | import java.util.List; 10 | import java.util.Map; 11 | import java.util.concurrent.ConcurrentHashMap; 12 | 13 | @Repository 14 | public class ZooKeeperClusterDAOImpl implements ZooKeeperClusterDAO { 15 | 16 | Map clusters_map = new ConcurrentHashMap<>(); 17 | 18 | 19 | @Override 20 | public void addZooKeeperCluster(ZooKeeperCluster zooKeeperCluster) throws DaoException { 21 | clusters_map.put(zooKeeperCluster.getClusterID(), zooKeeperCluster); 22 | } 23 | 24 | @Override 25 | public ZooKeeperCluster getZooKeeperCluster(String clusterId) throws DaoException { 26 | return clusters_map.get(clusterId); 27 | } 28 | 29 | @Override 30 | public List getAllZooKeeperClusters() throws DaoException { 31 | return new LinkedList<>(clusters_map.values()); 32 | } 33 | 34 | @Override 35 | public boolean removeZooKeeperCluster(String clusterID) throws DaoException { 36 | clusters_map.remove(clusterID); 37 | return true; 38 | } 39 | 40 | @Override 41 | public void removeAllZooKeeperCluster() throws DaoException { 42 | clusters_map.clear(); 43 | } 44 | 45 | @Override 46 | public boolean updateZooKeeperCluster(ZooKeeperCluster zooKeeperCluster) throws DaoException { 47 | clusters_map.put(zooKeeperCluster.getClusterID(), zooKeeperCluster); 48 | return false; 49 | } 50 | 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/dao/impl/memory/ZooKeeperServerDAOImpl.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.dao.impl.memory; 2 | 3 | import com.zookeeper.zkadmin.dao.ZooKeeperServerDAO; 4 | import com.zookeeper.zkadmin.entities.model.ZooKeeperCluster; 5 | import com.zookeeper.zkadmin.entities.model.ZooKeeperServer; 6 | import com.zookeeper.zkadmin.exception.DaoException; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | import org.springframework.stereotype.Repository; 10 | 11 | import java.util.LinkedList; 12 | import java.util.List; 13 | import java.util.Map; 14 | import java.util.Set; 15 | import java.util.concurrent.ConcurrentHashMap; 16 | 17 | @Repository 18 | public class ZooKeeperServerDAOImpl implements ZooKeeperServerDAO { 19 | private static final Logger logger = LoggerFactory.getLogger("SYSTEM_LOGGER"); 20 | 21 | Map zooServers_map = new ConcurrentHashMap<>(); 22 | 23 | @Override public void addZooKeeperServer(ZooKeeperServer ZooKeeperServer) throws DaoException { 24 | 25 | zooServers_map.put(ZooKeeperServer.getClusterID() + "_" + ZooKeeperServer.getServerID(), ZooKeeperServer); 26 | 27 | } 28 | 29 | @Override public ZooKeeperServer getZooKeeperServer(String clusterID, String serverId) 30 | throws DaoException { 31 | return zooServers_map.get(clusterID + "_" + serverId); 32 | } 33 | 34 | @Override public List getAllZooKeepersServersByClusterID(String clusterID) throws DaoException { 35 | 36 | List zkss = new LinkedList<>(); 37 | 38 | Set keys = zooServers_map.keySet(); 39 | 40 | for (String key : keys) { 41 | 42 | if (key.startsWith(clusterID)) { 43 | zkss.add(zooServers_map.get(key)); 44 | } 45 | 46 | } 47 | 48 | return zkss; 49 | } 50 | 51 | @Override public boolean updateZooKeeperClusterByClusterId(ZooKeeperCluster zooKeeperCluster) throws DaoException { 52 | return false; 53 | } 54 | 55 | @Override public void removeZooKeeperServer(String clusterID, String serverID) throws DaoException { 56 | zooServers_map.remove(clusterID + "_" + serverID); 57 | } 58 | 59 | @Override public void removeAllZooKeeperByClusterID(String clusterID) throws DaoException { 60 | 61 | zooServers_map.clear(); 62 | 63 | } 64 | 65 | public static void main(String[] args) { 66 | 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/entities/dto/resObj/JSONPObjBuilder.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.entities.dto.resObj; 2 | 3 | 4 | import com.fasterxml.jackson.databind.util.JSONPObject; 5 | 6 | /** 7 | * jsonp obj 8 | * 9 | * @author 38154 10 | * @date 2016-11-08 13:02 11 | * @since JDK1.7 12 | */ 13 | public class JSONPObjBuilder { 14 | 15 | /** 16 | * callback memthod default --> _callback 17 | */ 18 | public static JSONPObject buildFromResultObj(String callback, ResultObj resultObj) { 19 | return new JSONPObject(callback, resultObj); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/entities/dto/resObj/ResultObj.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.entities.dto.resObj; 2 | 3 | import java.util.HashMap; 4 | 5 | public class ResultObj extends HashMap { 6 | private static final long serialVersionUID = 1L; 7 | 8 | public ResultObj setMsg(Object object) { 9 | this.put("msg", object); 10 | return this; 11 | } 12 | 13 | public void setResult(boolean result) { 14 | this.put("result", Boolean.valueOf(result)); 15 | } 16 | 17 | public ResultObj setData(Object obj) { 18 | this.put("data", obj); 19 | return this; 20 | } 21 | 22 | public ResultObj setErrorInfo(Object obj) { 23 | this.put("error", obj); 24 | return this; 25 | } 26 | 27 | 28 | public ResultObj put(String key, Object value) { 29 | super.put(key, value); 30 | return this; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/entities/dto/resObj/ResultObjBuilder.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.entities.dto.resObj; 2 | 3 | public class ResultObjBuilder { 4 | 5 | public static ResultObj buildCommonAJ() { 6 | ResultObj ao = new ResultObj(); 7 | ao.setResult(true); 8 | ao.setMsg("common"); 9 | return ao; 10 | } 11 | 12 | public static ResultObj buildSuccessAJ() { 13 | ResultObj ao = new ResultObj(); 14 | ao.setResult(true); 15 | ao.setMsg("success"); 16 | return ao; 17 | } 18 | 19 | public static ResultObj buildFailAJ() { 20 | ResultObj ao = new ResultObj(); 21 | ao.setResult(false); 22 | ao.setData(new String[]{}); 23 | ao.setMsg("failure, please check or connect to administrator"); 24 | return ao; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/entities/model/ZooKeeperServer.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.entities.model; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * org.artjava.zookeeper.entities.model 7 | * 8 | * @author lamber-ken 9 | * @date 2017-01-03 19:49 10 | * @since JDK1.7 11 | */ 12 | public class ZooKeeperServer implements Serializable { 13 | 14 | private static final long serialVersionUID = 1L; 15 | 16 | /** 17 | * server 唯一标识 18 | */ 19 | private String serverID; 20 | 21 | /** 22 | * cluster 唯一标识 23 | */ 24 | private String clusterID; 25 | private String host; 26 | private int port; 27 | 28 | public String getServerID() { 29 | return serverID; 30 | } 31 | 32 | public void setServerID(String serverID) { 33 | this.serverID = serverID; 34 | } 35 | 36 | public String getClusterID() { 37 | return clusterID; 38 | } 39 | 40 | public void setClusterID(String clusterID) { 41 | this.clusterID = clusterID; 42 | } 43 | 44 | public String getHost() { 45 | return host; 46 | } 47 | 48 | public void setHost(String host) { 49 | this.host = host; 50 | } 51 | 52 | public int getPort() { 53 | return port; 54 | } 55 | 56 | public void setPort(int port) { 57 | this.port = port; 58 | } 59 | 60 | @Override 61 | public boolean equals(Object _obj) { 62 | ZooKeeperServer obj = (ZooKeeperServer) _obj; 63 | if (this.getHost().equals(obj.getHost()) && this.getPort() == obj.getPort()) 64 | return true; 65 | else 66 | return false; 67 | } 68 | 69 | @Override 70 | public int hashCode() { 71 | 72 | // 31是个神奇的数字,因为任何数n * 31就可以被JVM优化为 (n << 5) -n,移位和减法的操作效率要比乘法的操作效率高的多。 73 | int prime = 31; 74 | int hashcode = 17; 75 | 76 | hashcode = hashcode * prime + host.hashCode(); 77 | hashcode = hashcode * prime + port; 78 | return hashcode; 79 | } 80 | 81 | @Override public String toString() { 82 | return "ZooKeeperServer{" + "serverID='" + serverID + '\'' + ", clusterID='" + clusterID + '\'' + ", host='" 83 | + host + '\'' + ", port=" + port + '}'; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/entities/model/metrics/Metrics.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.entities.model.metrics; 2 | 3 | /** 4 | * @author lamber-ken 5 | * @date 2017-01-05 19:49 6 | * @since JDK1.7 7 | */ 8 | public interface Metrics { 9 | 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/entities/model/metrics/impl/RuokMetrics.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.entities.model.metrics.impl; 2 | 3 | /** 4 | * @author lamber-ken 5 | * @date 2017-01-05 19:49 6 | * @since JDK1.7 7 | */ 8 | public class RuokMetrics { 9 | 10 | private boolean isOk; 11 | 12 | public boolean isOk() { 13 | return isOk; 14 | } 15 | 16 | public void setOk(boolean ok) { 17 | isOk = ok; 18 | } 19 | 20 | @Override public String toString() { 21 | return "RuokMetrics{" + "isOk=" + isOk + '}'; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/entities/model/metrics/impl/WchcMetrics.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.entities.model.metrics.impl; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Map; 5 | 6 | /** 7 | * @author lamber-ken 8 | * @date 2017-01-05 19:49 9 | * @since JDK1.7 10 | */ 11 | public class WchcMetrics { 12 | 13 | 14 | private Map> mapSessionWatchPaths; 15 | 16 | public Map> getMapSessionWatchPaths() { 17 | return mapSessionWatchPaths; 18 | } 19 | 20 | public void setMapSessionWatchPaths(Map> mapSessionWatchPaths) { 21 | this.mapSessionWatchPaths = mapSessionWatchPaths; 22 | } 23 | 24 | @Override 25 | public String toString() { 26 | StringBuilder sb = new StringBuilder(); 27 | for (Map.Entry> entry : mapSessionWatchPaths.entrySet()) { 28 | String key = entry.getKey(); 29 | sb.append(key + ":"); 30 | ArrayList value = entry.getValue(); 31 | int i = 0; 32 | for(String v : value) { 33 | if(i == 0) sb.append(v); 34 | else sb.append(", " + v); 35 | i++; 36 | } 37 | sb.append("\n"); 38 | } 39 | return sb.toString(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/exception/DaoException.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.exception; 2 | 3 | public class DaoException extends RuntimeException { 4 | private static final long serialVersionUID = -5365630128856068164L; 5 | 6 | public DaoException() { 7 | } 8 | 9 | public DaoException(String message) { 10 | super(message); 11 | } 12 | 13 | public DaoException(String message, Throwable cause) { 14 | super(message, cause); 15 | } 16 | 17 | public DaoException(Throwable cause) { 18 | super(cause); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/exception/SerializeException.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.exception; 2 | 3 | public class SerializeException extends RuntimeException { 4 | private static final long serialVersionUID = -5365630128856068164L; 5 | 6 | public SerializeException() { 7 | } 8 | 9 | public SerializeException(String message) { 10 | super(message); 11 | } 12 | 13 | public SerializeException(String message, Throwable cause) { 14 | super(message, cause); 15 | } 16 | 17 | public SerializeException(Throwable cause) { 18 | super(cause); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/util/SystemUtil.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.util; 2 | 3 | import com.zookeeper.zkadmin.common.ZKAdminConstants; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | 7 | import java.util.Random; 8 | 9 | /** 10 | * @author lamber-ken 11 | * @date 2017-01-05 19:49 12 | * @since JDK1.7 13 | */ 14 | public class SystemUtil { 15 | 16 | private static final Logger logger = LoggerFactory.getLogger("SYSTEM_LOGGER"); 17 | private static Random random = new Random(); 18 | 19 | /** 20 | * parser split 21 | * 22 | */ 23 | public static String[] splitL (String str){ 24 | String tmp[] = null; 25 | 26 | tmp = str.split(ZKAdminConstants.split_t); 27 | if (tmp.length == 2){ 28 | return tmp; 29 | } 30 | tmp = str.split(ZKAdminConstants.split_eq); 31 | if (tmp.length == 2){ 32 | return tmp; 33 | } 34 | 35 | return tmp; 36 | } 37 | 38 | 39 | private static char[] digits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', 40 | '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 41 | 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 42 | 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 43 | 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 44 | 'Z'}; 45 | 46 | 47 | /** 48 | * 获取数值 UUID 49 | */ 50 | public static String getSimpleUniqueIdByUUId() { 51 | 52 | // 53 | // /** 54 | // * %08d 55 | // * 0 代表前面补充0 56 | // * 4 代表长度为4 57 | // * d 代表参数为正数型 58 | // */ 59 | // return digits[random.nextInt(digits.length)] + String.format("%07d", random.nextInt(99999999)) + String.format("%08d", random.nextInt(99999999)); 60 | 61 | 62 | StringBuilder sb = new StringBuilder(); 63 | for (int i = 0; i < 16; i++) { 64 | sb.append(digits[random.nextInt(digits.length)]); 65 | } 66 | 67 | return sb.toString(); 68 | 69 | } 70 | 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/util/WarningUtil.java: -------------------------------------------------------------------------------- 1 | package com.zookeeper.zkadmin.util; 2 | 3 | import org.apache.commons.lang.StringUtils; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | 7 | /** 8 | * dzs-data-parent com.ly.dzs.data.common.util 9 | * 10 | * @author lamber-ken 11 | * @date 2016-11-10 14:18 12 | * @since JDK1.7 13 | */ 14 | public class WarningUtil { 15 | 16 | private static final Logger logger = LoggerFactory.getLogger("SYSTEM_LOGGER"); 17 | 18 | /** 19 | * 通过同程助手发送消息 20 | * 21 | * @param user 工号, 多个以逗号分割 22 | * @param tile 标题 23 | * @param content 内容 24 | * {"touser": "xxxx","articles":[{ "title": "title1","description": "desc1"}]} 25 | */ 26 | public static void sendMsg(String user, String tile, String content) { 27 | 28 | if (StringUtils.isEmpty(user) || StringUtils.isEmpty(tile) || StringUtils.isEmpty(content)) 29 | return; 30 | 31 | } 32 | 33 | public static void main(String[] args) { 34 | 35 | sendMsg("xxx", "asa", "ddd"); 36 | 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/zookeeper/zkadmin/util/ZK_ZxidUtils.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | *

10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | *

12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | package com.zookeeper.zkadmin.util; 20 | 21 | import org.apache.commons.lang.StringUtils; 22 | 23 | public class ZK_ZxidUtils { 24 | static public long getEpochFromZxid(long zxid) { 25 | return zxid >> 32L; 26 | } 27 | 28 | static public long getCounterFromZxid(long zxid) { 29 | return zxid & 0xffffffffL; 30 | } 31 | 32 | static public long makeZxid(long epoch, long counter) { 33 | return (epoch << 32L) | (counter & 0xffffffffL); 34 | } 35 | 36 | static public String zxidToString(long zxid) { 37 | return Long.toHexString(zxid); 38 | } 39 | 40 | 41 | public static void main(String[] args) { 42 | 43 | 44 | System.out.println(1 << 32); 45 | System.out.println(1L << 32); 46 | 47 | 48 | System.out.println(makeZxid(1, 268435457)); 49 | 50 | long l = Long.parseLong(StringUtils.substring("0x10000001", 2), 16); 51 | 52 | System.out.println(getCounterFromZxid(l)); 53 | System.out.println(getEpochFromZxid(l)); 54 | 55 | 56 | System.out.println(0xffffffffL); 57 | 58 | 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/main/resources/configs/template.properties: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## configs 4 | username = \n\ 5 | test 6 | 7 | -------------------------------------------------------------------------------- /src/main/resources/spring-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 16 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/main/resources/spring-servlet.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | zookeeper-admin 7 | 8 | contextConfigLocation 9 | classpath:spring-config.xml 10 | 11 | 12 | 13 | org.springframework.web.util.Log4jConfigListener 14 | 15 | 16 | org.springframework.web.context.ContextLoaderListener 17 | 18 | 19 | zookeeper-admin 20 | org.springframework.web.servlet.DispatcherServlet 21 | 22 | contextConfigLocation 23 | classpath:spring-servlet.xml 24 | 25 | 1 26 | 27 | 28 | zookeeper-admin 29 | / 30 | 31 | 32 | 33 | 34 | cors 35 | com.zookeeper.zkadmin.controller.filter.CORSFilter 36 | 37 | 38 | cors 39 | /* 40 | 41 | 42 | 43 | Encodingggg 44 | 45 | org.springframework.web.filter.CharacterEncodingFilter 46 | 47 | 48 | encoding 49 | utf8 50 | 51 | 52 | 53 | Encoding 54 | /* 55 | 56 | 57 | 58 | 404 59 | /error-404.html 60 | 61 | 62 | 63 | 500 64 | /error-500.html 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /src/main/webapp/assets/common/common.css: -------------------------------------------------------------------------------- 1 | .fa-folder-yellow { 2 | color: #dfba49 !important; 3 | } 4 | 5 | .jstree-open > .jstree-anchor > .fa-folder:before { 6 | margin-left: 2px !important; 7 | content: "\f07c" !important; 8 | } 9 | 10 | .user-info { 11 | line-height: 29px !important; 12 | } 13 | 14 | /* 15 | * org charts 16 | */ 17 | #org { 18 | background-color: white; 19 | margin: 10px; 20 | padding: 10px; 21 | } 22 | 23 | /* Custom chart styling */ 24 | .jOrgChart { 25 | margin: 10px; 26 | padding: 2px; 27 | } 28 | 29 | /* Custom node styling */ 30 | 31 | .jOrgChart .top { 32 | border-top: 2px solid black; 33 | } 34 | 35 | .jOrgChart .line { 36 | height: 20px; 37 | width: 2px; 38 | } 39 | 40 | .jOrgChart table { 41 | margin-left: auto; 42 | margin-right: auto; 43 | } 44 | 45 | .jOrgChart .node { 46 | width: 120px; 47 | height: 72px; 48 | padding: 0 0px; 49 | font-size: 11px; 50 | background-color: #d6e9c6; 51 | border: 1px solid white; 52 | color: #423a34; 53 | -moz-border-radius: 3px; 54 | border-radius: 3px; 55 | } 56 | 57 | .jOrgChart .nodeInfo { 58 | text-align: left; 59 | padding-left: 5px; 60 | padding-top: 3px; 61 | } -------------------------------------------------------------------------------- /src/main/webapp/assets/css/bootstrap-duallistbox.min.css: -------------------------------------------------------------------------------- 1 | .bootstrap-duallistbox-container .buttons{width:100%;margin-bottom:-1px}.bootstrap-duallistbox-container label{display:block}.bootstrap-duallistbox-container .info{display:inline-block;margin-bottom:5px;font-size:11px}.bootstrap-duallistbox-container .clear1,.bootstrap-duallistbox-container .clear2{display:none;font-size:10px}.bootstrap-duallistbox-container .box1.filtered .clear1,.bootstrap-duallistbox-container .box2.filtered .clear2{display:inline-block}.bootstrap-duallistbox-container .move,.bootstrap-duallistbox-container .remove{width:60%}.bootstrap-duallistbox-container .btn-group .btn{border-bottom-left-radius:0;border-bottom-right-radius:0}.bootstrap-duallistbox-container select{border-top-left-radius:0;border-top-right-radius:0}.bootstrap-duallistbox-container .moveall,.bootstrap-duallistbox-container .removeall{width:40%}.bootstrap-duallistbox-container.bs2compatible .btn-group>.btn+.btn{margin-left:0}.bootstrap-duallistbox-container select{width:100%;height:300px;padding:0}.bootstrap-duallistbox-container .filter{display:inline-block;width:100%;height:31px;margin:0 0 5px 0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-duallistbox-container .filter.placeholder{color:#aaa}.bootstrap-duallistbox-container.moveonselect .move,.bootstrap-duallistbox-container.moveonselect .remove{display:none}.bootstrap-duallistbox-container.moveonselect .moveall,.bootstrap-duallistbox-container.moveonselect .removeall{width:100%} -------------------------------------------------------------------------------- /src/main/webapp/assets/css/bootstrap-multiselect.min.css: -------------------------------------------------------------------------------- 1 | .multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.radio,.multiselect-container>li>a>label.checkbox{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.filter .btn{padding:6px 3px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0} -------------------------------------------------------------------------------- /src/main/webapp/assets/css/bootstrap-timepicker.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Timepicker Component for Twitter Bootstrap 3 | * 4 | * Copyright 2013 Joris de Wit 5 | * 6 | * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */.bootstrap-timepicker{position:relative}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu{left:auto;right:0}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before{left:auto;right:12px}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after{left:auto;right:13px}.bootstrap-timepicker .add-on{cursor:pointer}.bootstrap-timepicker .add-on i{display:inline-block;width:16px;height:16px}.bootstrap-timepicker-widget.dropdown-menu{padding:4px}.bootstrap-timepicker-widget.dropdown-menu.open{display:inline-block}.bootstrap-timepicker-widget.dropdown-menu:before{border-bottom:7px solid rgba(0,0,0,.2);border-left:7px solid transparent;border-right:7px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.dropdown-menu:after{border-bottom:6px solid #FFF;border-left:6px solid transparent;border-right:6px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.timepicker-orient-left:before{left:6px}.bootstrap-timepicker-widget.timepicker-orient-left:after{left:7px}.bootstrap-timepicker-widget.timepicker-orient-right:before{right:6px}.bootstrap-timepicker-widget.timepicker-orient-right:after{right:7px}.bootstrap-timepicker-widget.timepicker-orient-top:before{top:-7px}.bootstrap-timepicker-widget.timepicker-orient-top:after{top:-6px}.bootstrap-timepicker-widget.timepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.bootstrap-timepicker-widget.timepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.bootstrap-timepicker-widget a.btn,.bootstrap-timepicker-widget input{border-radius:4px}.bootstrap-timepicker-widget table{width:100%;margin:0}.bootstrap-timepicker-widget table td{text-align:center;height:30px;margin:0;padding:2px}.bootstrap-timepicker-widget table td:not(.separator){min-width:30px}.bootstrap-timepicker-widget table td span{width:100%}.bootstrap-timepicker-widget table td a{border:1px transparent solid;width:100%;display:inline-block;margin:0;padding:8px 0;outline:0;color:#333}.bootstrap-timepicker-widget table td a:hover{text-decoration:none;background-color:#eee;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-color:#ddd}.bootstrap-timepicker-widget table td a i{margin-top:2px;font-size:18px}.bootstrap-timepicker-widget table td input{width:25px;margin:0;text-align:center}.bootstrap-timepicker-widget .modal-content{padding:4px}@media (min-width:767px){.bootstrap-timepicker-widget.modal{width:200px;margin-left:-100px}}@media (max-width:767px){.bootstrap-timepicker{width:100%}.bootstrap-timepicker .dropdown-menu{width:100%}} -------------------------------------------------------------------------------- /src/main/webapp/assets/css/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/chosen-sprite.png -------------------------------------------------------------------------------- /src/main/webapp/assets/css/chosen-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/chosen-sprite@2x.png -------------------------------------------------------------------------------- /src/main/webapp/assets/css/colorpicker.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Colorpicker for Bootstrap 3 | * 4 | * Copyright 2012 Stefan Petre 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | */.colorpicker-saturation{width:100px;height:100px;background-image:url(img/saturation.png);cursor:crosshair;float:left}.colorpicker-saturation i{display:block;height:5px;width:5px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;position:absolute;top:0;left:0;margin:-4px 0 0 -4px}.colorpicker-saturation i b{display:block;height:5px;width:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-hue,.colorpicker-alpha{width:15px;height:100px;float:left;cursor:row-resize;margin-left:4px;margin-bottom:4px}.colorpicker-hue i,.colorpicker-alpha i{display:block;height:1px;background:#000;border-top:1px solid #fff;position:absolute;top:0;left:0;width:100%;margin-top:-1px}.colorpicker-hue{background-image:url(img/hue.png)}.colorpicker-alpha{background-image:url(img/alpha.png);display:none}.colorpicker{*zoom:1;top:0;left:0;padding:4px;min-width:120px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.colorpicker:before,.colorpicker:after{display:table;content:""}.colorpicker:after{clear:both}.colorpicker:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);position:absolute;top:-7px;left:6px}.colorpicker:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.colorpicker div{position:relative}.colorpicker.alpha{min-width:140px}.colorpicker.alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url(img/alpha.png);background-position:0 100%}.colorpicker-color div{height:10px}.input-append.color .add-on i,.input-prepend.color .add-on i{display:block;cursor:pointer;width:16px;height:16px} -------------------------------------------------------------------------------- /src/main/webapp/assets/css/common.css: -------------------------------------------------------------------------------- 1 | .login-layout { 2 | background-color: #ffffff; 3 | } 4 | 5 | table.dataTable tbody tr.selected { 6 | background-color: #b0bed9; 7 | } 8 | 9 | tr.group, tr.group:hover { 10 | background-color: #ddd !important; 11 | } 12 | 13 | .hover-form { 14 | background-color: #f7f7f7; 15 | border: 1px solid #aeaeae; 16 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); 17 | padding: 3px; 18 | width: 200px; 19 | } -------------------------------------------------------------------------------- /src/main/webapp/assets/css/fonts.googleapis.com.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Open Sans'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: local('Open Sans Light'), local('OpenSans-Light'), url(http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Open Sans'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: local('Open Sans'), local('OpenSans'), url(http://fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff'); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/webapp/assets/css/images/border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/images/border.png -------------------------------------------------------------------------------- /src/main/webapp/assets/css/images/controls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/images/controls.png -------------------------------------------------------------------------------- /src/main/webapp/assets/css/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/images/loading.gif -------------------------------------------------------------------------------- /src/main/webapp/assets/css/images/loading_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/images/loading_background.png -------------------------------------------------------------------------------- /src/main/webapp/assets/css/images/meteorshower2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/images/meteorshower2.jpg -------------------------------------------------------------------------------- /src/main/webapp/assets/css/images/overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/images/overlay.png -------------------------------------------------------------------------------- /src/main/webapp/assets/css/images/pattern.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/images/pattern.jpg -------------------------------------------------------------------------------- /src/main/webapp/assets/css/img/alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/img/alpha.png -------------------------------------------------------------------------------- /src/main/webapp/assets/css/img/hue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/img/hue.png -------------------------------------------------------------------------------- /src/main/webapp/assets/css/img/saturation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/img/saturation.png -------------------------------------------------------------------------------- /src/main/webapp/assets/css/jquery-ui.custom.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.11.2 - 2014-10-28 2 | * http://jqueryui.com 3 | * Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, slider.css 4 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0} -------------------------------------------------------------------------------- /src/main/webapp/assets/css/jquery.gritter.min.css: -------------------------------------------------------------------------------- 1 | #gritter-notice-wrapper{position:fixed;top:20px;right:20px;width:301px;z-index:9999}#gritter-notice-wrapper.top-left{left:20px;right:auto}#gritter-notice-wrapper.bottom-right{top:auto;left:auto;bottom:20px;right:20px}#gritter-notice-wrapper.bottom-left{top:auto;right:auto;bottom:20px;left:20px}.gritter-item-wrapper{position:relative;margin:0 0 10px 0;background:url(../images/ie-spacer.gif)}.gritter-top{background:url(../images/gritter.png) no-repeat left -30px;height:10px}.hover .gritter-top{background-position:right -30px}.gritter-bottom{background:url(../images/gritter.png) no-repeat left bottom;height:8px;margin:0}.hover .gritter-bottom{background-position:bottom right}.gritter-item{display:block;background:url(../images/gritter.png) no-repeat left -40px;color:#eee;padding:2px 11px 8px 11px;font-size:11px;font-family:verdana}.hover .gritter-item{background-position:right -40px}.gritter-item p{padding:0;margin:0;word-wrap:break-word}.gritter-close{display:none;position:absolute;top:5px;left:3px;background:url(../images/gritter.png) no-repeat left top;cursor:pointer;width:30px;height:30px}.gritter-title{font-size:14px;font-weight:700;padding:0 0 7px 0;display:block;text-shadow:1px 1px 0 #000}.gritter-image{width:48px;height:48px;float:left}.gritter-with-image,.gritter-without-image{padding:0}.gritter-with-image{width:220px;float:right}.gritter-light .gritter-item,.gritter-light .gritter-bottom,.gritter-light .gritter-top,.gritter-light .gritter-close{background-image:url(../images/gritter-light.png);color:#222}.gritter-light .gritter-title{text-shadow:none} -------------------------------------------------------------------------------- /src/main/webapp/assets/css/select2-spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/select2-spinner.gif -------------------------------------------------------------------------------- /src/main/webapp/assets/css/select2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/select2.png -------------------------------------------------------------------------------- /src/main/webapp/assets/css/select2x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/css/select2x2.png -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome/4.1.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/font-awesome/4.1.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome/4.1.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/font-awesome/4.1.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome/4.1.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/font-awesome/4.1.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome/4.2.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/font-awesome/4.2.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome/4.2.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/font-awesome/4.2.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome/4.2.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/font-awesome/4.2.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/main/webapp/assets/fonts/fonts.googleapis.com.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Open Sans'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: local('Open Sans Light'), local('OpenSans-Light'), url(http://fonts.gstatic.com/s/opensans/v10/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Open Sans'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: local('Open Sans'), local('OpenSans'), url(http://fonts.gstatic.com/s/opensans/v10/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff'); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/webapp/assets/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/main/webapp/assets/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/main/webapp/assets/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/main/webapp/assets/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /src/main/webapp/assets/images/intro/code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/intro/code.png -------------------------------------------------------------------------------- /src/main/webapp/assets/images/intro/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/intro/dashboard.png -------------------------------------------------------------------------------- /src/main/webapp/assets/images/intro/dashboard1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/intro/dashboard1.png -------------------------------------------------------------------------------- /src/main/webapp/assets/images/intro/keeper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/intro/keeper.png -------------------------------------------------------------------------------- /src/main/webapp/assets/images/system/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/system/favicon.ico -------------------------------------------------------------------------------- /src/main/webapp/assets/images/system/keeper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/system/keeper.png -------------------------------------------------------------------------------- /src/main/webapp/assets/images/system/user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/system/user.jpg -------------------------------------------------------------------------------- /src/main/webapp/assets/images/zkdoc/balance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/zkdoc/balance.png -------------------------------------------------------------------------------- /src/main/webapp/assets/images/zkdoc/idmaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/zkdoc/idmaker.png -------------------------------------------------------------------------------- /src/main/webapp/assets/images/zkdoc/lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/zkdoc/lock.png -------------------------------------------------------------------------------- /src/main/webapp/assets/images/zkdoc/master.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/zkdoc/master.png -------------------------------------------------------------------------------- /src/main/webapp/assets/images/zkdoc/queue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/zkdoc/queue.png -------------------------------------------------------------------------------- /src/main/webapp/assets/images/zkdoc/subscribe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamberken/zookeeper-admin/26dce5cf8be8a1ea65bd11fa559c6fa83191cb2c/src/main/webapp/assets/images/zkdoc/subscribe.png -------------------------------------------------------------------------------- /src/main/webapp/assets/js/base/buttons.colVis.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Column visibility buttons for Buttons and DataTables. 3 | * 2015 SpryMedia Ltd - datatables.net/license 4 | */ 5 | !function(a){"function"==typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(b){return a(b,window,document)}):"object"==typeof exports?module.exports=function(b,c){return b||(b=window),c&&c.fn.dataTable||(c=require("datatables.net")(b,c).$),c.fn.dataTable.Buttons||require("datatables.net-buttons")(b,c),a(c,b,b.document)}:a(jQuery,window,document)}(function(a,b,c,d){"use strict";var e=a.fn.dataTable;return a.extend(e.ext.buttons,{colvis:function(a,b){return{extend:"collection",text:function(a){return a.i18n("buttons.colvis","Column visibility")},className:"buttons-colvis",buttons:[{extend:"columnsToggle",columns:b.columns}]}},columnsToggle:function(a,b){var c=a.columns(b.columns).indexes().map(function(a){return{extend:"columnToggle",columns:a}}).toArray();return c},columnToggle:function(a,b){return{extend:"columnVisibility",columns:b.columns}},columnsVisibility:function(a,b){var c=a.columns(b.columns).indexes().map(function(a){return{extend:"columnVisibility",columns:a,visibility:b.visibility}}).toArray();return c},columnVisibility:{columns:d,text:function(a,b,c){return c._columnText(a,c.columns)},className:"buttons-columnVisibility",action:function(a,b,c,e){var f=b.columns(e.columns),g=f.visible();f.visible(e.visibility!==d?e.visibility:!(g.length?g[0]:!1))},init:function(a,b,c){var d=this,e=a.column(c.columns);a.on("column-visibility.dt"+c.namespace,function(a,b,e,f){b.bDestroying||e!==c.columns||d.active(f)}).on("column-reorder.dt"+c.namespace,function(b,e,f){if(1===a.columns(c.columns).count()){"number"==typeof c.columns&&(c.columns=f.mapping[c.columns]);var g=a.column(c.columns);d.text(c._columnText(a,c.columns)),d.active(g.visible())}}),this.active(e.visible())},destroy:function(a,b,c){a.off("column-visibility.dt"+c.namespace).off("column-reorder.dt"+c.namespace)},_columnText:function(a,b){var c=a.column(b).index();return a.settings()[0].aoColumns[c].sTitle.replace(/\n/g," ").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,"")}},colvisRestore:{className:"buttons-colvisRestore",text:function(a){return a.i18n("buttons.colvisRestore","Restore visibility")},init:function(a,b,c){c._visOriginal=a.columns().indexes().map(function(b){return a.column(b).visible()}).toArray()},action:function(a,b,c,d){b.columns().every(function(a){var c=b.colReorder&&b.colReorder.transpose?b.colReorder.transpose(a,"toOriginal"):a;this.visible(d._visOriginal[c])})}},colvisGroup:{className:"buttons-colvisGroup",action:function(a,b,c,d){b.columns(d.show).visible(!0),b.columns(d.hide).visible(!1)},show:[],hide:[]}}),e.Buttons}); -------------------------------------------------------------------------------- /src/main/webapp/assets/js/base/buttons.print.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Print button for Buttons and DataTables. 3 | * 2015 SpryMedia Ltd - datatables.net/license 4 | */ 5 | !function(a){"function"==typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(b){return a(b,window,document)}):"object"==typeof exports?module.exports=function(b,c){return b||(b=window),c&&c.fn.dataTable||(c=require("datatables.net")(b,c).$),c.fn.dataTable.Buttons||require("datatables.net-buttons")(b,c),a(c,b,b.document)}:a(jQuery,window,document)}(function(a,b,c,d){"use strict";var e=a.fn.dataTable,f=c.createElement("a"),g=function(b){var c,d=a(b).clone()[0];return"link"===d.nodeName.toLowerCase()&&(f.href=d.href,c=f.host,-1===c.indexOf("/")&&0!==f.pathname.indexOf("/")&&(c+="/"),d.href=f.protocol+"//"+c+f.pathname+f.search),d.outerHTML};return e.ext.buttons.print={className:"buttons-print",text:function(a){return a.i18n("buttons.print","Print")},action:function(c,d,e,f){var h=d.buttons.exportData(f.exportOptions),i=function(a,b){for(var c="",d=0,e=a.length;e>d;d++)c+="<"+b+">"+a[d]+"";return c+""},j='';f.header&&(j+=""+i(h.header,"th")+""),j+="";for(var k=0,l=h.body.length;l>k;k++)j+=i(h.body[k],"td");j+="",f.footer&&(j+=""+i(h.footer,"th")+"");var m=b.open("",""),n=f.title;"function"==typeof n&&(n=n()),-1!==n.indexOf("*")&&(n=n.replace("*",a("title").text())),m.document.close();var o=""+n+"";a("style, link").each(function(){o+=g(this)}),a(m.document.head).html(o),a(m.document.body).html("

"+n+"

"+f.message+"
"+j),f.customize&&f.customize(m),setTimeout(function(){f.autoPrint&&(m.print(),m.close())},250)},title:"*",message:"",exportOptions:{},header:!0,footer:!1,autoPrint:!0,customize:null},e.Buttons}); -------------------------------------------------------------------------------- /src/main/webapp/assets/js/base/html5shiv.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document),Function.prototype.bind||(Function.prototype.bind=function(a){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d&&a?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e}); -------------------------------------------------------------------------------- /src/main/webapp/assets/js/base/jquery.cookie.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Cookie Plugin v1.3.1 3 | * https://github.com/carhartl/jquery-cookie 4 | * 5 | * Copyright 2013 Klaus Hartl 6 | * Released under the MIT license 7 | */ 8 | (function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(e){var a=/\+/g;function d(g){return g}function b(g){return decodeURIComponent(g.replace(a," "))}function f(g){if(g.indexOf('"')===0){g=g.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\")}try{return c.json?JSON.parse(g):g}catch(h){}}var c=e.cookie=function(p,o,u){if(o!==undefined){u=e.extend({},c.defaults,u);if(typeof u.expires==="number"){var q=u.expires,s=u.expires=new Date();s.setDate(s.getDate()+q)}o=c.json?JSON.stringify(o):String(o);return(document.cookie=[c.raw?p:encodeURIComponent(p),"=",c.raw?o:encodeURIComponent(o),u.expires?"; expires="+u.expires.toUTCString():"",u.path?"; path="+u.path:"",u.domain?"; domain="+u.domain:"",u.secure?"; secure":""].join(""))}var g=c.raw?d:b;var r=document.cookie.split("; ");var v=p?undefined:{};for(var n=0,k=r.length;n=0;i--){var m=a(f[i]);if(m[0]==b||m.is(":visible")){var n=m.width(),o=m.height(),p=m.data(k);!p||n===p.w&&o===p.h||(m.trigger(j,[p.w=n,p.h=o]),h=c||!0)}else p=m.data(k),p.w=0,p.h=0}null!==e&&(h&&(null==c||1e3>c-h)?e=b.requestAnimationFrame(d):(e=setTimeout(d,g[l]),h=!1))}var e,f=[],g=a.resize=a.extend(a.resize,{}),h=!1,i="setTimeout",j="resize",k=j+"-special-event",l="pendingDelay",m="activeDelay",n="throttleWindow";g[l]=200,g[m]=20,g[n]=!0,a.event.special[j]={setup:function(){if(!g[n]&&this[i])return!1;var b=a(this);f.push(this),b.data(k,{w:b.width(),h:b.height()}),1===f.length&&(e=c,d())},teardown:function(){if(!g[n]&&this[i])return!1;for(var b=a(this),c=f.length-1;c>=0;c--)if(f[c]==this){f.splice(c,1);break}b.removeData(k),f.length||(h?cancelAnimationFrame(e):clearTimeout(e),e=null)},add:function(b){function d(b,d,f){var g=a(this),h=g.data(k)||{};h.w=d!==c?d:g.width(),h.h=f!==c?f:g.height(),e.apply(this,arguments)}if(!g[n]&&this[i])return!1;var e;return a.isFunction(b)?(e=b,d):(e=b.handler,void(b.handler=d))}},b.requestAnimationFrame||(b.requestAnimationFrame=function(){return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||b.oRequestAnimationFrame||b.msRequestAnimationFrame||function(a){return b.setTimeout(function(){a((new Date).getTime())},g[m])}}()),b.cancelAnimationFrame||(b.cancelAnimationFrame=function(){return b.webkitCancelRequestAnimationFrame||b.mozCancelRequestAnimationFrame||b.oCancelRequestAnimationFrame||b.msCancelRequestAnimationFrame||clearTimeout}())}(jQuery,this),function(a){function b(a){function b(){var b=a.getPlaceholder();0!=b.width()&&0!=b.height()&&(a.resize(),a.setupGrid(),a.draw())}function c(a){a.getPlaceholder().resize(b)}function d(a){a.getPlaceholder().unbind("resize",b)}a.hooks.bindEvents.push(c),a.hooks.shutdown.push(d)}var c={};a.plot.plugins.push({init:b,options:c,name:"resize",version:"1.0"})}(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/assets/js/base/jquery.hotkeys.index.min.js: -------------------------------------------------------------------------------- 1 | /*jslint browser: true*/ 2 | /*jslint jquery: true*/ 3 | !function(a){function b(b){if("string"==typeof b.data&&(b.data={keys:b.data}),b.data&&b.data.keys&&"string"==typeof b.data.keys){var c=b.handler,d=b.data.keys.toLowerCase().split(" ");b.handler=function(b){if(this===b.target||!(a.hotkeys.options.filterInputAcceptingElements&&a.hotkeys.textInputTypes.test(b.target.nodeName)||a.hotkeys.options.filterContentEditable&&a(b.target).attr("contenteditable")||a.hotkeys.options.filterTextInputs&&a.inArray(b.target.type,a.hotkeys.textAcceptingInputTypes)>-1)){var e="keypress"!==b.type&&a.hotkeys.specialKeys[b.which],f=String.fromCharCode(b.which).toLowerCase(),g="",h={};a.each(["alt","ctrl","shift"],function(a,c){b[c+"Key"]&&e!==c&&(g+=c+"+")}),b.metaKey&&!b.ctrlKey&&"meta"!==e&&(g+="meta+"),b.metaKey&&"meta"!==e&&g.indexOf("alt+ctrl+shift+")>-1&&(g=g.replace("alt+ctrl+shift+","hyper+")),e?h[g+e]=!0:(h[g+f]=!0,h[g+a.hotkeys.shiftNums[f]]=!0,"shift+"===g&&(h[a.hotkeys.shiftNums[f]]=!0));for(var i=0,j=d.length;j>i;i++)if(h[d[i]])return c.apply(this,arguments)}}}}a.hotkeys={version:"0.2.0",specialKeys:{8:"backspace",9:"tab",10:"return",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",59:";",61:"=",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},shiftNums:{"`":"~",1:"!",2:"@",3:"#",4:"$",5:"%",6:"^",7:"&",8:"*",9:"(",0:")","-":"_","=":"+",";":": ","'":'"',",":"<",".":">","/":"?","\\":"|"},textAcceptingInputTypes:["text","password","number","email","url","range","date","month","week","time","datetime","datetime-local","search","color","tel"],textInputTypes:/textarea|input|select/i,options:{filterInputAcceptingElements:!0,filterTextInputs:!0,filterContentEditable:!0}},a.each(["keydown","keyup","keypress"],function(){a.event.special[this]={add:b}})}(jQuery||this.jQuery||window.jQuery); -------------------------------------------------------------------------------- /src/main/webapp/assets/js/base/jquery.hotkeys.min.js: -------------------------------------------------------------------------------- 1 | !function(a){function b(b){if("string"==typeof b.data&&(b.data={keys:b.data}),b.data&&b.data.keys&&"string"==typeof b.data.keys){var c=b.handler,d=b.data.keys.toLowerCase().split(" ");b.handler=function(b){if(this===b.target||!(/textarea|select/i.test(b.target.nodeName)||a.hotkeys.options.filterTextInputs&&a.inArray(b.target.type,a.hotkeys.textAcceptingInputTypes)>-1)){var e="keypress"!==b.type&&a.hotkeys.specialKeys[b.which],f=String.fromCharCode(b.which).toLowerCase(),g="",h={};a.each(["alt","ctrl","shift"],function(a,c){b[c+"Key"]&&e!==c&&(g+=c+"+")}),b.metaKey&&!b.ctrlKey&&"meta"!==e&&(g+="meta+"),b.metaKey&&"meta"!==e&&g.indexOf("alt+ctrl+shift+")>-1&&(g=g.replace("alt+ctrl+shift+","hyper+")),e?h[g+e]=!0:(h[g+f]=!0,h[g+a.hotkeys.shiftNums[f]]=!0,"shift+"===g&&(h[a.hotkeys.shiftNums[f]]=!0));for(var i=0,j=d.length;j>i;i++)if(h[d[i]])return c.apply(this,arguments)}}}}a.hotkeys={version:"0.8",specialKeys:{8:"backspace",9:"tab",10:"return",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",59:";",61:"=",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},shiftNums:{"`":"~",1:"!",2:"@",3:"#",4:"$",5:"%",6:"^",7:"&",8:"*",9:"(",0:")","-":"_","=":"+",";":": ","'":'"',",":"<",".":">","/":"?","\\":"|"},textAcceptingInputTypes:["text","password","number","email","url","range","date","month","week","time","datetime","datetime-local","search","color","tel"],options:{filterTextInputs:!0}},a.each(["keydown","keyup","keypress"],function(){a.event.special[this]={add:b}})}(jQuery||this.jQuery||window.jQuery); -------------------------------------------------------------------------------- /src/main/webapp/assets/js/base/jquery.inputlimiter.1.3.1.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.inputlimiter=function(b){{var c=a.extend({},a.fn.inputlimiter.defaults,b);a(this)}c.boxAttach&&!a("#"+c.boxId).length&&(a("
").appendTo("body").attr({id:c.boxId,"class":c.boxClass}).css({position:"absolute"}).hide(),a.fn.bgiframe&&a("#"+c.boxId).bgiframe());var d=function(){var b=a(this),d=g(b.val());!c.allowExceed&&d>c.limit&&b.val(h(b.val())),c.boxAttach&&a("#"+c.boxId).css({width:b.outerWidth()-(a("#"+c.boxId).outerWidth()-a("#"+c.boxId).width())+"px",left:b.offset().left+"px",top:b.offset().top+b.outerHeight()-1+"px","z-index":2e3});var e=c.limit-d>0?c.limit-d:0,f=c.remTextFilter(c,e),i=c.limitTextFilter(c);if(c.limitTextShow){a("#"+c.boxId).html(f+" "+i);var j=a("").appendTo("body").attr({id:"19cc9195583bfae1fad88e19d443be7a","class":c.boxClass}).html(f+" "+i).innerWidth();a("#19cc9195583bfae1fad88e19d443be7a").remove(),j>a("#"+c.boxId).innerWidth()&&a("#"+c.boxId).html(f+"
"+i),a("#"+c.boxId).show()}else a("#"+c.boxId).html(f).show()},e=function(b){var d=g(a(this).val());if(!c.allowExceed&&d>c.limit){var e=b.ctrlKey||b.altKey||b.metaKey;if(!e&&b.which>=32&&b.which<=122&&this.selectionStart===this.selectionEnd)return!1}},f=function(){var b=a(this);if(count=g(b.val()),!c.allowExceed&&count>c.limit&&b.val(h(b.val())),c.boxAttach)a("#"+c.boxId).fadeOut("fast");else if(c.remTextHideOnBlur){var d=c.limitText;d=d.replace(/\%n/g,c.limit),d=d.replace(/\%s/g,1===c.limit?"":"s"),a("#"+c.boxId).html(d)}},g=function(b){if("words"===c.limitBy.toLowerCase())return b.length>0?a.trim(b).replace(/\ +(?= )/g,"").split(" ").length:0;var d=b.length,e=b.match(/\n/g);return e&&c.lineReturnCount>1&&(d+=e.length*(c.lineReturnCount-1)),d},h=function(b){return"words"===c.limitBy.toLowerCase()?a.trim(b).replace(/\ +(?= )/g,"").split(" ").splice(0,c.limit).join(" ")+" ":b.substring(0,c.limit)};a(this).each(function(){var g=a(this);(!b||!b.limit)&&c.useMaxlength&&parseInt(g.attr("maxlength"))>0&&parseInt(g.attr("maxlength"))!=c.limit?g.inputlimiter(a.extend({},c,{limit:parseInt(g.attr("maxlength"))})):(!c.allowExceed&&c.useMaxlength&&"characters"===c.limitBy.toLowerCase()&&g.attr("maxlength",c.limit),g.unbind(".inputlimiter"),g.bind("keyup.inputlimiter",d),g.bind("keypress.inputlimiter",e),g.bind("blur.inputlimiter",f))})},a.fn.inputlimiter.remtextfilter=function(a,b){var c=a.remText;return 0===b&&null!==a.remFullText&&(c=a.remFullText),c=c.replace(/\%n/g,b),c=c.replace(/\%s/g,a.zeroPlural?1===b?"":"s":1>=b?"":"s")},a.fn.inputlimiter.limittextfilter=function(a){var b=a.limitText;return b=b.replace(/\%n/g,a.limit),b=b.replace(/\%s/g,a.limit<=1?"":"s")},a.fn.inputlimiter.defaults={limit:255,boxAttach:!0,boxId:"limiterBox",boxClass:"limiterBox",remText:"%n character%s remaining.",remTextFilter:a.fn.inputlimiter.remtextfilter,remTextHideOnBlur:!0,remFullText:null,limitTextShow:!0,limitText:"Field limited to %n character%s.",limitTextFilter:a.fn.inputlimiter.limittextfilter,zeroPlural:!0,allowExceed:!1,useMaxlength:!0,limitBy:"characters",lineReturnCount:1}}(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/assets/js/base/jquery.ui.touch-punch.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Touch Punch 0.2.3 3 | * 4 | * Copyright 2011–2014, Dave Furfero 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * 7 | * Depends: 8 | * jquery.ui.widget.js 9 | * jquery.ui.mouse.js 10 | */ 11 | !function(a){function b(a,b,c){if(!(a.originalEvent.touches.length>1)){c!==!1&&a.preventDefault();var d=a.originalEvent.changedTouches[0],e=document.createEvent("MouseEvents");e.initMouseEvent(b,!0,!0,window,1,d.screenX,d.screenY,d.clientX,d.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(e)}}if(a.support.touch="ontouchend"in document,a.support.touch){var c,d=a.ui.mouse.prototype,e=d._mouseInit,f=d._mouseDestroy;d._touchStart=function(a){var d=this;!c&&d._mouseCapture(a.originalEvent.changedTouches[0])&&(c=!0,d._touchMoved=!1,b(a,"mouseover",!1),b(a,"mousemove",!1),b(a,"mousedown",!1))},d._touchMove=function(a){c&&(this._touchMoved=!0,b(a,"mousemove"))},d._touchEnd=function(a){c&&(b(a,"mouseup"),b(a,"mouseout"),this._touchMoved||b(a,"click"),c=!1)},d._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),e.call(b)},d._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),f.call(b)}}}(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/assets/js/plugins/bootstrapValidator/bootstrapValidator.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * BootstrapValidator (http://bootstrapvalidator.com) 3 | * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3 4 | * 5 | * @version v0.5.3, built on 2014-11-05 9:14:18 PM 6 | * @author https://twitter.com/nghuuphuoc 7 | * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc 8 | * @license Commercial: http://bootstrapvalidator.com/license/ 9 | * Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0/ 10 | */ 11 | 12 | .bv-form .help-block{margin-bottom:0}.bv-form .tooltip-inner{text-align:left}.nav-tabs li.bv-tab-success>a{color:#3c763d}.nav-tabs li.bv-tab-error>a{color:#a94442}.bv-form .bv-icon-no-label{top:0}.bv-form .bv-icon-input-group{top:0;z-index:100} -------------------------------------------------------------------------------- /src/main/webapp/assets/js/plugins/datatables/dataTables.bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | DataTables Bootstrap 3 integration 3 | ©2011-2015 SpryMedia Ltd - datatables.net/license 4 | */ 5 | (function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d,m){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(f.ext.classes, 6 | {sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,s,j,n){var o=new f.Api(a),t=a.oClasses,k=a.oLanguage.oPaginate,u=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")}; 7 | l=0;for(h=f.length;l",{"class":t.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("",{href:"#", 8 | "aria-controls":a.sTableId,"aria-label":u[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(v){}q(b(h).empty().html('