├── .gitattributes ├── LICENSE ├── README.md ├── azkaban-executor-2.5.0 ├── azkaban.version ├── bin │ ├── azkaban-executor-shutdown.sh │ ├── azkaban-executor-start.sh │ └── start-exec.sh ├── conf │ ├── azkaban.private.properties │ ├── azkaban.properties │ └── global.properties ├── extlib │ └── nothing ├── lib │ ├── azkaban-2.5.0.jar │ ├── commons-collections-3.2.1.jar │ ├── commons-configuration-1.8.jar │ ├── commons-dbcp-1.4.jar │ ├── commons-dbutils-1.5.jar │ ├── commons-email-1.2.jar │ ├── commons-fileupload-1.2.1.jar │ ├── commons-io-2.4.jar │ ├── commons-jexl-2.1.1.jar │ ├── commons-lang-2.6.jar │ ├── commons-logging-1.1.1.jar │ ├── commons-pool-1.6.jar │ ├── guava-13.0.1.jar │ ├── h2-1.3.170.jar │ ├── httpclient-4.2.1.jar │ ├── httpcore-4.2.1.jar │ ├── jackson-core-asl-1.9.5.jar │ ├── jackson-mapper-asl-1.9.5.jar │ ├── jetty-6.1.26.jar │ ├── jetty-util-6.1.26.jar │ ├── joda-time-2.0.jar │ ├── jopt-simple-4.3.jar │ ├── junit-4.8.jar │ ├── log4j-1.2.16.jar │ ├── mail-1.4.5.jar │ ├── mysql-connector-java-5.1.28.jar │ ├── servlet-api-2.5.jar │ ├── slf4j-api-1.6.1.jar │ ├── slf4j-log4j12-1.6.4.jar │ ├── velocity-1.7.jar │ └── velocity-tools-2.0.jar └── plugins │ └── nothing ├── azkaban-web-2.5.0 ├── azkaban.version ├── bin │ ├── azkaban-web-shutdown.sh │ ├── azkaban-web-start.sh │ ├── schedule2trigger.sh │ └── start-web.sh ├── conf │ ├── admin_user.properties │ ├── azkaban-users.xml │ └── azkaban.properties ├── extlib │ ├── mysql-connector-java-5.1.35-bin.jar │ └── nice_ldap.jar ├── keystore ├── lib │ ├── azkaban-2.5.0.jar │ ├── commons-collections-3.2.1.jar │ ├── commons-configuration-1.8.jar │ ├── commons-dbcp-1.4.jar │ ├── commons-dbutils-1.5.jar │ ├── commons-email-1.2.jar │ ├── commons-fileupload-1.2.1.jar │ ├── commons-io-2.4.jar │ ├── commons-jexl-2.1.1.jar │ ├── commons-lang-2.6.jar │ ├── commons-logging-1.1.1.jar │ ├── commons-pool-1.6.jar │ ├── guava-13.0.1.jar │ ├── h2-1.3.170.jar │ ├── httpclient-4.2.1.jar │ ├── httpcore-4.2.1.jar │ ├── jackson-core-asl-1.9.5.jar │ ├── jackson-mapper-asl-1.9.5.jar │ ├── jetty-6.1.26.jar │ ├── jetty-util-6.1.26.jar │ ├── joda-time-2.0.jar │ ├── jopt-simple-4.3.jar │ ├── junit-4.8.jar │ ├── log4j-1.2.16.jar │ ├── mail-1.4.5.jar │ ├── mysql-connector-java-5.1.28.jar │ ├── servlet-api-2.5.jar │ ├── slf4j-api-1.6.1.jar │ ├── slf4j-log4j12-1.6.4.jar │ ├── velocity-1.7.jar │ └── velocity-tools-2.0.jar ├── plugins │ └── nothing └── web │ ├── css │ ├── azkaban-graph.css │ ├── azkaban.css │ ├── bootstrap-datetimepicker.css │ ├── bootstrap.css │ ├── images │ │ ├── addIcon.png │ │ ├── animated-overlay.gif │ │ ├── dot-icon.png │ │ ├── redwarning.png │ │ ├── removeIcon.png │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ ├── ui-bg_flat_0_eeeeee_40x100.png │ │ ├── ui-bg_flat_35_dddddd_40x100.png │ │ ├── ui-bg_flat_55_c0402a_40x100.png │ │ ├── ui-bg_flat_55_eeeeee_40x100.png │ │ ├── ui-bg_flat_75_ffffff_40x100.png │ │ ├── ui-bg_glass_100_f8f8f8_1x400.png │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ ├── ui-bg_glass_60_eeeeee_1x400.png │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ │ ├── ui-bg_inset-hard_75_999999_1x100.png │ │ ├── ui-bg_inset-soft_50_c9c9c9_1x100.png │ │ ├── ui-icons_000000_256x240.png │ │ ├── ui-icons_222222_256x240.png │ │ ├── ui-icons_2e83ff_256x240.png │ │ ├── ui-icons_3383bb_256x240.png │ │ ├── ui-icons_454545_256x240.png │ │ ├── ui-icons_70b2e1_256x240.png │ │ ├── ui-icons_888888_256x240.png │ │ ├── ui-icons_999999_256x240.png │ │ ├── ui-icons_cccccc_256x240.png │ │ ├── ui-icons_cd0a0a_256x240.png │ │ ├── ui-icons_fbc856_256x240.png │ │ └── ui-icons_ffffff_256x240.png │ ├── jquery-ui-1.10.1.custom.css │ ├── jquery-ui-timepicker-addon.css │ ├── jquery-ui.css │ ├── jquery.svg.css │ └── morris.css │ ├── favicon.ico │ ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff │ ├── images │ ├── graph-icon.png │ └── logo.png │ └── js │ ├── azkaban │ ├── model │ │ ├── job-log.js │ │ └── svg-graph.js │ ├── namespace.js │ ├── util │ │ ├── ajax.js │ │ ├── common.js │ │ ├── date.js │ │ ├── flow-loader.js │ │ ├── job-status.js │ │ ├── layout.js │ │ ├── schedule.js │ │ ├── svg-navigate.js │ │ └── svgutils.js │ └── view │ │ ├── admin-setup.js │ │ ├── bak_flow-execution-list.js │ │ ├── context-menu.js │ │ ├── executions.js │ │ ├── exflow.js │ │ ├── flow-execute-dialog.js │ │ ├── flow-execution-list.js │ │ ├── flow-extended.js │ │ ├── flow-stats.js │ │ ├── flow.js │ │ ├── history-day.js │ │ ├── history.js │ │ ├── jmx.js │ │ ├── job-details.js │ │ ├── job-edit.js │ │ ├── job-history.js │ │ ├── job-list.js │ │ ├── login.js │ │ ├── main.js │ │ ├── message-dialog.js │ │ ├── project-logs.js │ │ ├── project-modals.js │ │ ├── project-permissions.js │ │ ├── project.js │ │ ├── schedule-options.js │ │ ├── schedule-panel.js │ │ ├── schedule-sla.js │ │ ├── schedule-svg.js │ │ ├── scheduled.js │ │ ├── svg-graph.js │ │ ├── table-sort.js │ │ ├── time-graph.js │ │ └── triggers.js │ ├── backbone-0.9.10-min.js │ ├── bootstrap-datetimepicker.min.js │ ├── bootstrap.min.js │ ├── d3.v3.min.js │ ├── dust-full-2.2.3.min.js │ ├── flowstats-no-data.js │ ├── flowstats.js │ ├── flowsummary.js │ ├── jquery.svg.js │ ├── jquery.svg.min.js │ ├── jquery.svganim.min.js │ ├── jquery.svgdom.js │ ├── jquery.svgdom.min.js │ ├── jquery.svgfilter.min.js │ ├── jquery │ ├── icons │ │ ├── file.png │ │ ├── flow.png │ │ ├── folder.png │ │ ├── folderopen.png │ │ └── job.png │ ├── jquery-1.9.1.js │ ├── jquery.autocomplete.css │ ├── jquery.autocomplete.pack.js │ ├── jquery.contextMenu.css │ ├── jquery.contextMenu.js │ ├── jquery.cookie.js │ ├── jquery.hotkeys.js │ ├── jquery.js │ ├── jquery.jstree.js │ ├── jquery.svg.min.js │ ├── jquery.tablesorter.js │ ├── jquery.tablesorter.min.js │ ├── jquery.tools.min.js │ ├── jquery.treeTable.min.js │ └── themes │ │ ├── apple │ │ ├── bg.jpg │ │ ├── d.png │ │ ├── dot_for_ie.gif │ │ ├── style.css │ │ └── throbber.gif │ │ ├── classic │ │ ├── d.png │ │ ├── dot_for_ie.gif │ │ ├── style.css │ │ └── throbber.gif │ │ ├── default-rtl │ │ ├── d.gif │ │ ├── d.png │ │ ├── dots.gif │ │ ├── style.css │ │ └── throbber.gif │ │ └── default │ │ ├── d.gif │ │ ├── d.png │ │ ├── style.css │ │ └── throbber.gif │ ├── jqueryui │ ├── jquery-ui-1.10.1.custom.js │ ├── jquery-ui-sliderAccess.js │ ├── jquery-ui-timepicker-addon.js │ ├── jquery.effects.blind.min.js │ ├── jquery.effects.bounce.min.js │ ├── jquery.effects.clip.min.js │ ├── jquery.effects.core.min.js │ ├── jquery.effects.drop.min.js │ ├── jquery.effects.explode.min.js │ ├── jquery.effects.fade.min.js │ ├── jquery.effects.fold.min.js │ ├── jquery.effects.highlight.min.js │ ├── jquery.effects.pulsate.min.js │ ├── jquery.effects.scale.min.js │ ├── jquery.effects.shake.min.js │ ├── jquery.effects.slide.min.js │ ├── jquery.effects.transfer.min.js │ ├── jquery.ui.accordion.min.js │ ├── jquery.ui.autocomplete.min.js │ ├── jquery.ui.button.min.js │ ├── jquery.ui.core.min.js │ ├── jquery.ui.datepicker.min.js │ ├── jquery.ui.dialog.min.js │ ├── jquery.ui.draggable.min.js │ ├── jquery.ui.droppable.min.js │ ├── jquery.ui.mouse.min.js │ ├── jquery.ui.position.min.js │ ├── jquery.ui.progressbar.min.js │ ├── jquery.ui.resizable.min.js │ ├── jquery.ui.selectable.min.js │ ├── jquery.ui.slider.min.js │ ├── jquery.ui.sortable.min.js │ ├── jquery.ui.tabs.min.js │ └── jquery.ui.widget.min.js │ ├── moment.min.js │ ├── morris.min.js │ ├── raphael.min.js │ └── underscore-1.4.4-min.js ├── azkaban_source_modified └── azkaban │ └── webapp │ └── servlet │ └── velocity │ ├── flowexecutionpanel.vm │ ├── jobpage.vm │ ├── nav.vm │ ├── scheduledflowpage.vm │ └── scheduleoptionspanel.vm ├── resources └── azkaban_create_table.sql ├── schedule ├── __init__.py ├── azkaban_alarm.py ├── azkaban_api.py ├── azkaban_helper.py ├── conf │ └── nice.cfg ├── exe_job.py ├── generate_files.py ├── job_define.py ├── job_status.py ├── util │ ├── __init__.py │ ├── alarm.py │ ├── config.py │ └── helpers │ │ ├── __init__.py │ │ └── mysql_helper.py └── webapp │ ├── handler │ ├── __init__.py │ ├── dag_edit.py │ ├── job_api.py │ ├── job_check_exist.py │ ├── job_delete.py │ ├── job_list.py │ ├── job_status_handler.py │ ├── job_to_update.py │ ├── job_update.py │ └── job_upload.py │ ├── model │ └── __init__.py │ ├── restart.sh │ ├── router │ └── schedule_router.py │ ├── shutdown.sh │ ├── startup.sh │ ├── static │ ├── css │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── dashboard.css │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── index.html │ ├── js │ │ ├── bootstrap-suggest.min.js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ ├── go.js │ │ ├── jquery.min.js │ │ └── npm.js │ └── test.html │ └── templates │ ├── dag_edit.html │ ├── list.html │ ├── to_login.html │ ├── to_update.html │ └── upload.html └── todo.md /.gitattributes: -------------------------------------------------------------------------------- 1 | *.html linguist-language=python 2 | *.js linguist-language=python 3 | *.css linguist-language=python 4 | *.java linguist-language=python 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # azkaban 2 | azkaban是一款非常给力的调度系统,由Linkedin开源,有以下主要功能: 3 | - Web用户界面 4 | - 调度工作流 5 | - 认证/授权(权限的工作) 6 | - 工作流和任务的日志记录和审计 7 | 8 | # azkaban_assistant 9 | 在nice内部使用过程中,对azkaban进行了扩展,实现了以下功能: 10 | - 任务管理WEB化(再也不用管理一堆文件了) 11 | - 远程服务调用(所有任务都是执行远程服务脚本) 12 | - 报警扩展(每个任务都可以配置邮件及短信报警了) 13 | - 跨流程的依赖选项(跨项目甚至是跨时间维度的任务依赖) 14 | - 图形化依赖配置(拖来拖去就把依赖关系配好了) 15 | - LDAP权限认证(不用再给每一个人添加帐号了) 16 | 17 | [简书直达车,有图有真相](http://www.jianshu.com/p/1673f1577589) 18 | 19 | 20 | # 安装部署 21 | 基于azkaban-2.5.0开发,对源文件有所改动 22 | 23 | ## 环境准备 24 | 1. 安装python,以及依赖模块tornado、paramiko 25 | 2. 创建azkaban数据库,导入resources/azkaban_create_table.sql (比原生多了两张表) 26 | 27 | ## 配置更新 28 | 1. 更新azkaban-executor/azkaban-web的配置文件(默认你们已经懂azkaban了,不清楚百度/谷歌) 29 | 2. 更新schedule/conf/nice.cfg 30 | 3. 工程azkaban-web中使用LDAP管理用户,提供了admin/admin_pwd这个默认超级管理员帐号。如果不支持LDAP,可改为默认方式,维护azkaban-users.xml中的用户即可 31 | 32 | ## 服务启动 33 | 1. 分别启动azkaban-executor/azkaban-web 34 | 2. 启动job管理服务(需与web工程在同一服务器下):schedule/webapp下执行startup.sh/restart.sh,查看schedule_web.log日志是否有报错 35 | 3. 登陆https://hostname:8443,先创建项目,再点击“任务配置”进行配置 36 | 37 | ## 需要注意的地方 38 | 1. 因为所有任务都是远程服务调用,**所以需要提前打通azkaban启动用户到各服务器的ssh权限!!!** 39 | 2. 邮件、短信接口已预留好,在schdule/util/alarm.py自定义,默认只在日志中打印出信息 40 | 3. 远程脚本是否正常结束,是通过shell执行script execute status ["$?"](最后一个命令的状态返回值)来判断的,所以下面的脚本: 41 | > sh test.sh 42 | > > echooo 'hello world' 43 | > > 44 | > > echo 'hello world' 45 | 46 | 虽然第一行出错,但最后一行继续执行并返回正确(相当于第一行的异常被捕获了),所以脚本仍认为是成功。使用的时候需要注意下 47 | 48 | 4. 在azkaban页面上kill任务时,仅会kill本地监听的脚本,远程脚本会继续执行下去(该特性暂时不做调整) 49 | 50 | # 关于nice 51 | 专注于图片与标签的社交APP~ 52 | 53 | # lalala 54 | [内部wiki亲情大放送](http://note.youdao.com/noteshare?id=395820b77024d74f4e4914cb13ef5e5f) 55 | -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/azkaban.version: -------------------------------------------------------------------------------- 1 | 2 | 2.5.0 3 | a6b9662c519678cabf26cf22a7986c06476c9d5b 4 | git@github.com:azkaban/azkaban2.git 5 | 2014-04-22 03:40 UTC 6 | -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/bin/azkaban-executor-shutdown.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | azkaban_dir=$(dirname $0)/.. 3 | 4 | executorport=`cat $azkaban_dir/conf/azkaban.properties | grep executor.port | cut -d = -f 2` 5 | echo "Shutting down current running AzkabanExecutorServer at port $executorport" 6 | 7 | proc=`cat $azkaban_dir/currentpid` 8 | 9 | kill $proc 10 | 11 | cat /dev/null > $azkaban_dir/currentpid 12 | -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/bin/azkaban-executor-start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | azkaban_dir=$(dirname $0)/.. 4 | 5 | if [[ -z "$tmpdir" ]]; then 6 | tmpdir=/tmp 7 | fi 8 | 9 | for file in $azkaban_dir/lib/*.jar; 10 | do 11 | CLASSPATH=$CLASSPATH:$file 12 | done 13 | 14 | for file in $azkaban_dir/extlib/*.jar; 15 | do 16 | CLASSPATH=$CLASSPATH:$file 17 | done 18 | 19 | for file in $azkaban_dir/plugins/*/*.jar; 20 | do 21 | CLASSPATH=$CLASSPATH:$file 22 | done 23 | 24 | if [ "HADOOP_HOME" != "" ]; then 25 | echo "Using Hadoop from $HADOOP_HOME" 26 | CLASSPATH=$CLASSPATH:$HADOOP_HOME/conf:$HADOOP_HOME/* 27 | JAVA_LIB_PATH="-Djava.library.path=$HADOOP_HOME/lib/native/Linux-amd64-64" 28 | else 29 | echo "Error: HADOOP_HOME is not set. Hadoop job types will not run properly." 30 | fi 31 | 32 | if [ "HIVE_HOME" != "" ]; then 33 | echo "Using Hive from $HIVE_HOME" 34 | CLASSPATH=$CLASSPATH:$HIVE_HOME/conf:$HIVE_HOME/lib/* 35 | fi 36 | 37 | echo $azkaban_dir; 38 | echo $CLASSPATH; 39 | 40 | executorport=`cat $azkaban_dir/conf/azkaban.properties | grep executor.port | cut -d = -f 2` 41 | echo "Starting AzkabanExecutorServer on port $executorport ..." 42 | serverpath=`pwd` 43 | 44 | if [ -z $AZKABAN_OPTS ]; then 45 | AZKABAN_OPTS="-Xmx3G" 46 | fi 47 | AZKABAN_OPTS="$AZKABAN_OPTS -server -Dcom.sun.management.jmxremote -Djava.io.tmpdir=$tmpdir -Dexecutorport=$executorport -Dserverpath=$serverpath" 48 | 49 | java $AZKABAN_OPTS $JAVA_LIB_PATH -cp $CLASSPATH azkaban.execapp.AzkabanExecutorServer -conf $azkaban_dir/conf $@ & 50 | 51 | echo $! > $azkaban_dir/currentpid 52 | 53 | -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/bin/start-exec.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | base_dir=$(dirname $0)/.. 4 | 5 | bin/azkaban-executor-start.sh $base_dir 2>&1>logs/executorServerLog__`date +%F+%T`.out & 6 | 7 | -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/conf/azkaban.private.properties: -------------------------------------------------------------------------------- 1 | # Optional Properties that are hidden to the executions -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/conf/azkaban.properties: -------------------------------------------------------------------------------- 1 | #Azkaban 2 | default.timezone.id=Asia/Shanghai 3 | 4 | # Azkaban JobTypes Plugins 5 | azkaban.jobtype.plugin.dir=plugins/jobtypes 6 | 7 | #Loader for projects 8 | executor.global.properties=conf/global.properties 9 | azkaban.project.dir=projects 10 | 11 | #数据库配置 12 | database.type=mysql 13 | mysql.port=3306 14 | mysql.host=192.168.72.91 15 | mysql.database=azkaban_meta 16 | mysql.user=root 17 | mysql.password= 18 | mysql.numconnections=100 19 | 20 | # Azkaban Executor settings 21 | executor.maxThreads=70 22 | executor.port=12321 23 | executor.flow.threads=60 24 | 25 | -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/conf/global.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/conf/global.properties -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/extlib/nothing: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/extlib/nothing -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/azkaban-2.5.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/azkaban-2.5.0.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/commons-collections-3.2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/commons-collections-3.2.1.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/commons-configuration-1.8.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/commons-configuration-1.8.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/commons-dbcp-1.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/commons-dbcp-1.4.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/commons-dbutils-1.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/commons-dbutils-1.5.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/commons-email-1.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/commons-email-1.2.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/commons-fileupload-1.2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/commons-fileupload-1.2.1.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/commons-io-2.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/commons-io-2.4.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/commons-jexl-2.1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/commons-jexl-2.1.1.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/commons-lang-2.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/commons-lang-2.6.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/commons-logging-1.1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/commons-logging-1.1.1.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/commons-pool-1.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/commons-pool-1.6.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/guava-13.0.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/guava-13.0.1.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/h2-1.3.170.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/h2-1.3.170.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/httpclient-4.2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/httpclient-4.2.1.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/httpcore-4.2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/httpcore-4.2.1.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/jackson-core-asl-1.9.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/jackson-core-asl-1.9.5.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/jackson-mapper-asl-1.9.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/jackson-mapper-asl-1.9.5.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/jetty-6.1.26.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/jetty-6.1.26.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/jetty-util-6.1.26.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/jetty-util-6.1.26.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/joda-time-2.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/joda-time-2.0.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/jopt-simple-4.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/jopt-simple-4.3.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/junit-4.8.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/junit-4.8.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/log4j-1.2.16.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/log4j-1.2.16.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/mail-1.4.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/mail-1.4.5.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/mysql-connector-java-5.1.28.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/mysql-connector-java-5.1.28.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/servlet-api-2.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/servlet-api-2.5.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/slf4j-api-1.6.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/slf4j-api-1.6.1.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/slf4j-log4j12-1.6.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/slf4j-log4j12-1.6.4.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/velocity-1.7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/velocity-1.7.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/lib/velocity-tools-2.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/lib/velocity-tools-2.0.jar -------------------------------------------------------------------------------- /azkaban-executor-2.5.0/plugins/nothing: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-executor-2.5.0/plugins/nothing -------------------------------------------------------------------------------- /azkaban-web-2.5.0/azkaban.version: -------------------------------------------------------------------------------- 1 | 2 | 2.5.0 3 | a6b9662c519678cabf26cf22a7986c06476c9d5b 4 | git@github.com:azkaban/azkaban2.git 5 | 2014-04-22 03:40 UTC 6 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/bin/azkaban-web-shutdown.sh: -------------------------------------------------------------------------------- 1 | azkaban_dir=$(dirname $0)/.. 2 | 3 | #!/bin/bash 4 | proc=`cat $azkaban_dir/currentpid` 5 | echo "killing AzkabanWebServer" 6 | kill $proc 7 | 8 | cat /dev/null > $azkaban_dir/currentpid 9 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/bin/azkaban-web-start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | azkaban_dir=$(dirname $0)/.. 4 | 5 | if [[ -z "$tmpdir" ]]; then 6 | tmpdir=/tmp 7 | fi 8 | 9 | for file in $azkaban_dir/lib/*.jar; 10 | do 11 | CLASSPATH=$CLASSPATH:$file 12 | done 13 | 14 | for file in $azkaban_dir/extlib/*.jar; 15 | do 16 | CLASSPATH=$CLASSPATH:$file 17 | done 18 | 19 | for file in $azkaban_dir/plugins/*/*.jar; 20 | do 21 | CLASSPATH=$CLASSPATH:$file 22 | done 23 | 24 | if [ "HADOOP_HOME" != "" ]; then 25 | echo "Using Hadoop from $HADOOP_HOME" 26 | CLASSPATH=$CLASSPATH:$HADOOP_HOME/conf:$HADOOP_HOME/* 27 | JAVA_LIB_PATH="-Djava.library.path=$HADOOP_HOME/lib/native/Linux-amd64-64" 28 | else 29 | echo "Error: HADOOP_HOME is not set. Hadoop job types will not run properly." 30 | fi 31 | 32 | if [ "HIVE_HOME" != "" ]; then 33 | echo "Using Hive from $HIVE_HOME" 34 | CLASSPATH=$CLASSPATH:$HIVE_HOME/conf:$HIVE_HOME/lib/* 35 | fi 36 | 37 | echo $azkaban_dir; 38 | echo $CLASSPATH; 39 | 40 | executorport=`cat $azkaban_dir/conf/azkaban.properties | grep executor.port | cut -d = -f 2` 41 | serverpath=`pwd` 42 | 43 | if [ -z $AZKABAN_OPTS ]; then 44 | AZKABAN_OPTS="-Xmx4G" 45 | fi 46 | AZKABAN_OPTS="$AZKABAN_OPTS -server -Dcom.sun.management.jmxremote -Djava.io.tmpdir=$tmpdir -Dexecutorport=$executorport -Dserverpath=$serverpath" 47 | 48 | java $AZKABAN_OPTS $JAVA_LIB_PATH -cp $CLASSPATH azkaban.webapp.AzkabanWebServer -conf $azkaban_dir/conf $@ & 49 | 50 | echo $! > $azkaban_dir/currentpid 51 | 52 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/bin/schedule2trigger.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | java -cp "lib/*:extlib/*" azkaban.migration.schedule2trigger.Schedule2Trigger conf/azkaban.properties 4 | 5 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/bin/start-web.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | bin=$(dirname $0)/.. 5 | 6 | bin/azkaban-web-start.sh $base_dir 2>&1 >logs/webServerLog_`date +%F+%T`.out & 7 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/conf/admin_user.properties: -------------------------------------------------------------------------------- 1 | admin_users=admin,azkaban_api 2 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/conf/azkaban-users.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/conf/azkaban.properties: -------------------------------------------------------------------------------- 1 | #Azkaban Personalization Settings 2 | azkaban.name=Nice 3 | azkaban.label=Nice Azkaban 4 | azkaban.color=#EEC900 5 | azkaban.default.servlet.path=/index 6 | web.resource.dir=web/ 7 | default.timezone.id=Asia/Shanghai 8 | 9 | #Azkaban UserManager class 10 | #user.manager.class=azkaban.user.XmlUserManager 11 | #user.manager.xml.file=conf/azkaban-users.xml 12 | 13 | #有ldap使用ldap,没有的话管理用户文件 14 | user.manager.class=azkaban.user.LdapUserManager 15 | #[ldap demo] url=>ldap://ldap.nice.com/ basedn=>CN=users,CN=accounts,DC=nice,DC=com 16 | user.manager.ldap.url= 17 | user.manager.ldap.basedn= 18 | 19 | #Loader for projects 20 | executor.global.properties=conf/global.properties 21 | azkaban.project.dir=projects 22 | 23 | #数据库配置 24 | database.type=mysql 25 | mysql.port=3306 26 | mysql.host=192.168.72.91 27 | mysql.database=azkaban_meta 28 | mysql.user=root 29 | mysql.password= 30 | mysql.numconnections=100 31 | 32 | # Velocity dev mode 33 | velocity.dev.mode=false 34 | 35 | # Azkaban Jetty server properties. 36 | jetty.hostname=localhost 37 | jetty.maxThreads=25 38 | jetty.ssl.port=8443 39 | jetty.port=8081 40 | jetty.keystore=keystore 41 | jetty.password=azkaban 42 | jetty.keypassword=azkaban 43 | jetty.truststore=keystore 44 | jetty.trustpassword=azkaban 45 | 46 | # Azkaban Executor settings 47 | executor.maxThreads=70 48 | executor.port=12321 49 | executor.flow.threads=60 50 | 51 | # mail settings 系统发件箱配置 52 | mail.sender= 53 | mail.host= 54 | mail.user= 55 | mail.password= 56 | job.failure.email= 57 | job.success.email= 58 | 59 | lockdown.create.projects=false 60 | 61 | cache.directory=cache 62 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/extlib/mysql-connector-java-5.1.35-bin.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/extlib/mysql-connector-java-5.1.35-bin.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/extlib/nice_ldap.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/extlib/nice_ldap.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/keystore -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/azkaban-2.5.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/azkaban-2.5.0.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/commons-collections-3.2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/commons-collections-3.2.1.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/commons-configuration-1.8.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/commons-configuration-1.8.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/commons-dbcp-1.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/commons-dbcp-1.4.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/commons-dbutils-1.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/commons-dbutils-1.5.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/commons-email-1.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/commons-email-1.2.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/commons-fileupload-1.2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/commons-fileupload-1.2.1.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/commons-io-2.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/commons-io-2.4.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/commons-jexl-2.1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/commons-jexl-2.1.1.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/commons-lang-2.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/commons-lang-2.6.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/commons-logging-1.1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/commons-logging-1.1.1.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/commons-pool-1.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/commons-pool-1.6.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/guava-13.0.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/guava-13.0.1.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/h2-1.3.170.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/h2-1.3.170.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/httpclient-4.2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/httpclient-4.2.1.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/httpcore-4.2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/httpcore-4.2.1.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/jackson-core-asl-1.9.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/jackson-core-asl-1.9.5.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/jackson-mapper-asl-1.9.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/jackson-mapper-asl-1.9.5.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/jetty-6.1.26.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/jetty-6.1.26.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/jetty-util-6.1.26.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/jetty-util-6.1.26.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/joda-time-2.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/joda-time-2.0.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/jopt-simple-4.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/jopt-simple-4.3.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/junit-4.8.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/junit-4.8.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/log4j-1.2.16.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/log4j-1.2.16.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/mail-1.4.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/mail-1.4.5.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/mysql-connector-java-5.1.28.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/mysql-connector-java-5.1.28.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/servlet-api-2.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/servlet-api-2.5.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/slf4j-api-1.6.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/slf4j-api-1.6.1.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/slf4j-log4j12-1.6.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/slf4j-log4j12-1.6.4.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/velocity-1.7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/velocity-1.7.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/lib/velocity-tools-2.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/lib/velocity-tools-2.0.jar -------------------------------------------------------------------------------- /azkaban-web-2.5.0/plugins/nothing: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/plugins/nothing -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/azkaban-graph.css: -------------------------------------------------------------------------------- 1 | .nodebox text { 2 | pointer-events: none; 3 | -webkit-touch-callout: none; 4 | -webkit-user-select: none; 5 | -khtml-user-select: none; 6 | -moz-user-select: none; 7 | -ms-user-select: none; 8 | user-select: none; 9 | } 10 | .nodebox image { 11 | pointer-events: none; 12 | } 13 | .nodebox > .border:hover { 14 | fill-opacity: 0.7; 15 | } 16 | .nodebox > .flowborder:hover { 17 | stroke-opacity: 0.7; 18 | } 19 | /* Nodes */ 20 | .node:hover { 21 | cursor: pointer; 22 | } 23 | .node.selected > .nodebox .border { 24 | stroke-width: 3; 25 | stroke: #39b3d7; 26 | } 27 | .node.selected > .nodebox .flowborder { 28 | stroke-width: 3; 29 | fill: #D9EDFF; 30 | } 31 | .border { 32 | stroke-width: 1; 33 | } 34 | .flownode .nodebox .flowborder { 35 | stroke-width: 1.25; 36 | fill: #FFF; 37 | fill-opacity: 0.8; 38 | } 39 | .READY > g > rect { 40 | fill: #DDD; 41 | stroke: #CCC; 42 | } 43 | .READY > g > text { 44 | fill: #000; 45 | } 46 | .RUNNING > g > rect { 47 | fill: #39b3d7; 48 | stroke: #39b3d7; 49 | } 50 | .RUNNING > g > text { 51 | fill: #FFF; 52 | } 53 | .SUCCEEDED > g > rect { 54 | fill: #5cb85c; 55 | stroke: #4cae4c; 56 | } 57 | .SUCCEEDED > g > text { 58 | fill: #FFF; 59 | } 60 | .FAILED > g > rect { 61 | fill: #d2322d; 62 | stroke: #d2322d; 63 | } 64 | .FAILED > g > text { 65 | fill: #FFF; 66 | } 67 | .KILLED > g > rect { 68 | fill: #d2322d; 69 | stroke: #d2322d; 70 | } 71 | .KILLED > g > text { 72 | fill: #FFF; 73 | } 74 | .CANCELLED > g > rect { 75 | fill: #FF9999; 76 | stroke: #FF9999; 77 | } 78 | .CANCELLED > g > text { 79 | fill: #FFF; 80 | } 81 | .FAILED_FINISHING > g > rect { 82 | fill: #ed9c28; 83 | stroke: #ed9c28; 84 | } 85 | .FAILED_FINISHING > g > text { 86 | fill: #FFF; 87 | } 88 | .DISABLED > g > rect { 89 | fill: #DDD; 90 | stroke: #CCC; 91 | } 92 | .DISABLED > g > rect { 93 | fill: #DDD; 94 | stroke: #CCC; 95 | } 96 | .nodeDisabled { 97 | opacity: 0.25; 98 | } 99 | .SKIPPED > g > rect { 100 | fill: #DDD; 101 | stroke: #CCC; 102 | } 103 | .DISABLED { 104 | opacity: 0.25; 105 | } 106 | .SKIPPED { 107 | opacity: 0.25; 108 | } 109 | .QUEUED > g > rect { 110 | fill: #39b3d7; 111 | stroke: #39b3d7; 112 | } 113 | .QUEUED > g > text { 114 | fill: #FFF; 115 | } 116 | .QUEUED { 117 | opacity: 0.5; 118 | } 119 | /* Edges */ 120 | .edge { 121 | stroke: #CCC; 122 | stroke-width: 1.5; 123 | } 124 | .edge:hover { 125 | stroke: #009FC9; 126 | stroke-width: 1.5; 127 | } 128 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/addIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/addIcon.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/animated-overlay.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/animated-overlay.gif -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/dot-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/dot-icon.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/redwarning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/redwarning.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/removeIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/removeIcon.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_flat_0_eeeeee_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_flat_0_eeeeee_40x100.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_flat_35_dddddd_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_flat_35_dddddd_40x100.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_flat_55_c0402a_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_flat_55_c0402a_40x100.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_flat_55_eeeeee_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_flat_55_eeeeee_40x100.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_flat_75_ffffff_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_flat_75_ffffff_40x100.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_glass_100_f8f8f8_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_glass_100_f8f8f8_1x400.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_glass_60_eeeeee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_glass_60_eeeeee_1x400.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_glass_95_fef1ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_glass_95_fef1ec_1x400.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_inset-hard_75_999999_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_inset-hard_75_999999_1x100.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-bg_inset-soft_50_c9c9c9_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-bg_inset-soft_50_c9c9c9_1x100.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_000000_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_000000_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_3383bb_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_3383bb_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_454545_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_70b2e1_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_70b2e1_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_888888_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_888888_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_999999_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_999999_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_cccccc_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_cccccc_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_cd0a0a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_cd0a0a_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_fbc856_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_fbc856_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/css/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/jquery-ui-timepicker-addon.css: -------------------------------------------------------------------------------- 1 | .ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } 2 | .ui-timepicker-div dl { text-align: left; } 3 | .ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; } 4 | .ui-timepicker-div dl dd { margin: 0 10px 10px 65px; } 5 | .ui-timepicker-div td { font-size: 90%; } 6 | .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } 7 | 8 | .ui-timepicker-rtl{ direction: rtl; } 9 | .ui-timepicker-rtl dl { text-align: right; } 10 | .ui-timepicker-rtl dl dd { margin: 0 65px 10px 10px; } 11 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/jquery.svg.css: -------------------------------------------------------------------------------- 1 | /* http://keith-wood.name/svg.html 2 | SVG for jQuery v1.4.5. 3 | Written by Keith Wood (kbwood{at}iinet.com.au) August 2007. 4 | Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 5 | MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 6 | Please attribute the author if you use it. */ 7 | 8 | svg\:svg { 9 | display: none; 10 | } 11 | 12 | .svg_error { 13 | color: red; 14 | font-weight: bold; 15 | } 16 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/css/morris.css: -------------------------------------------------------------------------------- 1 | .morris-hover { 2 | position: absolute; 3 | z-index: 1000; 4 | } 5 | 6 | .morris-hover.morris-default-style { 7 | border-radius: 10px; 8 | padding: 6px; 9 | color: #666; 10 | background: rgba(255, 255, 255, 0.8); 11 | border: solid 2px rgba(230, 230, 230, 0.8); 12 | font-family: sans-serif; 13 | font-size: 12px; 14 | text-align: center; 15 | } 16 | 17 | .morris-hover.morris-default-style .morris-hover-row-label { 18 | font-weight: bold; 19 | margin: 0.25em 0; 20 | } 21 | 22 | .morris-hover.morris-default-style .morris-hover-point { 23 | white-space: nowrap; 24 | margin: 0.1em 0; 25 | } 26 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/favicon.ico -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/images/graph-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/images/graph-icon.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/images/logo.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/model/job-log.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2014 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | azkaban.JobLogModel = Backbone.Model.extend({ 20 | initialize: function() { 21 | this.set("offset", 0); 22 | this.set("logData", ""); 23 | }, 24 | 25 | refresh: function() { 26 | var requestURL = contextURL + "/executor"; 27 | var finished = false; 28 | 29 | var date = new Date(); 30 | var startTime = date.getTime(); 31 | 32 | while (!finished) { 33 | var requestData = { 34 | "execid": execId, 35 | "jobId": jobId, 36 | "ajax":"fetchExecJobLogs", 37 | "offset": this.get("offset"), 38 | "length": 50000, 39 | "attempt": attempt 40 | }; 41 | 42 | var self = this; 43 | 44 | var successHandler = function(data) { 45 | console.log("fetchLogs"); 46 | if (data.error) { 47 | console.log(data.error); 48 | finished = true; 49 | } 50 | else if (data.length == 0) { 51 | finished = true; 52 | } 53 | else { 54 | var date = new Date(); 55 | var endTime = date.getTime(); 56 | if ((endTime - startTime) > 10000) { 57 | finished = true; 58 | showDialog("Alert", "The log is taking a long time to finish loading. Azkaban has stopped loading them. Please click Refresh to restart the load."); 59 | } 60 | 61 | self.set("offset", data.offset + data.length); 62 | self.set("logData", self.get("logData") + data.data); 63 | } 64 | } 65 | 66 | $.ajax({ 67 | url: requestURL, 68 | type: "get", 69 | async: false, 70 | data: requestData, 71 | dataType: "json", 72 | error: function(data) { 73 | console.log(data); 74 | finished = true; 75 | }, 76 | success: successHandler 77 | }); 78 | } 79 | }, 80 | }); 81 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/model/svg-graph.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2014 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | azkaban.GraphModel = Backbone.Model.extend({ 20 | initialize: function() { 21 | 22 | }, 23 | 24 | /* 25 | * Process and add data from JSON. 26 | */ 27 | addFlow: function(data) { 28 | this.processFlowData(data); 29 | this.set({'data': data}); 30 | }, 31 | 32 | processFlowData: function(data) { 33 | var nodes = {}; 34 | var edges = new Array(); 35 | 36 | // Create a node map 37 | for (var i = 0; i < data.nodes.length; ++i) { 38 | var node = data.nodes[i]; 39 | nodes[node.id] = node; 40 | if (!node.status) { 41 | node.status = "READY"; 42 | } 43 | } 44 | 45 | // Create each node in and out nodes. Create an edge list. 46 | for (var i = 0; i < data.nodes.length; ++i) { 47 | var node = data.nodes[i]; 48 | if (node.in) { 49 | for (var j = 0; j < node.in.length; ++j) { 50 | var fromNode = nodes[node.in[j]]; 51 | if (!fromNode.outNodes) { 52 | fromNode.outNodes = {}; 53 | } 54 | if (!node.inNodes) { 55 | node.inNodes = {}; 56 | } 57 | 58 | fromNode.outNodes[node.id] = node; 59 | node.inNodes[fromNode.id] = fromNode; 60 | edges.push({to: node.id, from: fromNode.id}); 61 | } 62 | } 63 | } 64 | 65 | // Iterate over the nodes again. Parse the data if they're embedded flow data. 66 | // Assign each nodes to the parent flow data. 67 | for (var key in nodes) { 68 | var node = nodes[key]; 69 | node.parent = data; 70 | if (node.type == "flow") { 71 | this.processFlowData(node); 72 | } 73 | } 74 | 75 | // Assign the node map and the edge list 76 | data.nodeMap = nodes; 77 | data.edges = edges; 78 | } 79 | }); 80 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/namespace.js: -------------------------------------------------------------------------------- 1 | $.namespace = function() { 2 | var a=arguments, o=window, i, j, d; 3 | for (i=0; i 0) { 63 | setTimeout( 64 | function(){ 65 | animatePolyLineLoop(svg, edge, lastPoints, deltaEdges, step - 1); 66 | }, 67 | time 68 | ); 69 | } 70 | } -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/admin-setup.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | var dbUploadPanel; 20 | azkaban.DBUploadPanel= Backbone.View.extend({ 21 | events : { 22 | "click #upload-jar-btn" : "handleUpload" 23 | }, 24 | initialize : function(settings) { 25 | }, 26 | render: function() { 27 | }, 28 | handleUpload: function(){ 29 | var filename = $("#file").val(); 30 | if (filename.length > 4) { 31 | var lastIndexOf = filename.lastIndexOf('.'); 32 | var lastIndexOfForwardSlash = filename.lastIndexOf('\\'); 33 | var lastIndexOfBackwardSlash = filename.lastIndexOf('/'); 34 | 35 | var startIndex = Math.max(lastIndexOfForwardSlash, lastIndexOfBackwardSlash); 36 | startIndex += 1; 37 | 38 | var subfilename = filename.substring(startIndex, filename.length); 39 | var end = filename.substring(lastIndexOf, filename.length); 40 | if (end != ".jar") { 41 | alert("File "+ subfilename + " doesn't appear to be a jar. Looking for mysql-connector*.jar"); 42 | return; 43 | } 44 | else if (subfilename.substr(0, "mysql-connector".length) != "mysql-connector") { 45 | alert("File "+ subfilename + " doesn't appear to be a mysql connector jar. Looking for mysql-connector*.jar"); 46 | return; 47 | } 48 | 49 | console.log("Looks valid, uploading."); 50 | var uploadForm = document.getElementById("upload-form"); 51 | var formData = new FormData(uploadForm); 52 | var contextUrl = contextURL; 53 | 54 | var xhr = new XMLHttpRequest(); 55 | xhr.onreadystatechange=function() { 56 | if (xhr.readyState==4) { 57 | var data = JSON.parse(xhr.responseText); 58 | if (data.error) { 59 | alert(data.error); 60 | } 61 | else { 62 | $("#installed").html("Uploaded " + data.jarname + ""); 63 | } 64 | } 65 | } 66 | xhr.open("POST", "uploadServlet"); 67 | xhr.send(formData); 68 | 69 | console.log("Finished."); 70 | 71 | } 72 | else { 73 | alert("File doesn't appear to be valid."); 74 | } 75 | } 76 | }); 77 | 78 | var dbConnectionsPanel; 79 | azkaban.DBConnectionPanel= Backbone.View.extend({ 80 | events : { 81 | "click #save-connection-button" : "handleSaveConnection" 82 | }, 83 | initialize : function(settings) { 84 | if (verified) { 85 | $("#save-results").text(message); 86 | $("#save-results").css("color", "#00CC00"); 87 | } else { 88 | $("#save-results").hide(); 89 | } 90 | }, 91 | render: function() { 92 | }, 93 | handleSaveConnection: function(){ 94 | var host = $("#host").val(); 95 | var port = $("#port").val(); 96 | var database = $("#database").val(); 97 | var username = $("#username").val(); 98 | var password = $("#password").val(); 99 | 100 | var contextUrl = contextURL; 101 | $.post( 102 | contextUrl, 103 | {ajax:"saveDbConnection", host: host, port:port, database: database, username: username, password: password}, 104 | function(data) { 105 | if (data.error) { 106 | verified = false; 107 | $("#save-results").text(data.error); 108 | $("#save-results").css("color", "#FF0000"); 109 | } 110 | else if (data.success) { 111 | verified = true; 112 | $("#save-results").text(data.success); 113 | $("#save-results").css("color", "#00CC00"); 114 | } 115 | $("#save-results").show(); 116 | } 117 | ); 118 | } 119 | }); 120 | 121 | $(function() { 122 | dbUploadPanel = new azkaban.DBUploadPanel({el:$( '#dbuploadpanel')}); 123 | dbConnectionPanel = new azkaban.DBConnectionPanel({el:$( '#dbsettingspanel')}); 124 | 125 | $("#saveAndContinue").click(function(data) { 126 | if (!verified) { 127 | alert("The database connection hasn't been verified."); 128 | } 129 | else { 130 | window.location="/?usersetup"; 131 | } 132 | }); 133 | }); 134 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/context-menu.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | azkaban.ContextMenuView = Backbone.View.extend({ 20 | events: { 21 | }, 22 | 23 | initialize: function(settings) { 24 | var div = this.el; 25 | $('body').click(function(e) { 26 | $(".contextMenu").remove(); 27 | }); 28 | $('body').bind("contextmenu", function(e) {$(".contextMenu").remove()}); 29 | }, 30 | 31 | show: function(evt, menu) { 32 | console.log("Show context menu"); 33 | $(".contextMenu").remove(); 34 | var x = evt.pageX; 35 | var y = evt.pageY; 36 | 37 | var contextMenu = this.setupMenu(menu); 38 | $(contextMenu).css({top: y, left: x}); 39 | $(this.el).after(contextMenu); 40 | }, 41 | 42 | hide: function(evt) { 43 | console.log("Hide context menu"); 44 | $(".contextMenu").remove(); 45 | }, 46 | 47 | handleClick: function(evt) { 48 | console.log("handling click"); 49 | }, 50 | 51 | setupMenu: function(menu) { 52 | var contextMenu = document.createElement("div"); 53 | $(contextMenu).addClass("contextMenu"); 54 | var ul = document.createElement("ul"); 55 | $(contextMenu).append(ul); 56 | 57 | for (var i = 0; i < menu.length; ++i) { 58 | var menuItem = document.createElement("li"); 59 | if (menu[i].break) { 60 | $(menuItem).addClass("break"); 61 | $(ul).append(menuItem); 62 | continue; 63 | } 64 | var title = menu[i].title; 65 | var callback = menu[i].callback; 66 | $(menuItem).addClass("menuitem"); 67 | $(menuItem).text(title); 68 | menuItem.callback = callback; 69 | $(menuItem).click(function() { 70 | $(contextMenu).hide(); 71 | this.callback.call(); 72 | }); 73 | 74 | if (menu[i].submenu) { 75 | var expandSymbol = document.createElement("div"); 76 | $(expandSymbol).addClass("expandSymbol"); 77 | $(menuItem).append(expandSymbol); 78 | 79 | var subMenu = this.setupMenu(menu[i].submenu); 80 | $(subMenu).addClass("subMenu"); 81 | subMenu.parent = contextMenu; 82 | menuItem.subMenu = subMenu; 83 | $(subMenu).hide(); 84 | $(this.el).after(subMenu); 85 | 86 | $(menuItem).mouseenter(function() { 87 | $(".subMenu").hide(); 88 | var menuItem = this; 89 | menuItem.selected = true; 90 | setTimeout(function() { 91 | if (menuItem.selected) { 92 | var offset = $(menuItem).offset(); 93 | var left = offset.left; 94 | var top = offset.top; 95 | var width = $(menuItem).width(); 96 | var subMenu = menuItem.subMenu; 97 | 98 | var newLeft = left + width - 5; 99 | $(subMenu).css({left: newLeft, top: top}); 100 | $(subMenu).show(); 101 | } 102 | }, 500); 103 | }); 104 | $(menuItem).mouseleave(function() {this.selected = false;}); 105 | } 106 | $(ul).append(menuItem); 107 | } 108 | 109 | return contextMenu; 110 | } 111 | }); 112 | 113 | var contextMenuView; 114 | $(function() { 115 | contextMenuView = new azkaban.ContextMenuView({el:$('#contextMenu')}); 116 | contextMenuView.hide(); 117 | }); 118 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/executions.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | var executionsTabView; 20 | azkaban.ExecutionsTabView = Backbone.View.extend({ 21 | events: { 22 | 'click #currently-running-view-link': 'handleCurrentlyRunningViewLinkClick', 23 | 'click #recently-finished-view-link': 'handleRecentlyFinishedViewLinkClick' 24 | }, 25 | 26 | initialize: function(settings) { 27 | var selectedView = settings.selectedView; 28 | if (selectedView == 'recently-finished') { 29 | this.handleRecentlyFinishedViewLinkClick(); 30 | } 31 | else { 32 | this.handleCurrentlyRunningViewLinkClick(); 33 | } 34 | }, 35 | 36 | render: function() { 37 | }, 38 | 39 | handleCurrentlyRunningViewLinkClick: function() { 40 | $('#recently-finished-view-link').removeClass('active'); 41 | $('#recently-finished-view').hide(); 42 | $('#currently-running-view-link').addClass('active'); 43 | $('#currently-running-view').show(); 44 | }, 45 | 46 | handleRecentlyFinishedViewLinkClick: function() { 47 | $('#currently-running-view-link').removeClass('active'); 48 | $('#currently-running-view').hide(); 49 | $('#recently-finished-view-link').addClass('active'); 50 | $('#recently-finished-view').show(); 51 | } 52 | }); 53 | 54 | $(function() { 55 | executionsTabView = new azkaban.ExecutionsTabView({el: $('#header-tabs')}); 56 | if (window.location.hash) { 57 | var hash = window.location.hash; 58 | if (hash == '#recently-finished') { 59 | executionsTabView.handleRecentlyFinishedLinkClick(); 60 | } 61 | } 62 | }); 63 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/flow-extended.js: -------------------------------------------------------------------------------- 1 | azkaban.FlowExtendedViewPanel = Backbone.View.extend({ 2 | events: { 3 | "click .closeInfoPanel" : "handleClosePanel" 4 | }, 5 | initialize: function(settings) { 6 | //this.model.bind('change:flowinfo', this.changeFlowInfo, this); 7 | $(this.el).show(); 8 | $(this.el).draggable({cancel: ".dataContent", containment: "document"}); 9 | 10 | this.render(); 11 | $(this.el).hide(); 12 | }, 13 | showExtendedView: function(evt) { 14 | var event = evt; 15 | 16 | $(this.el).css({top: evt.pageY, left: evt.pageX}); 17 | $(this.el).show(); 18 | }, 19 | render: function(self) { 20 | console.log("Changing title"); 21 | $(this.el).find(".nodeId").text(this.model.get("id")); 22 | $(this.el).find(".nodeType").text(this.model.get("type")); 23 | 24 | var props = this.model.get("props"); 25 | var tableBody = $(this.el).find(".dataPropertiesBody"); 26 | 27 | for (var key in props) { 28 | var tr = document.createElement("tr"); 29 | var tdKey = document.createElement("td"); 30 | var tdValue = document.createElement("td"); 31 | 32 | $(tdKey).text(key); 33 | $(tdValue).text(props[key]); 34 | 35 | $(tr).append(tdKey); 36 | $(tr).append(tdValue); 37 | 38 | $(tableBody).append(tr); 39 | 40 | var propsTable = $(this.el).find(".dataJobProperties"); 41 | $(propsTable).resizable({handler: "s"}); 42 | } 43 | 44 | if (this.model.get("type") == "flow") { 45 | var svgns = "http://www.w3.org/2000/svg"; 46 | var svgDataFlow = $(this.el).find(".dataFlow"); 47 | 48 | var svgGraph = document.createElementNS(svgns, "svg"); 49 | $(svgGraph).attr("class", "svgTiny"); 50 | $(svgDataFlow).append(svgGraph); 51 | $(svgDataFlow).resizable(); 52 | 53 | this.graphView = new azkaban.SvgGraphView({el: svgDataFlow, model: this.model, render: true, rightClick: { "node": nodeClickCallback, "graph": graphClickCallback }}) 54 | } 55 | else { 56 | $(this.el).find(".dataFlow").hide(); 57 | } 58 | }, 59 | handleClosePanel: function(self) { 60 | $(this.el).hide(); 61 | } 62 | }); -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/history-day.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | var dayDataModel; 20 | azkaban.DayDataModel = Backbone.Model.extend({}); 21 | 22 | var dayByDayView; 23 | azkaban.DayByDayView = Backbone.View.extend({ 24 | events: { 25 | }, 26 | initialize: function(settings) { 27 | this.svgns = "http://www.w3.org/2000/svg"; 28 | this.svg = $(this.el).find('svg')[0]; 29 | this.columnDayWidth = 100; 30 | this.columnHourHeight = 50; 31 | this.columnHeight = 50*24; 32 | 33 | this.render(this); 34 | },http://documentcloud.github.com/backbone/#Events-trigger 35 | prepareData: function(self) { 36 | var response = model.get("data"); 37 | var start = data.start; 38 | var end = data.end; 39 | var data = data.data; 40 | 41 | var daysData = {}; 42 | 43 | var startDate = new Date(start); 44 | 45 | while (startDate.getTime() < end) { 46 | daysData[startDate.getTime()] = new Array(); 47 | startDate.setDate(startDate.getDate() + 1); 48 | } 49 | 50 | for (var i = 0; i < data.length; ++i) { 51 | var flow = data[i]; 52 | 53 | } 54 | }, 55 | render: function(self) { 56 | var svg = self.svg; 57 | var svgns = self.svgns; 58 | var width = $(svg).width(); 59 | var height = $(svg).height(); 60 | 61 | var mainG = document.createElementNS(this.svgns, 'g'); 62 | $(svg).append(mainG); 63 | 64 | 65 | } 66 | }); 67 | 68 | var showDialog = function(title, message) { 69 | $('#messageTitle').text(title); 70 | $('#messageBox').text(message); 71 | 72 | $('#messageDialog').modal({ 73 | closeHTML: "x", 74 | position: ["20%",], 75 | containerId: 'confirm-container', 76 | containerCss: { 77 | 'height': '220px', 78 | 'width': '565px' 79 | }, 80 | onShow: function (dialog) { 81 | } 82 | }); 83 | } 84 | 85 | 86 | $(function() { 87 | var requestURL = contextURL + "/history"; 88 | 89 | var start = new Date(); 90 | start.setHours(0); 91 | start.setMinutes(0); 92 | start.setSeconds(0); 93 | start.setMilliseconds(0); 94 | var end = new Date(start); 95 | 96 | start.setDate(start.getDate() - 7); 97 | console.log(start.getTime()); 98 | 99 | end.setDate(end.getDate() + 1); 100 | console.log(end.getTime()); 101 | 102 | dayDataModel = new azkaban.DayDataModel(); 103 | dayByDayView = new azkaban.DayByDayView({el:$('#dayByDayPanel'), model: dayDataModel}); 104 | 105 | $.get( 106 | requestURL, 107 | {"ajax":"fetch", "start": start.getTime(), "end": end.getTime()}, 108 | function(data) { 109 | dayDataModel.set({data:data}); 110 | }, 111 | "json" 112 | ); 113 | }); 114 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/history.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | var advFilterView; 20 | azkaban.AdvFilterView = Backbone.View.extend({ 21 | events: { 22 | "click #filter-btn": "handleAdvFilter" 23 | }, 24 | 25 | initialize: function(settings) { 26 | $('#datetimebegin').datetimepicker(); 27 | $('#datetimeend').datetimepicker(); 28 | $('#datetimebegin').on('change.dp', function(e) { 29 | $('#datetimeend').data('DateTimePicker').setStartDate(e.date); 30 | }); 31 | $('#datetimeend').on('change.dp', function(e) { 32 | $('#datetimebegin').data('DateTimePicker').setEndDate(e.date); 33 | }); 34 | $('#adv-filter-error-msg').hide(); 35 | }, 36 | 37 | handleAdvFilter: function(evt) { 38 | console.log("handleAdv"); 39 | var projcontain = $('#projcontain').val(); 40 | var flowcontain = $('#flowcontain').val(); 41 | var usercontain = $('#usercontain').val(); 42 | var status = $('#status').val(); 43 | var begin = $('#datetimebegin').val(); 44 | var end = $('#datetimeend').val(); 45 | 46 | console.log("filtering history"); 47 | 48 | var historyURL = contextURL + "/history" 49 | var redirectURL = contextURL + "/schedule" 50 | 51 | var requestURL = historyURL + "?advfilter=true" + "&projcontain=" + projcontain + "&flowcontain=" + flowcontain + "&usercontain=" + usercontain + "&status=" + status + "&begin=" + begin + "&end=" + end ; 52 | window.location = requestURL; 53 | 54 | /* 55 | var requestData = { 56 | "action": "advfilter", 57 | "projre": projre, 58 | "flowre": flowre, 59 | "userre": userre 60 | }; 61 | var successHandler = function(data) { 62 | if (data.action == "redirect") { 63 | window.location = data.redirect; 64 | } 65 | }; 66 | $.get(historyURL, requestData, successHandler, "json"); 67 | */ 68 | }, 69 | 70 | render: function() { 71 | } 72 | }); 73 | 74 | $(function() { 75 | filterView = new azkaban.AdvFilterView({el: $('#adv-filter')}); 76 | $('#adv-filter-btn').click( function() { 77 | $('#adv-filter').modal(); 78 | }); 79 | }); 80 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/jmx.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | var jmxTableView; 20 | azkaban.JMXTableView = Backbone.View.extend({ 21 | events: { 22 | "click .query-btn": "queryJMX", 23 | "click .collapse-btn": "collapseRow" 24 | }, 25 | 26 | initialize: function(settings) { 27 | }, 28 | 29 | formatValue: function(value) { 30 | if (String(value).length != TIMESTAMP_LENGTH) { 31 | return value; 32 | } 33 | if (isNaN(parseInt(value))) { 34 | return value; 35 | } 36 | var date = new Date(value); 37 | if (date.getTime() <= 0) { 38 | return value; 39 | } 40 | return value + " (" + date.toISOString() + ")"; 41 | }, 42 | 43 | queryJMX: function(evt) { 44 | var target = evt.currentTarget; 45 | var id = target.id; 46 | 47 | var childID = id + "-child"; 48 | var tbody = id + "-tbody"; 49 | 50 | var requestURL = contextURL + "/jmx"; 51 | var canonicalName=$(target).attr("domain") + ":name=" + $(target).attr("name"); 52 | 53 | var data = { 54 | "ajax": "getAllMBeanAttributes", 55 | "mBean": canonicalName 56 | }; 57 | if ($(target).attr("hostPort")) { 58 | data.ajax = "getAllExecutorAttributes"; 59 | data.hostPort = $(target).attr("hostPort"); 60 | } 61 | var view = this; 62 | var successHandler = function(data) { 63 | var table = $('#' + tbody); 64 | $(table).empty(); 65 | 66 | for (var key in data.attributes) { 67 | var value = data.attributes[key]; 68 | 69 | var tr = document.createElement("tr"); 70 | var tdName = document.createElement("td"); 71 | var tdVal = document.createElement("td"); 72 | 73 | $(tdName).addClass('property-key'); 74 | $(tdName).text(key); 75 | 76 | value = view.formatValue(value); 77 | $(tdVal).text(value); 78 | 79 | $(tr).append(tdName); 80 | $(tr).append(tdVal); 81 | 82 | $('#' + tbody).append(tr); 83 | } 84 | 85 | var child = $("#" + childID); 86 | $(child).fadeIn(); 87 | }; 88 | $.get(requestURL, data, successHandler); 89 | }, 90 | 91 | queryRemote: function(evt) { 92 | var target = evt.currentTarget; 93 | var id = target.id; 94 | 95 | var childID = id + "-child"; 96 | var tbody = id + "-tbody"; 97 | 98 | var requestURL = contextURL + "/jmx"; 99 | var canonicalName = $(target).attr("domain") + ":name=" + $(target).attr("name"); 100 | var hostPort = $(target).attr("hostport"); 101 | var requestData = { 102 | "ajax": "getAllExecutorAttributes", 103 | "mBean": canonicalName, 104 | "hostPort": hostPort 105 | }; 106 | var view = this; 107 | var successHandler = function(data) { 108 | var table = $('#' + tbody); 109 | $(table).empty(); 110 | 111 | for (var key in data.attributes) { 112 | var value = data.attributes[key]; 113 | 114 | var tr = document.createElement("tr"); 115 | var tdName = document.createElement("td"); 116 | var tdVal = document.createElement("td"); 117 | 118 | $(tdName).addClass('property-key'); 119 | $(tdName).text(key); 120 | 121 | value = view.formatValue(value); 122 | $(tdVal).text(value); 123 | 124 | $(tr).append(tdName); 125 | $(tr).append(tdVal); 126 | 127 | $('#' + tbody).append(tr); 128 | } 129 | 130 | var child = $("#" + childID); 131 | $(child).fadeIn(); 132 | }; 133 | $.get(requestURL, requestData, successHandler); 134 | }, 135 | 136 | collapseRow: function(evt) { 137 | $(evt.currentTarget).parent().parent().fadeOut(); 138 | }, 139 | 140 | render: function() { 141 | } 142 | }); 143 | 144 | var remoteTables = new Array(); 145 | $(function() { 146 | jmxTableView = new azkaban.JMXTableView({el:$('#all-jmx')}); 147 | 148 | $(".remoteJMX").each(function(item) { 149 | var newTableView = new azkaban.JMXTableView({el:$(this)}); 150 | remoteTables.push(newTableView); 151 | }); 152 | }); 153 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/job-details.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | var jobLogView; 20 | azkaban.JobLogView = Backbone.View.extend({ 21 | events: { 22 | "click #updateLogBtn" : "refresh" 23 | }, 24 | 25 | initialize: function() { 26 | this.listenTo(this.model, "change:logData", this.render); 27 | }, 28 | 29 | refresh: function() { 30 | this.model.refresh(); 31 | }, 32 | 33 | render: function() { 34 | var re = /(https?:\/\/(([-\w\.]+)+(:\d+)?(\/([\w/_\.]*(\?\S+)?)?)?))/g; 35 | var log = this.model.get("logData"); 36 | log = log.replace(re, "$1"); 37 | $("#logSection").html(log); 38 | } 39 | }); 40 | 41 | var showDialog = function(title, message) { 42 | $('#messageTitle').text(title); 43 | $('#messageBox').text(message); 44 | $('#messageDialog').modal({ 45 | closeHTML: "x", 46 | position: ["20%",], 47 | containerId: 'confirm-container', 48 | containerCss: { 49 | 'height': '220px', 50 | 'width': '565px' 51 | }, 52 | onShow: function (dialog) { 53 | } 54 | }); 55 | } 56 | 57 | $(function() { 58 | var jobLogModel = new azkaban.JobLogModel(); 59 | jobLogView = new azkaban.JobLogView({ 60 | el: $('#jobLogView'), 61 | model: jobLogModel 62 | }); 63 | jobLogModel.refresh(); 64 | }); 65 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/job-history.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | 18 | $.namespace('azkaban'); 19 | 20 | var jobHistoryView; 21 | 22 | var dataModel; 23 | azkaban.DataModel = Backbone.Model.extend({}); 24 | 25 | $(function() { 26 | var selected; 27 | var series = dataSeries; 28 | dataModel = new azkaban.DataModel(); 29 | dataModel.set({ 30 | "data": series 31 | }); 32 | dataModel.trigger('render'); 33 | 34 | jobHistoryView = new azkaban.TimeGraphView({ 35 | el: $('#timeGraph'), 36 | model: dataModel, 37 | modelField: "data" 38 | }); 39 | }); -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/login.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | var loginView; 20 | azkaban.LoginView = Backbone.View.extend({ 21 | events: { 22 | "click #login-submit": "handleLogin", 23 | 'keypress input': 'handleKeyPress' 24 | }, 25 | 26 | initialize: function(settings) { 27 | $('#error-msg').hide(); 28 | }, 29 | 30 | handleLogin: function(evt) { 31 | console.log("Logging in."); 32 | var username = $("#username").val(); 33 | var password = $("#password").val(); 34 | 35 | $.ajax({ 36 | async: "false", 37 | url: contextURL, 38 | dataType: "json", 39 | type: "POST", 40 | data: { 41 | action: "login", 42 | username: username, 43 | password: password 44 | }, 45 | success: function(data) { 46 | if (data.error) { 47 | $('#error-msg').text(data.error); 48 | $('#error-msg').slideDown('fast'); 49 | } 50 | else { 51 | document.location.reload(); 52 | } 53 | } 54 | }); 55 | }, 56 | 57 | handleKeyPress: function(evt) { 58 | if (evt.charCode == 13 || evt.keyCode == 13) { 59 | this.handleLogin(); 60 | } 61 | }, 62 | 63 | render: function() { 64 | } 65 | }); 66 | 67 | $(function() { 68 | loginView = new azkaban.LoginView({el: $('#login-form')}); 69 | }); 70 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/message-dialog.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | var messageDialogView; 20 | azkaban.MessageDialogView = Backbone.View.extend({ 21 | events: { 22 | }, 23 | 24 | initialize: function(settings) { 25 | }, 26 | 27 | show: function(title, message, callback) { 28 | $("#azkaban-message-dialog-title").text(title); 29 | $("#azkaban-message-dialog-text").text(message); 30 | this.callback = callback; 31 | $(this.el).on('hidden.bs.modal', function() { 32 | if (callback) { 33 | callback.call(); 34 | } 35 | }); 36 | $(this.el).modal(); 37 | } 38 | }); 39 | 40 | $(function() { 41 | messageDialogView = new azkaban.MessageDialogView({ 42 | el: $('#azkaban-message-dialog') 43 | }); 44 | }); 45 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/schedule-panel.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | var schedulePanelView; 20 | azkaban.SchedulePanelView = Backbone.View.extend({ 21 | events: { 22 | "click #schedule-button": "scheduleFlow" 23 | }, 24 | 25 | initialize: function(settings) { 26 | $("#timepicker").datetimepicker({pickDate: false}); 27 | $("#datepicker").datetimepicker({pickTime: false}); 28 | }, 29 | 30 | render: function() { 31 | }, 32 | 33 | showSchedulePanel: function() { 34 | $('#schedule-modal').modal(); 35 | }, 36 | 37 | hideSchedulePanel: function() { 38 | $('#schedule-modal').modal("hide"); 39 | }, 40 | 41 | scheduleFlow: function() { 42 | var timeVal = $('#timepicker').val(); 43 | var timezoneVal = $('#timezone').val(); 44 | 45 | var dateVal = $('#datepicker').val(); 46 | 47 | var is_recurringVal = $('#is_recurring').val(); 48 | var periodVal = $('#period').val(); 49 | var periodUnits = $('#period_units').val(); 50 | 51 | var scheduleURL = contextURL + "/schedule" 52 | var scheduleData = flowExecuteDialogView.getExecutionOptionData(); 53 | 54 | console.log("Creating schedule for " + projectName + "." + 55 | scheduleData.flow); 56 | 57 | var scheduleTime = moment(timeVal, 'h/mm A').format('h,mm,A,') + timezoneVal; 58 | console.log(scheduleTime); 59 | 60 | var scheduleDate = $('#datepicker').val(); 61 | var is_recurring = document.getElementById('is_recurring').checked 62 | ? 'on' : 'off'; 63 | var period = $('#period').val() + $('#period_units').val(); 64 | 65 | scheduleData.ajax = "scheduleFlow"; 66 | scheduleData.projectName = projectName; 67 | scheduleData.scheduleTime = scheduleTime; 68 | scheduleData.scheduleDate = scheduleDate; 69 | scheduleData.is_recurring = is_recurring; 70 | scheduleData.period = period; 71 | 72 | var successHandler = function(data) { 73 | if (data.error) { 74 | schedulePanelView.hideSchedulePanel(); 75 | messageDialogView.show("Error Scheduling Flow", data.message); 76 | } 77 | else { 78 | schedulePanelView.hideSchedulePanel(); 79 | messageDialogView.show("Flow Scheduled", data.message, function() { 80 | window.location.href = scheduleURL; 81 | }); 82 | } 83 | }; 84 | 85 | $.post(scheduleURL, scheduleData, successHandler, "json"); 86 | } 87 | }); 88 | 89 | $(function() { 90 | schedulePanelView = new azkaban.SchedulePanelView({ 91 | el: $('#schedule-modal') 92 | }); 93 | }); 94 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/scheduled.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | var slaView; 20 | var tableSorterView; 21 | $(function() { 22 | slaView = new azkaban.ChangeSlaView({el:$('#sla-options')}); 23 | tableSorterView = new azkaban.TableSorter({el:$('#scheduledFlowsTbl')}); 24 | //var requestURL = contextURL + "/manager"; 25 | 26 | // Set up the Flow options view. Create a new one every time :p 27 | //$('#addSlaBtn').click( function() { 28 | // slaView.show(); 29 | //}); 30 | }); 31 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/table-sort.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | azkaban.TableSorter = Backbone.View.extend({ 20 | events: { 21 | "click .sortable": "handleClickSort" 22 | }, 23 | 24 | initialize: function(settings) { 25 | $(this.el).addClass("sortableTable"); 26 | 27 | var thead = $(this.el).children("thead"); 28 | var th = $(thead).find("th"); 29 | 30 | $(th).addClass("sortable"); 31 | $("th.ignoresort").removeClass("sortable"); 32 | var sortDiv = document.createElement("div"); 33 | 34 | $(sortDiv).addClass("sortIcon"); 35 | 36 | $(th).append(sortDiv); 37 | 38 | var tbody = $(this.el).children("tbody"); 39 | var rows = $(tbody).children("tr"); 40 | 41 | var row; 42 | for (var i = 0; i < rows.length; ++i ) { 43 | var nextRow = rows[i]; 44 | if (row && $(nextRow).hasClass("childrow")) { 45 | if (!row.childRows) { 46 | row.childRows = new Array(); 47 | } 48 | row.childRows.push(nextRow); 49 | } 50 | else { 51 | row = nextRow; 52 | } 53 | } 54 | 55 | if (settings.initialSort) { 56 | this.toggleSort(settings.initialSort); 57 | } 58 | }, 59 | 60 | handleClickSort: function(evt) { 61 | this.toggleSort(evt.currentTarget); 62 | }, 63 | 64 | toggleSort: function(th) { 65 | console.log("sorting by index " + $(th).index()); 66 | if ($(th).hasClass("asc")) { 67 | $(th).removeClass("asc"); 68 | $(th).addClass("desc"); 69 | // Sort to descending 70 | 71 | this.sort($(th).index(), true); 72 | } 73 | else if ($(th).hasClass("desc")) { 74 | $(th).removeClass("desc"); 75 | $(th).addClass("asc"); 76 | 77 | this.sort($(th).index(), false); 78 | } 79 | else { 80 | $(th).parent().children(".sortable").removeClass("asc").removeClass("desc"); 81 | $(th).addClass("asc"); 82 | 83 | this.sort($(th).index(), false); 84 | } 85 | }, 86 | 87 | sort: function(index, desc) { 88 | var tbody = $(this.el).children("tbody"); 89 | var rows = $(tbody).children("tr"); 90 | 91 | var tdToSort = new Array(); 92 | for (var i = 0; i < rows.length; ++i) { 93 | var row = rows[i]; 94 | if (!$(row).hasClass("childrow")) { 95 | var td = row.children[index]; 96 | tdToSort.push(td); 97 | } 98 | } 99 | 100 | if (desc) { 101 | tdToSort.sort(function(a,b) { 102 | var texta = $(a).text().trim().toLowerCase(); 103 | var textb = $(b).text().trim().toLowerCase(); 104 | 105 | if (texta < textb) { 106 | return 1; 107 | } 108 | else if (texta > textb) { 109 | return -1; 110 | } 111 | else { 112 | return 0; 113 | } 114 | }); 115 | } 116 | else { 117 | tdToSort.sort(function(a,b) { 118 | var texta = $(a).text().trim().toLowerCase(); 119 | var textb = $(b).text().trim().toLowerCase(); 120 | 121 | if (texta < textb) { 122 | return -1; 123 | } 124 | else if (texta > textb) { 125 | return 1; 126 | } 127 | else { 128 | return 0; 129 | } 130 | }); 131 | } 132 | 133 | var sortedTR = new Array(); 134 | for (var i = 0; i < tdToSort.length; ++i) { 135 | var tr = $(tdToSort[i]).parent(); 136 | sortedTR.push(tr); 137 | 138 | var childRows = tr[0].childRows; 139 | if (childRows) { 140 | for(var j=0; j < childRows.length; ++j) { 141 | sortedTR.push(childRows[j]); 142 | } 143 | } 144 | } 145 | 146 | for (var i = 0; i < sortedTR.length; ++i) { 147 | $(tbody).append(sortedTR[i]); 148 | } 149 | }, 150 | 151 | render: function() { 152 | console.log("render sorted table"); 153 | } 154 | }); 155 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/azkaban/view/time-graph.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $.namespace('azkaban'); 18 | 19 | azkaban.TimeGraphView = Backbone.View.extend({ 20 | events: { 21 | }, 22 | 23 | initialize: function(settings) { 24 | this.model.bind('render', this.render, this); 25 | this.model.bind('change:page', this.render, this); 26 | this.modelField = settings.modelField; 27 | this.graphContainer = settings.el; 28 | this.render(); 29 | }, 30 | 31 | render: function(self) { 32 | var series = this.model.get(this.modelField); 33 | if (series == null) { 34 | return; 35 | } 36 | 37 | // Array of points to be passed to Morris. 38 | var data = []; 39 | 40 | // Map of y value to index for faster look-up in the lineColorsCallback to 41 | // get the status for each point. 42 | var indexMap = {}; 43 | for (var i = 0; i < series.length; ++i) { 44 | if (series[i].startTime == null || series[i].endTime == null) { 45 | console.log("Each element in series must have startTime and endTime"); 46 | return; 47 | } 48 | var startTime = series[i].startTime; 49 | var endTime = series[i].endTime; 50 | if (startTime == -1 && endTime == -1) { 51 | console.log("Ignoring data point with both start and end time invalid."); 52 | continue; 53 | } 54 | 55 | var duration = 0; 56 | if (endTime != -1 && startTime != -1) { 57 | duration = endTime - startTime; 58 | } 59 | if (endTime == -1) { 60 | endTime = new Date().getTime(); 61 | } 62 | data.push({ 63 | time: endTime, 64 | duration: duration 65 | }); 66 | 67 | indexMap[endTime.toString()] = i; 68 | } 69 | 70 | if (data.length == 0) { 71 | $(this.graphContainer).hide(); 72 | return; 73 | } 74 | 75 | var graphDiv = document.createElement('div'); 76 | $(this.graphContainer).html(graphDiv); 77 | 78 | var lineColorsCallback = function(row, sidx, type) { 79 | if (type != 'point') { 80 | return "#000000"; 81 | } 82 | var i = indexMap[row.x.toString()]; 83 | var status = series[i].status; 84 | if (status == 'SKIPPED') { 85 | return '#aaa'; 86 | } 87 | else if (status == 'SUCCEEDED') { 88 | return '#4e911e'; 89 | } 90 | else if (status == 'RUNNING') { 91 | return '#009fc9'; 92 | } 93 | else if (status == 'PAUSED') { 94 | return '#c92123'; 95 | } 96 | else if (status == 'FAILED' || 97 | status == 'FAILED_FINISHING' || 98 | status == 'KILLED') { 99 | return '#cc0000'; 100 | } 101 | else { 102 | return '#ccc'; 103 | } 104 | }; 105 | 106 | var yLabelFormatCallback = function(y) { 107 | var seconds = y / 1000.0; 108 | return seconds.toString() + " s"; 109 | }; 110 | 111 | var hoverCallback = function(index, options, content) { 112 | // Note: series contains the data points in descending order and index 113 | // is the index into Morris's internal array of data sorted in ascending 114 | // x order. 115 | var status = series[options.data.length - index - 1].status; 116 | return content + 117 | '
Status: ' + status + '
'; 118 | }; 119 | 120 | Morris.Line({ 121 | element: graphDiv, 122 | data: data, 123 | xkey: 'time', 124 | ykeys: ['duration'], 125 | labels: ['Duration'], 126 | lineColors: lineColorsCallback, 127 | yLabelFormat: yLabelFormatCallback, 128 | hoverCallback: hoverCallback 129 | }); 130 | } 131 | }); 132 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/flowstats-no-data.js: -------------------------------------------------------------------------------- 1 | (function(){dust.register("flowstats-no-data",body_0);function body_0(chk,ctx){return chk.write("

No Flow Stats Available

").reference(ctx._get(false, ["message"]),ctx,"h").write("

");}return body_0;})(); -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/flowsummary.js: -------------------------------------------------------------------------------- 1 | (function(){dust.register("flowsummary",body_0);function body_0(chk,ctx){return chk.write("
Project name").reference(ctx._get(false, ["projectName"]),ctx,"h").write("
Job Types Used").section(ctx._get(false, ["jobTypes"]),ctx,{"block":body_1},null).write("

Scheduling").exists(ctx._get(false, ["schedule"]),ctx,{"block":body_2},null).write("

").exists(ctx._get(false, ["schedule"]),ctx,{"else":body_3,"block":body_4},null).write("

Last Run Stats

");}function body_1(chk,ctx){return chk.reference(ctx._get(true,[]),ctx,"h").write(" ");}function body_2(chk,ctx){return chk.write("
");}function body_3(chk,ctx){return chk.write("

None

This flow has not been scheduled.

");}function body_4(chk,ctx){return chk.write("
Schedule ID").reference(ctx._get(false,["schedule","scheduleId"]),ctx,"h").write("Submitted By").reference(ctx._get(false,["schedule","submitUser"]),ctx,"h").write("
First Scheduled to Run").reference(ctx._get(false,["schedule","firstSchedTime"]),ctx,"h").write("Repeats Every").reference(ctx._get(false,["schedule","period"]),ctx,"h").write("
Next Execution Time").reference(ctx._get(false,["schedule","nextExecTime"]),ctx,"h").write("SLA").exists(ctx._get(false,["schedule","slaOptions"]),ctx,{"else":body_5,"block":body_6},null).write("
");}function body_5(chk,ctx){return chk.write("false");}function body_6(chk,ctx){return chk.write("true");}return body_0;})(); -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/icons/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/icons/file.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/icons/flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/icons/flow.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/icons/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/icons/folder.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/icons/folderopen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/icons/folderopen.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/icons/job.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/icons/job.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/jquery.autocomplete.css: -------------------------------------------------------------------------------- 1 | .ac_results { 2 | padding: 0px; 3 | border: 1px solid black; 4 | background-color: white; 5 | overflow: hidden; 6 | z-index: 99999; 7 | } 8 | 9 | .ac_results ul { 10 | width: 100%; 11 | list-style-position: outside; 12 | list-style: none; 13 | padding: 0; 14 | margin: 0; 15 | } 16 | 17 | .ac_results li { 18 | margin: 0px; 19 | padding: 2px 5px; 20 | cursor: default; 21 | display: block; 22 | /* 23 | if width will be 100% horizontal scrollbar will apear 24 | when scroll mode will be used 25 | */ 26 | /*width: 100%;*/ 27 | font: menu; 28 | font-size: 12px; 29 | /* 30 | it is very important, if line-height not setted or setted 31 | in relative units scroll will be broken in firefox 32 | */ 33 | line-height: 16px; 34 | overflow: hidden; 35 | } 36 | 37 | .ac_loading { 38 | background: white url('indicator.gif') right center no-repeat; 39 | } 40 | 41 | .ac_odd { 42 | background-color: #eee; 43 | } 44 | 45 | .ac_over { 46 | background-color: #0A246A; 47 | color: white; 48 | } 49 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/jquery.contextMenu.css: -------------------------------------------------------------------------------- 1 | /* Generic context menu styles */ 2 | .contextMenu { 3 | position: absolute; 4 | width: 250px; 5 | z-index: 99999; 6 | border: solid 1px #CCC; 7 | background: #EEE; 8 | padding: 0px; 9 | margin: 0px; 10 | display: none; 11 | } 12 | 13 | .contextMenu li { 14 | list-style: none; 15 | padding: 0px; 16 | margin: 0px; 17 | } 18 | 19 | .contextMenu a { 20 | color: #333; 21 | text-decoration: none; 22 | display: block; 23 | line-height: 20px; 24 | height: 20px; 25 | background-position: 6px center; 26 | background-repeat: no-repeat; 27 | outline: none; 28 | padding: 1px 5px; 29 | padding-left: 28px; 30 | } 31 | 32 | .contextMenu li.hover a { 33 | color: #FFF; 34 | background-color: #3399FF; 35 | } 36 | 37 | .contextMenu LI.disabled A { 38 | color: #AAA; 39 | cursor: default; 40 | } 41 | 42 | .contextMenu LI.hover.disabled A { 43 | background-color: transparent; 44 | } 45 | 46 | .contextMenu LI.separator { 47 | border-top: solid 1px #CCC; 48 | } 49 | 50 | /* 51 | Adding Icons 52 | 53 | You can add icons to the context menu by adding 54 | classes to the respective LI element(s) 55 | */ 56 | 57 | .contextMenu LI.edit A { background-image: url(images/page_white_edit.png); } 58 | .contextMenu LI.cut A { background-image: url(images/cut.png); } 59 | .contextMenu LI.copy A { background-image: url(images/page_white_copy.png); } 60 | .contextMenu LI.paste A { background-image: url(images/page_white_paste.png); } 61 | .contextMenu LI.delete A { background-image: url(images/page_white_delete.png); } 62 | .contextMenu LI.quit A { background-image: url(images/door.png); } 63 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/jquery.hotkeys.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery Hotkeys Plugin 3 | * Copyright 2010, John Resig 4 | * Dual licensed under the MIT or GPL Version 2 licenses. 5 | * 6 | * Based upon the plugin by Tzury Bar Yochay: 7 | * http://github.com/tzuryby/hotkeys 8 | * 9 | * Original idea by: 10 | * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ 11 | */ 12 | 13 | (function(jQuery){ 14 | 15 | jQuery.hotkeys = { 16 | version: "0.8", 17 | 18 | specialKeys: { 19 | 8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause", 20 | 20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home", 21 | 37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del", 22 | 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7", 23 | 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/", 24 | 112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8", 25 | 120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta" 26 | }, 27 | 28 | shiftNums: { 29 | "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", 30 | "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<", 31 | ".": ">", "/": "?", "\\": "|" 32 | } 33 | }; 34 | 35 | function keyHandler( handleObj ) { 36 | // Only care when a possible input has been specified 37 | if ( typeof handleObj.data !== "string" ) { 38 | return; 39 | } 40 | 41 | var origHandler = handleObj.handler, 42 | keys = handleObj.data.toLowerCase().split(" "); 43 | 44 | handleObj.handler = function( event ) { 45 | // Don't fire in text-accepting inputs that we didn't directly bind to 46 | if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) || 47 | event.target.type === "text") ) { 48 | return; 49 | } 50 | 51 | // Keypress represents characters, not special keys 52 | var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ], 53 | character = String.fromCharCode( event.which ).toLowerCase(), 54 | key, modif = "", possible = {}; 55 | 56 | // check combinations (alt|ctrl|shift+anything) 57 | if ( event.altKey && special !== "alt" ) { 58 | modif += "alt+"; 59 | } 60 | 61 | if ( event.ctrlKey && special !== "ctrl" ) { 62 | modif += "ctrl+"; 63 | } 64 | 65 | // TODO: Need to make sure this works consistently across platforms 66 | if ( event.metaKey && !event.ctrlKey && special !== "meta" ) { 67 | modif += "meta+"; 68 | } 69 | 70 | if ( event.shiftKey && special !== "shift" ) { 71 | modif += "shift+"; 72 | } 73 | 74 | if ( special ) { 75 | possible[ modif + special ] = true; 76 | 77 | } else { 78 | possible[ modif + character ] = true; 79 | possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true; 80 | 81 | // "$" can be triggered as "Shift+4" or "Shift+$" or just "$" 82 | if ( modif === "shift+" ) { 83 | possible[ jQuery.hotkeys.shiftNums[ character ] ] = true; 84 | } 85 | } 86 | 87 | for ( var i = 0, l = keys.length; i < l; i++ ) { 88 | if ( possible[ keys[i] ] ) { 89 | return origHandler.apply( this, arguments ); 90 | } 91 | } 92 | }; 93 | } 94 | 95 | jQuery.each([ "keydown", "keyup", "keypress" ], function() { 96 | jQuery.event.special[ this ] = { add: keyHandler }; 97 | }); 98 | 99 | })( jQuery ); -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/jquery.treeTable.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery treeTable Plugin 2.3.0 3 | * http://ludo.cubicphuse.nl/jquery-plugins/treeTable/ 4 | * 5 | * Copyright 2010, Ludo van den Boom 6 | * Dual licensed under the MIT or GPL Version 2 licenses. 7 | */ 8 | (function($){var options;var defaultPaddingLeft;$.fn.treeTable=function(opts){options=$.extend({},$.fn.treeTable.defaults,opts);return this.each(function(){$(this).addClass("treeTable").find("tbody tr").each(function(){if(!options.expandable||$(this)[0].className.search(options.childPrefix)==-1){if(isNaN(defaultPaddingLeft)){defaultPaddingLeft=parseInt($($(this).children("td")[options.treeColumn]).css('padding-left'),10);} 9 | initialize($(this));}else if(options.initialState=="collapsed"){this.style.display="none";}});});};$.fn.treeTable.defaults={childPrefix:"child-of-",clickableNodeNames:false,expandable:true,indent:19,initialState:"collapsed",treeColumn:0};$.fn.collapse=function(){$(this).addClass("collapsed");childrenOf($(this)).each(function(){if(!$(this).hasClass("collapsed")){$(this).collapse();} 10 | this.style.display="none";});return this;};$.fn.expand=function(){$(this).removeClass("collapsed").addClass("expanded");childrenOf($(this)).each(function(){initialize($(this));if($(this).is(".expanded.parent")){$(this).expand();} 11 | $(this).show();});return this;};$.fn.reveal=function(){$(ancestorsOf($(this)).reverse()).each(function(){initialize($(this));$(this).expand().show();});return this;};$.fn.appendBranchTo=function(destination){var node=$(this);var parent=parentOf(node);var ancestorNames=$.map(ancestorsOf($(destination)),function(a){return a.id;});if($.inArray(node[0].id,ancestorNames)==-1&&(!parent||(destination.id!=parent[0].id))&&destination.id!=node[0].id){indent(node,ancestorsOf(node).length*options.indent*-1);if(parent){node.removeClass(options.childPrefix+parent[0].id);} 12 | node.addClass(options.childPrefix+destination.id);move(node,destination);indent(node,ancestorsOf(node).length*options.indent);} 13 | return this;};$.fn.reverse=function(){return this.pushStack(this.get().reverse(),arguments);};$.fn.toggleBranch=function(){if($(this).hasClass("collapsed")){$(this).expand();}else{$(this).removeClass("expanded").collapse();} 14 | return this;};function ancestorsOf(node){var ancestors=[];while(node=parentOf(node)){ancestors[ancestors.length]=node[0];} 15 | return ancestors;};function childrenOf(node){return $("table.treeTable tbody tr."+options.childPrefix+node[0].id);};function getPaddingLeft(node){var paddingLeft=parseInt(node[0].style.paddingLeft,10);return(isNaN(paddingLeft))?defaultPaddingLeft:paddingLeft;} 16 | function indent(node,value){var cell=$(node.children("td")[options.treeColumn]);cell[0].style.paddingLeft=getPaddingLeft(cell)+value+"px";childrenOf(node).each(function(){indent($(this),value);});};function initialize(node){if(!node.hasClass("initialized")){node.addClass("initialized");var childNodes=childrenOf(node);if(!node.hasClass("parent")&&childNodes.length>0){node.addClass("parent");} 17 | if(node.hasClass("parent")){var cell=$(node.children("td")[options.treeColumn]);var padding=getPaddingLeft(cell)+options.indent;childNodes.each(function(){$(this).children("td")[options.treeColumn].style.paddingLeft=padding+"px";});if(options.expandable){cell.prepend('');$(cell[0].firstChild).click(function(){node.toggleBranch();});if(options.clickableNodeNames){cell[0].style.cursor="pointer";$(cell).click(function(e){if(e.target.className!='expander'){node.toggleBranch();}});} 18 | if(!(node.hasClass("expanded")||node.hasClass("collapsed"))){node.addClass(options.initialState);} 19 | if(node.hasClass("expanded")){node.expand();}}}}};function move(node,destination){node.insertAfter(destination);childrenOf(node).reverse().each(function(){move($(this),node[0]);});};function parentOf(node){var classNames=node[0].className.split(' ');for(key in classNames){if(classNames[key].match(options.childPrefix)){return $("#"+classNames[key].substring(9));}}};})(jQuery); -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/apple/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/apple/bg.jpg -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/apple/d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/apple/d.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/apple/dot_for_ie.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/apple/dot_for_ie.gif -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/apple/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jsTree apple theme 1.0 3 | * Supported features: dots/no-dots, icons/no-icons, focused, loading 4 | * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search 5 | */ 6 | 7 | .jstree-apple > ul { background:url("bg.jpg") left top repeat; } 8 | .jstree-apple li, 9 | .jstree-apple ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; } 10 | .jstree-apple li { background-position:-90px 0; background-repeat:repeat-y; } 11 | .jstree-apple li.jstree-last { background:transparent; } 12 | .jstree-apple .jstree-open > ins { background-position:-72px 0; } 13 | .jstree-apple .jstree-closed > ins { background-position:-54px 0; } 14 | .jstree-apple .jstree-leaf > ins { background-position:-36px 0; } 15 | 16 | .jstree-apple a { border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px; text-shadow:1px 1px 1px white; } 17 | .jstree-apple .jstree-hovered { background:#e7f4f9; border:1px solid #d8f0fa; padding:0 3px 0 1px; text-shadow:1px 1px 1px silver; } 18 | .jstree-apple .jstree-clicked { background:#beebff; border:1px solid #99defd; padding:0 3px 0 1px; } 19 | .jstree-apple a .jstree-icon { background-position:-56px -20px; } 20 | .jstree-apple a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; } 21 | 22 | .jstree-apple.jstree-focused { background:white; } 23 | 24 | .jstree-apple .jstree-no-dots li, 25 | .jstree-apple .jstree-no-dots .jstree-leaf > ins { background:transparent; } 26 | .jstree-apple .jstree-no-dots .jstree-open > ins { background-position:-18px 0; } 27 | .jstree-apple .jstree-no-dots .jstree-closed > ins { background-position:0 0; } 28 | 29 | .jstree-apple .jstree-no-icons a .jstree-icon { display:none; } 30 | 31 | .jstree-apple .jstree-search { font-style:italic; } 32 | 33 | .jstree-apple .jstree-no-icons .jstree-checkbox { display:inline-block; } 34 | .jstree-apple .jstree-no-checkboxes .jstree-checkbox { display:none !important; } 35 | .jstree-apple .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; } 36 | .jstree-apple .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; } 37 | .jstree-apple .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; } 38 | .jstree-apple .jstree-checked > a > .checkbox:hover { background-position:-38px -37px; } 39 | .jstree-apple .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; } 40 | .jstree-apple .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; } 41 | 42 | #vakata-dragged.jstree-apple ins { background:transparent !important; } 43 | #vakata-dragged.jstree-apple .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; } 44 | #vakata-dragged.jstree-apple .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; } 45 | #jstree-marker.jstree-apple { background:url("d.png") -41px -57px no-repeat !important; } 46 | 47 | .jstree-apple a.jstree-search { color:aqua; } 48 | 49 | #vakata-contextmenu.jstree-apple-context, 50 | #vakata-contextmenu.jstree-apple-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; } 51 | #vakata-contextmenu.jstree-apple-context li { } 52 | #vakata-contextmenu.jstree-apple-context a { color:black; } 53 | #vakata-contextmenu.jstree-apple-context a:hover, 54 | #vakata-contextmenu.jstree-apple-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; } 55 | #vakata-contextmenu.jstree-apple-context li.jstree-contextmenu-disabled a, 56 | #vakata-contextmenu.jstree-apple-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; } 57 | #vakata-contextmenu.jstree-apple-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; } 58 | #vakata-contextmenu.jstree-apple-context li ul { margin-left:-4px; } 59 | 60 | /* TODO: IE6 support - the `>` selectors */ -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/apple/throbber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/apple/throbber.gif -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/classic/d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/classic/d.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/classic/dot_for_ie.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/classic/dot_for_ie.gif -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/classic/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jsTree classic theme 1.0 3 | * Supported features: dots/no-dots, icons/no-icons, focused, loading 4 | * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search 5 | */ 6 | 7 | .jstree-classic li, 8 | .jstree-classic ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; } 9 | .jstree-classic li { background-position:-90px 0; background-repeat:repeat-y; } 10 | .jstree-classic li.jstree-last { background:transparent; } 11 | .jstree-classic .jstree-open > ins { background-position:-72px 0; } 12 | .jstree-classic .jstree-closed > ins { background-position:-54px 0; } 13 | .jstree-classic .jstree-leaf > ins { background-position:-36px 0; } 14 | 15 | .jstree-classic .jstree-hovered { background:#e7f4f9; border:1px solid #e7f4f9; padding:0 2px 0 1px; } 16 | .jstree-classic .jstree-clicked { background:navy; border:1px solid navy; padding:0 2px 0 1px; color:white; } 17 | .jstree-classic a .jstree-icon { background-position:-56px -19px; } 18 | .jstree-classic .jstree-open > a .jstree-icon { background-position:-56px -36px; } 19 | .jstree-classic a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; } 20 | 21 | .jstree-classic.jstree-focused { background:white; } 22 | 23 | .jstree-classic .jstree-no-dots li, 24 | .jstree-classic .jstree-no-dots .jstree-leaf > ins { background:transparent; } 25 | .jstree-classic .jstree-no-dots .jstree-open > ins { background-position:-18px 0; } 26 | .jstree-classic .jstree-no-dots .jstree-closed > ins { background-position:0 0; } 27 | 28 | .jstree-classic .jstree-no-icons a .jstree-icon { display:none; } 29 | 30 | .jstree-classic .jstree-search { font-style:italic; } 31 | 32 | .jstree-classic .jstree-no-icons .jstree-checkbox { display:inline-block; } 33 | .jstree-classic .jstree-no-checkboxes .jstree-checkbox { display:none !important; } 34 | .jstree-classic .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; } 35 | .jstree-classic .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; } 36 | .jstree-classic .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; } 37 | .jstree-classic .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; } 38 | .jstree-classic .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; } 39 | .jstree-classic .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; } 40 | 41 | #vakata-dragged.jstree-classic ins { background:transparent !important; } 42 | #vakata-dragged.jstree-classic .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; } 43 | #vakata-dragged.jstree-classic .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; } 44 | #jstree-marker.jstree-classic { background:url("d.png") -41px -57px no-repeat !important; } 45 | 46 | .jstree-classic a.jstree-search { color:aqua; } 47 | 48 | #vakata-contextmenu.jstree-classic-context, 49 | #vakata-contextmenu.jstree-classic-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; } 50 | #vakata-contextmenu.jstree-classic-context li { } 51 | #vakata-contextmenu.jstree-classic-context a { color:black; } 52 | #vakata-contextmenu.jstree-classic-context a:hover, 53 | #vakata-contextmenu.jstree-classic-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; } 54 | #vakata-contextmenu.jstree-classic-context li.jstree-contextmenu-disabled a, 55 | #vakata-contextmenu.jstree-classic-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; } 56 | #vakata-contextmenu.jstree-classic-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; } 57 | #vakata-contextmenu.jstree-classic-context li ul { margin-left:-4px; } 58 | 59 | /* TODO: IE6 support - the `>` selectors */ -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/classic/throbber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/classic/throbber.gif -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/default-rtl/d.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/default-rtl/d.gif -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/default-rtl/d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/default-rtl/d.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/default-rtl/dots.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/default-rtl/dots.gif -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/default-rtl/throbber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/default-rtl/throbber.gif -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/default/d.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/default/d.gif -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/default/d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/default/d.png -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jquery/themes/default/throbber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/azkaban-web-2.5.0/web/js/jquery/themes/default/throbber.gif -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jqueryui/jquery-ui-sliderAccess.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Slider Access 3 | * By: Trent Richardson [http://trentrichardson.com] 4 | * Version 0.3 5 | * Last Modified: 10/20/2012 6 | * 7 | * Copyright 2011 Trent Richardson 8 | * Dual licensed under the MIT and GPL licenses. 9 | * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt 10 | * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt 11 | * 12 | */ 13 | (function($){ 14 | 15 | $.fn.extend({ 16 | sliderAccess: function(options){ 17 | options = options || {}; 18 | options.touchonly = options.touchonly !== undefined? options.touchonly : true; // by default only show it if touch device 19 | 20 | if(options.touchonly === true && !("ontouchend" in document)) 21 | return $(this); 22 | 23 | return $(this).each(function(i,obj){ 24 | var $t = $(this), 25 | o = $.extend({},{ 26 | where: 'after', 27 | step: $t.slider('option','step'), 28 | upIcon: 'ui-icon-plus', 29 | downIcon: 'ui-icon-minus', 30 | text: false, 31 | upText: '+', 32 | downText: '-', 33 | buttonset: true, 34 | buttonsetTag: 'span', 35 | isRTL: false 36 | }, options), 37 | $buttons = $('<'+ o.buttonsetTag +' class="ui-slider-access">'+ 38 | ''+ 39 | ''+ 40 | ''); 41 | 42 | $buttons.children('button').each(function(j, jobj){ 43 | var $jt = $(this); 44 | $jt.button({ 45 | text: o.text, 46 | icons: { primary: $jt.data('icon') } 47 | }) 48 | .click(function(e){ 49 | var step = $jt.data('step'), 50 | curr = $t.slider('value'), 51 | newval = curr += step*1, 52 | minval = $t.slider('option','min'), 53 | maxval = $t.slider('option','max'), 54 | slidee = $t.slider("option", "slide") || function(){}, 55 | stope = $t.slider("option", "stop") || function(){}; 56 | 57 | e.preventDefault(); 58 | 59 | if(newval < minval || newval > maxval) 60 | return; 61 | 62 | $t.slider('value', newval); 63 | 64 | slidee.call($t, null, { value: newval }); 65 | stope.call($t, null, { value: newval }); 66 | }); 67 | }); 68 | 69 | // before or after 70 | $t[o.where]($buttons); 71 | 72 | if(o.buttonset){ 73 | $buttons.removeClass('ui-corner-right').removeClass('ui-corner-left').buttonset(); 74 | $buttons.eq(0).addClass('ui-corner-left'); 75 | $buttons.eq(1).addClass('ui-corner-right'); 76 | } 77 | 78 | // adjust the width so we don't break the original layout 79 | var bOuterWidth = $buttons.css({ 80 | marginLeft: ((o.where == 'after' && !o.isRTL) || (o.where == 'before' && o.isRTL)? 10:0), 81 | marginRight: ((o.where == 'before' && !o.isRTL) || (o.where == 'after' && o.isRTL)? 10:0) 82 | }).outerWidth(true) + 5; 83 | var tOuterWidth = $t.outerWidth(true); 84 | $t.css('display','inline-block').width(tOuterWidth-bOuterWidth); 85 | }); 86 | } 87 | }); 88 | 89 | })(jQuery); -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jqueryui/jquery.effects.blind.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Effects Blind 1.8.5 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Effects/Blind 9 | * 10 | * Depends: 11 | * jquery.effects.core.js 12 | */ 13 | (function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","left"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,g);b.effects.removeWrapper(a); 14 | c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery); 15 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jqueryui/jquery.effects.bounce.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Effects Bounce 1.8.5 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Effects/Bounce 9 | * 10 | * Depends: 11 | * jquery.effects.core.js 12 | */ 13 | (function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","left"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/ 14 | 3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ 15 | e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); 16 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jqueryui/jquery.effects.fade.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Effects Fade 1.8.5 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Effects/Fade 9 | * 10 | * Depends: 11 | * jquery.effects.core.js 12 | */ 13 | (function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); 14 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jqueryui/jquery.effects.fold.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Effects Fold 1.8.5 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Effects/Fold 9 | * 10 | * Depends: 11 | * jquery.effects.core.js 12 | */ 13 | (function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100* 14 | f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); 15 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jqueryui/jquery.effects.highlight.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Effects Highlight 1.8.5 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Effects/Highlight 9 | * 10 | * Depends: 11 | * jquery.effects.core.js 12 | */ 13 | (function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& 14 | this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); 15 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jqueryui/jquery.effects.pulsate.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Effects Pulsate 1.8.5 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Effects/Pulsate 9 | * 10 | * Depends: 11 | * jquery.effects.core.js 12 | */ 13 | (function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); 14 | b.dequeue()})})}})(jQuery); 15 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jqueryui/jquery.ui.core.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI 1.8.5 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI 9 | */ 10 | (function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.5",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106, 11 | NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this, 12 | "position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position"); 13 | if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind("mousedown.ui-disableSelection selectstart.ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f, 14 | "border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c.style(this,h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c.style(this, 15 | h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}}); 16 | c(function(){var a=document.createElement("div"),b=document.body;c.extend(a.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.appendChild(a).offsetHeight===100;b.removeChild(a).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); 18 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jqueryui/jquery.ui.position.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Position 1.8.5 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Position 9 | */ 10 | (function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.scrollTo&&d.document){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j= 11 | {top:b.of.pageY,left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/ 12 | 2;if(b.at[1]==="bottom")j.top+=k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+parseInt(c.curCSS(this,"marginRight",true))||0,w=m+q+parseInt(c.curCSS(this,"marginBottom",true))||0,i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]=== 13 | "center")i.top-=m/2;i.left=parseInt(i.left);i.top=parseInt(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft(); 14 | b.left=d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0]; 15 | b.left+=a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d= 16 | c(b),g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); 17 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jqueryui/jquery.ui.progressbar.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Progressbar 1.8.5 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Progressbar 9 | * 10 | * Depends: 11 | * jquery.ui.core.js 12 | * jquery.ui.widget.js 13 | */ 14 | (function(b,c){b.widget("ui.progressbar",{options:{value:0},min:0,max:100,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.max,"aria-valuenow":this._value()});this.valueDiv=b("
").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); 15 | this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===c)return this._value();this._setOption("value",a);return this},_setOption:function(a,d){if(a==="value"){this.options.value=d;this._refreshValue();this._trigger("change")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.max,Math.max(this.min,a))},_refreshValue:function(){var a=this.value();this.valueDiv.toggleClass("ui-corner-right", 16 | a===this.max).width(a+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.5"})})(jQuery); 17 | -------------------------------------------------------------------------------- /azkaban-web-2.5.0/web/js/jqueryui/jquery.ui.selectable.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Selectable 1.8.5 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Selectables 9 | * 10 | * Depends: 11 | * jquery.ui.core.js 12 | * jquery.ui.mouse.js 13 | * jquery.ui.widget.js 14 | */ 15 | (function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), 16 | selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("
")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, 17 | c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", 18 | c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= 19 | this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom60*60*24,1,0)),0) 39 | from execution_flows t 40 | where end_time=-1''' 41 | db = get_db() 42 | total,prepared,overtime = db.fetch_one(sql) 43 | print total,prepared,overtime 44 | if total>=10 and prepared>=1: 45 | title = 'azkaban任务队列出现阻塞,请处理' 46 | mes = '当前azkaban队列共[%s]个任务,其中[%s]阻塞中' % (total,prepared) 47 | exe_alarm(title,mes) 48 | elif overtime>=1: 49 | sql = ''' 50 | select 51 | count(1),group_concat("[",t.flow_id,",",submit_user,"]"),group_concat(exec_id) 52 | from execution_flows t 53 | where end_time=-1 and unix_timestamp(now())-start_time/1000>60*60*24 54 | ''' 55 | db = get_db() 56 | overtime,mes,ids = db.fetch_one(sql) 57 | print ids 58 | title = 'azkaban有任务超过1天%s,已kill' % mes 59 | mes = '当前azkaban共[%s]超过1天,分别是%s' % (overtime,mes) 60 | exe_alarm(title,mes) 61 | for exec_id in ids.split(','): 62 | try: 63 | canel_execflow(exec_id) 64 | except Exception,e: 65 | print e 66 | 67 | #失败告警 68 | def exe_alarm(title,mes): 69 | mailto = ['wangxu@oneniceapp.com'] 70 | msgto = '' 71 | #邮件 72 | title = '!!!!![这是报警]%s' % title 73 | content = "    %s
    详情查看" % mes 74 | send_html(mailto,title,content) 75 | 76 | send_msg(msgto, title , '报警') 77 | 78 | if __name__ == '__main__': 79 | check_jobs() 80 | -------------------------------------------------------------------------------- /schedule/azkaban_api.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | #encoding:utf-8 3 | ''' 4 | 生成azkaban的配置文件 5 | ''' 6 | import sys 7 | reload(sys) 8 | sys.setdefaultencoding("utf-8") 9 | 10 | import os 11 | import zipfile 12 | import urllib 13 | import urllib2 14 | import json 15 | import commands 16 | import logging 17 | import datetime 18 | 19 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 20 | sys.path.append(os.path.join(CURRENTPATH, 'tinder/python')) 21 | 22 | from util.helpers import mysql_helper 23 | from job_define import Job,MyScheduleException 24 | from azkaban_helper import get_session_id 25 | #配置文件 26 | CONFILE = "%s/conf/nice.cfg" % CURRENTPATH 27 | 28 | def schedule_flow(session_id,project_name,flow_name,schedule_time,period): 29 | url = 'https://localhost:8443/schedule' 30 | 31 | project_id = Job.get_projectid_byname(project_name) 32 | sstime = datetime.datetime.strptime(schedule_time, "%Y-%m-%d %H:%M") 33 | sdate = sstime.strftime('%m/%d/%Y') 34 | stime = sstime.strftime('%I,%M,%p,') 35 | 36 | params = 'is_recurring=on&period=%s&projectName=%s&flow=%s&projectId=%s&scheduleTime=%s&scheduleDate=%s' % (period,project_name,flow_name,project_id,stime, sdate) 37 | 38 | command = '''curl -k %s -d "ajax=scheduleFlow&%s" -b azkaban.browser.session.id=%s''' % (url,params,session_id) 39 | 40 | logging.info(command) 41 | status,result = commands.getstatusoutput(command) 42 | # 43 | resp = json.loads(result[result.find('{'):]) 44 | if "error" in resp.keys(): 45 | raise Exception(resp['error']) 46 | if 'status' in resp.keys() and resp['status']=='error': 47 | raise Exception(resp['message']) 48 | 49 | return resp 50 | 51 | def execute_flow(session_id,project_name,flow_name,param_dict={}): 52 | url = 'https://localhost:8443/executor' 53 | ignore_set = set(["concurrentOption","pipelineLevel"]) 54 | param_str = ' '.join(map(lambda (k,v):"--data '%s=%s' " % (k if k in ignore_set else 'flowOverride[%s]'% k ,v[0] if type(v)==type([]) else v),param_dict.items())) 55 | 56 | command = '''curl -k --get --data 'session.id=%s' --data 'ajax=executeFlow' --data 'project=%s' --data 'flow=%s' %s %s''' % (session_id,project_name,flow_name,url,param_str) 57 | 58 | logging.info(command) 59 | status,result = commands.getstatusoutput(command) 60 | logging.info(result) 61 | resp = json.loads(result[result.find('{'):]) 62 | if "error" in resp.keys(): 63 | raise Exception(resp['error']) 64 | 65 | return resp 66 | 67 | def fetchexec_flow(session_id,execid): 68 | url = 'https://localhost:8443/executor' 69 | command = '''curl -k --data "session.id=%s&ajax=fetchexecflow&execid=%s" %s''' % (session_id,execid,url) 70 | logging.info(command) 71 | status,result = commands.getstatusoutput(command) 72 | logging.info(result) 73 | try: 74 | resp = json.loads(result[result.find('{'):]) 75 | except: 76 | raise Exception('error execid[%s]' % execid) 77 | 78 | if "error" in resp.keys(): 79 | raise Exception(resp['error']) 80 | return resp 81 | 82 | 83 | def canel_execflow(execid): 84 | session_id = get_session_id('admin','admin_pwd') 85 | url = 'https://localhost:8443/executor' 86 | command = '''/usr/local/bin/curl -k --data "session.id=%s&ajax=cancelFlow&execid=%s" %s''' % (session_id,execid,url) 87 | logging.info(command) 88 | status,result = commands.getstatusoutput(command) 89 | logging.info(result) 90 | try: 91 | resp = json.loads(result[result.find('{'):]) 92 | except: 93 | raise Exception('error execid[%s]' % execid) 94 | 95 | if "error" in resp.keys(): 96 | raise Exception(resp['error']) 97 | return resp 98 | 99 | if __name__ == '__main__': 100 | session_id = get_session_id('admin','admin_pwd') 101 | canel_execflow(112345) 102 | #generate_files(session_id) 103 | 104 | -------------------------------------------------------------------------------- /schedule/azkaban_helper.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | #encoding:utf-8 3 | ''' 4 | 生成azkaban的配置文件 5 | ''' 6 | import sys 7 | reload(sys) 8 | sys.setdefaultencoding("utf-8") 9 | 10 | import os 11 | import zipfile 12 | import urllib 13 | import urllib2 14 | import json 15 | import commands 16 | 17 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 18 | sys.path.append(os.path.join(CURRENTPATH, 'tinder/python')) 19 | 20 | #配置文件 21 | CONFILE = "%s/conf/nice.cfg" % CURRENTPATH 22 | 23 | #azkaban的session_id 24 | def get_session_id(username='',password=''): 25 | try: 26 | #请求路径 27 | url = 'https://localhost:8443/' 28 | params={} 29 | params['action']='login' 30 | if username=='' or password=='': 31 | username = raw_input('LDAP username:') 32 | password = raw_input('LDAP password:') 33 | params['username']= username 34 | params['password']= password 35 | data = urllib.urlencode(params) 36 | req = urllib2.Request(url,data) 37 | res_data = urllib2.urlopen(req) 38 | res = res_data.read() 39 | print res 40 | obj = json.loads(res) 41 | return obj['session.id'] 42 | except Exception,e: 43 | print e 44 | return '' 45 | 46 | if __name__ == '__main__': 47 | session_id = get_session_id() 48 | #generate_files(session_id) 49 | 50 | -------------------------------------------------------------------------------- /schedule/conf/nice.cfg: -------------------------------------------------------------------------------- 1 | [master_azkaban] 2 | host=192.168.72.91 3 | port=3306 4 | db=azkaban_meta 5 | username=root 6 | password= 7 | charset=utf8 8 | 9 | [job_replace_param] 10 | default_dir=/tmp 11 | -------------------------------------------------------------------------------- /schedule/util/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/util/__init__.py -------------------------------------------------------------------------------- /schedule/util/alarm.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # coding=utf-8 3 | 4 | import os 5 | 6 | def send_html(mailto,title,content): 7 | print '假装在发送邮件,请自行接入(schedule/util/alarm)' 8 | print mailto 9 | print title 10 | 11 | def send_msg(msgto,content): 12 | print '假装在发送短信,请自行接入(schedule/util/alarm)' 13 | print msgto 14 | print content 15 | 16 | if __name__=='__main__': 17 | send_msg(11111,'aa') 18 | -------------------------------------------------------------------------------- /schedule/util/config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # coding=utf-8 3 | 4 | import os 5 | from ConfigParser import RawConfigParser 6 | 7 | 8 | def singleton(cls, *args, **kw): 9 | instances = {} 10 | 11 | def _singleton(): 12 | if cls not in instances: 13 | instances[cls] = cls(*args, **kw) 14 | return instances[cls] 15 | 16 | return _singleton 17 | 18 | 19 | #@singleton 20 | class Configuration: 21 | def __init__(self, configfile): 22 | config_home = os.getenv("CONF_HOME") 23 | if config_home: 24 | self._configFile = "%s/%s" % (config_home, configfile) 25 | else: 26 | self._configFile = configfile 27 | 28 | self._genConf() 29 | 30 | def _setConfigFile(self, configFile=None): 31 | """设置configure文件""" 32 | self._configFile = configFile 33 | if not self._configFile: 34 | raise Exception("配置文件不存在") 35 | self._genConf() 36 | 37 | def _genConf(self): 38 | if not self._configFile: 39 | raise Exception("没有配置文件") 40 | self._config = RawConfigParser() 41 | self._config.read(self._configFile) 42 | 43 | def get(self, sect, opt, default=None): 44 | if self._config.has_option(sect, opt): 45 | return self._config.get(sect, opt) 46 | return default 47 | 48 | def getint(self, sect, opt, default=None): 49 | if self._config.has_option(sect, opt): 50 | return self._config.getint(sect, opt) 51 | return default 52 | 53 | def items(self,sect): 54 | return self._config.items(sect) 55 | 56 | def get_conf(confile="nice.cfg"): 57 | """创建配置文件""" 58 | return Configuration(confile) 59 | -------------------------------------------------------------------------------- /schedule/util/helpers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/util/helpers/__init__.py -------------------------------------------------------------------------------- /schedule/webapp/handler/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/webapp/handler/__init__.py -------------------------------------------------------------------------------- /schedule/webapp/handler/dag_edit.py: -------------------------------------------------------------------------------- 1 | #!/usrbin/python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | DAG图依赖关系更新 7 | ''' 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import tornado.web 14 | import json 15 | import os 16 | import traceback 17 | import StringIO 18 | 19 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 20 | sys.path.append(os.path.join(CURRENTPATH, '../../')) 21 | 22 | from job_define import Job 23 | 24 | #指标处理类 25 | class DagOpHandler(tornado.web.RequestHandler): 26 | #统一调用post方法 27 | def get(self): 28 | self.post() 29 | 30 | #action为操作类型 31 | def post(self): 32 | #需要先从azkaban登陆 33 | op = self.get_argument('op','') 34 | login_user = self.get_argument('login_user','') 35 | project_name = self.get_argument('project_name','') 36 | if login_user=='': 37 | self.render('to_login.html') 38 | return 39 | 40 | if op=='edit' : 41 | #项目 42 | jobs = Job.get_alljobs(project_name=project_name,login_user=login_user) 43 | has_dependce_jobs = set() 44 | is_dependced_jobs = set() 45 | 46 | for job in jobs: 47 | if job.dependencies != '': 48 | has_dependce_jobs.add(job.name) 49 | is_dependced_jobs.update(job.dependencies.split(',')) 50 | 51 | for job in jobs: 52 | job.has_dependce = True if job.name in has_dependce_jobs else False 53 | job.is_dependced = True if job.name in is_dependced_jobs else False 54 | 55 | logging.info('to edit dag [%s][%s]' % (project_name,login_user)) 56 | self.render('dag_edit.html',project_name=project_name,jobs=jobs,login_user=login_user) 57 | elif op=='save' : 58 | try: 59 | nodes = self.get_argument('nodes','') 60 | links = self.get_argument('links','') 61 | ns = json.loads(nodes) 62 | ls = json.loads(links) 63 | 64 | Job.update_dag(login_user,ns,ls) 65 | logging.info('edit dag [%s][%s]' % (project_name,login_user)) 66 | self.write("保存成功") 67 | except Exception,e: 68 | logging.info(e) 69 | self.write('保存失败[%s]' % str(e)) 70 | 71 | -------------------------------------------------------------------------------- /schedule/webapp/handler/job_check_exist.py: -------------------------------------------------------------------------------- 1 | #!/usrbin/python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | 任务更新 7 | ''' 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import tornado.web 14 | import json 15 | import os 16 | 17 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 18 | sys.path.append(os.path.join(CURRENTPATH, '../../')) 19 | 20 | from job_define import Job 21 | 22 | #指标处理类 23 | class JobCheckExistHandler(tornado.web.RequestHandler): 24 | #统一调用post方法 25 | def get(self): 26 | self.post() 27 | 28 | #action为操作类型 29 | def post(self): 30 | #任务 31 | name = self.get_argument('name','') 32 | logging.info('----name:[%s]' % name) 33 | job = None 34 | try: 35 | job = Job.get_job_fromdb(name) 36 | except: 37 | pass 38 | 39 | if job==None: 40 | self.write('non_exist') 41 | else: 42 | self.write('exist') 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /schedule/webapp/handler/job_delete.py: -------------------------------------------------------------------------------- 1 | #!/usrbin/python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | 任务删除 7 | ''' 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import tornado.web 14 | import json 15 | import os 16 | 17 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 18 | sys.path.append(os.path.join(CURRENTPATH, '../../')) 19 | 20 | from job_define import Job 21 | 22 | #指标处理类 23 | class JobDeleteHandler(tornado.web.RequestHandler): 24 | #统一调用post方法 25 | def get(self): 26 | self.post() 27 | 28 | #action为操作类型 29 | def post(self): 30 | title = '任务配置' 31 | #需要先从azkaban登陆 32 | session_id = self.get_argument('session_id','') 33 | login_user = self.get_argument('login_user','') 34 | if session_id=='' or login_user=='': 35 | self.render('to_login.html') 36 | return 37 | #参数 38 | query_name = self.get_argument('query_name','') 39 | query_project_name = self.get_argument('query_project_name','') 40 | query_server_host = self.get_argument('query_server_host','') 41 | query_user = self.get_argument('query_user','') 42 | #任务删除 43 | name = self.get_argument('name','') 44 | job = Job.get_job_fromdb(name) 45 | #job = Job() 46 | #job.name = name 47 | job.updater = login_user 48 | job.unschedule_flow() 49 | job.delete_dependencies() 50 | job.delete_job() 51 | 52 | #列表 53 | jobs = Job.get_alljobs(query_name,query_project_name,query_server_host,query_user,login_user) 54 | 55 | query_dict = { 56 | 'query_name':query_name, 57 | 'query_project_name':query_project_name, 58 | 'query_server_host':query_server_host, 59 | 'query_user':query_user, 60 | 'session_id':session_id, 61 | 'login_user':login_user 62 | } 63 | 64 | logging.info('[%s] delete job [%s]' % (login_user,name)) 65 | self.render('list.html',title=title,jobs=jobs,query_dict=query_dict) 66 | 67 | 68 | -------------------------------------------------------------------------------- /schedule/webapp/handler/job_list.py: -------------------------------------------------------------------------------- 1 | #!/usrbin/python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | 任务列表 7 | ''' 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import tornado.web 14 | import json 15 | import os 16 | 17 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 18 | sys.path.append(os.path.join(CURRENTPATH, '../../')) 19 | 20 | from job_define import Job 21 | 22 | #指标处理类 23 | class JobListHandler(tornado.web.RequestHandler): 24 | #统一调用post方法 25 | def get(self): 26 | self.post() 27 | 28 | #action为操作类型 29 | def post(self): 30 | title = '调度任务列表' 31 | #需要先从azkaban登陆 32 | session_id = self.get_argument('session_id','') 33 | login_user = self.get_argument('login_user','') 34 | if session_id=='' or login_user=='': 35 | self.render('to_login.html') 36 | return 37 | #参数 38 | query_name = self.get_argument('query_name','') 39 | query_project_name = self.get_argument('query_project_name','') 40 | query_server_host = self.get_argument('query_server_host','') 41 | query_user = self.get_argument('query_user','') 42 | #列表 43 | jobs = Job.get_alljobs(query_name,query_project_name,query_server_host,query_user,login_user) 44 | 45 | query_dict = { 46 | 'query_name':query_name, 47 | 'query_project_name':query_project_name, 48 | 'query_server_host':query_server_host, 49 | 'query_user':query_user, 50 | 'session_id':session_id, 51 | 'login_user':login_user 52 | } 53 | 54 | logging.info('query job list [%s]' % query_dict) 55 | self.render('list.html',title=title,jobs=jobs,query_dict=query_dict) 56 | 57 | 58 | -------------------------------------------------------------------------------- /schedule/webapp/handler/job_status_handler.py: -------------------------------------------------------------------------------- 1 | #!/usrbin/python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | 任务更新 7 | ''' 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import tornado.web 14 | import json 15 | import os 16 | 17 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 18 | sys.path.append(os.path.join(CURRENTPATH, '../../')) 19 | 20 | from job_define import Job 21 | from job_status import JobStatus 22 | 23 | #指标处理类 24 | class JobStatusHandler(tornado.web.RequestHandler): 25 | #统一调用post方法 26 | def get(self): 27 | self.post() 28 | 29 | #action为操作类型 30 | def post(self): 31 | #任务 32 | job_name = self.get_argument('job_name','') 33 | exec_time = self.get_argument('execute_time','') 34 | logging.info('----job name:[%s]' % job_name) 35 | try: 36 | json = JobStatus.get_jobstatus_json(job_name,exec_time) 37 | self.write(json) 38 | except Exception,e: 39 | self.write('error:%s' % e) 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /schedule/webapp/handler/job_to_update.py: -------------------------------------------------------------------------------- 1 | #!/usrbin/python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | 任务更新 7 | ''' 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import tornado.web 14 | import json 15 | import os 16 | 17 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 18 | sys.path.append(os.path.join(CURRENTPATH, '../../')) 19 | 20 | from job_define import Job 21 | 22 | #指标处理类 23 | class JobToUpdateHandler(tornado.web.RequestHandler): 24 | #统一调用post方法 25 | def get(self): 26 | self.post() 27 | 28 | #action为操作类型 29 | def post(self): 30 | op = self.get_argument('op','') 31 | if op=='show': 32 | name = self.get_argument('name','') 33 | job = Job.get_job_fromdb(name) 34 | self.write('
%s
' %str(job)) 35 | return 36 | 37 | title = '任务配置' 38 | #需要先从azkaban登陆 39 | session_id = self.get_argument('session_id','') 40 | login_user = self.get_argument('login_user','') 41 | if session_id=='' or login_user=='': 42 | self.render('to_login.html') 43 | return 44 | #参数 45 | query_name = self.get_argument('query_name','') 46 | query_project_name = self.get_argument('query_project_name','') 47 | query_server_host = self.get_argument('query_server_host','') 48 | query_user = self.get_argument('query_user','') 49 | #任务 50 | name = self.get_argument('name','') 51 | is_copy = self.get_argument('is_copy','false') 52 | job = Job() 53 | if name !='': 54 | job = Job.get_job_fromdb(name) 55 | if is_copy == 'true': 56 | job.name = '' 57 | job.loc = '' 58 | projects = Job.get_projects(login_user) 59 | jobs = Job.get_alljobs(login_user=login_user) 60 | all_jobs = Job.get_alljobs() 61 | 62 | query_dict = { 63 | 'query_name':query_name, 64 | 'query_project_name':query_project_name, 65 | 'query_server_host':query_server_host, 66 | 'query_user':query_user, 67 | 'session_id':session_id, 68 | 'login_user':login_user 69 | } 70 | 71 | logging.info('to update job [%s]' % name) 72 | self.render('to_update.html',title=title,job=job,jobs=jobs,all_jobs=all_jobs,projects=projects,query_dict=query_dict) 73 | 74 | 75 | -------------------------------------------------------------------------------- /schedule/webapp/handler/job_update.py: -------------------------------------------------------------------------------- 1 | #!/usrbin/python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | 任务更新 7 | ''' 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import tornado.web 14 | import json 15 | import os 16 | import time 17 | 18 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 19 | sys.path.append(os.path.join(CURRENTPATH, '../../')) 20 | 21 | from job_define import Job 22 | 23 | #指标处理类 24 | class JobUpdateHandler(tornado.web.RequestHandler): 25 | #统一调用post方法 26 | def get(self): 27 | self.post() 28 | 29 | #action为操作类型 30 | def post(self): 31 | #更新完跳转到列表页 32 | title = '调度任务列表' 33 | #需要先从azkaban登陆 34 | session_id = self.get_argument('session_id','') 35 | login_user = self.get_argument('login_user','') 36 | if session_id=='' or login_user=='': 37 | self.render('to_login.html') 38 | return 39 | #参数 40 | query_name = self.get_argument('query_name','') 41 | query_project_name = self.get_argument('query_project_name','') 42 | query_server_host = self.get_argument('query_server_host','') 43 | query_user = self.get_argument('query_user','') 44 | #生成job 45 | attr_list = Job.get_attr_list() 46 | dependencies_box = self.get_argument('dependencies_box','') 47 | logging.info('>>>>>>>>>>>'+str(type(dependencies_box))) 48 | logging.info('>>>>>>>>>>>'+str(dependencies_box)) 49 | job = Job() 50 | #动态加载字段,默认均为字符串 51 | for attr in attr_list: 52 | value = str(self.get_argument(attr,'')).strip() 53 | if value!='': 54 | setattr(job,attr,value) 55 | logging.info(attr+':'+value) 56 | #默认设置 57 | job.name = job.name.replace('.','-') 58 | job.updater = login_user 59 | job.update_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 60 | if job.creator == '': 61 | job.creator = job.updater 62 | job.create_time = job.update_time 63 | #更新 64 | job.update_job() 65 | 66 | #列表 67 | jobs = Job.get_alljobs(query_name,query_project_name,query_server_host,query_user,login_user) 68 | 69 | query_dict = { 70 | 'query_name':query_name, 71 | 'query_project_name':query_project_name, 72 | 'query_server_host':query_server_host, 73 | 'query_user':query_user, 74 | 'session_id':session_id, 75 | 'login_user':login_user 76 | } 77 | 78 | logging.info('[%s] update job [%s]' % (login_user,job.name)) 79 | self.render('list.html',title=title,jobs=jobs,query_dict=query_dict) 80 | 81 | 82 | -------------------------------------------------------------------------------- /schedule/webapp/handler/job_upload.py: -------------------------------------------------------------------------------- 1 | #!/usrbin/python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | 任务上传 7 | ''' 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import tornado.web 14 | import json 15 | import os 16 | import time 17 | 18 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 19 | sys.path.append(os.path.join(CURRENTPATH, '../../')) 20 | 21 | from generate_files import login_and_upload 22 | 23 | #指标处理类 24 | class JobUploadHandler(tornado.web.RequestHandler): 25 | #统一调用post方法 26 | def get(self): 27 | self.post() 28 | 29 | #action为操作类型 30 | def post(self): 31 | #更新完跳转到列表页 32 | title = '任务上传' 33 | #需要先从azkaban登陆 34 | #session_id = self.get_argument('session_id','') 35 | #login_user = self.get_argument('login_user','') 36 | #if session_id=='' or login_user=='': 37 | # self.render('to_login.html') 38 | # return 39 | #上传结果 40 | username = self.get_argument('username','') 41 | login_user = username 42 | password = self.get_argument('password','') 43 | session_id,result_list = login_and_upload(username,password) 44 | 45 | query_dict = { 46 | 'session_id':session_id, 47 | 'login_user':login_user 48 | } 49 | 50 | logging.info('[%s] upload jobs' % (login_user)) 51 | self.render('upload.html',title=title,result_list=result_list,query_dict=query_dict) 52 | 53 | 54 | -------------------------------------------------------------------------------- /schedule/webapp/model/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/webapp/model/__init__.py -------------------------------------------------------------------------------- /schedule/webapp/restart.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | sh shutdown.sh 4 | sh startup.sh 5 | -------------------------------------------------------------------------------- /schedule/webapp/router/schedule_router.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | ''' 7 | 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import os 14 | import tornado.ioloop 15 | import tornado.web 16 | import tornado.options 17 | import tornado.httpserver 18 | from handler.job_list import JobListHandler 19 | from handler.job_to_update import JobToUpdateHandler 20 | from handler.job_update import JobUpdateHandler 21 | from handler.job_delete import JobDeleteHandler 22 | from handler.job_upload import JobUploadHandler 23 | from handler.job_check_exist import JobCheckExistHandler 24 | from handler.dag_edit import DagOpHandler 25 | from handler.job_api import JobApiHandler 26 | from handler.job_status_handler import JobStatusHandler 27 | 28 | #默认端口 29 | from tornado.options import define, options 30 | define("port", default=8445, help="run on the given port", type=int) 31 | 32 | #log日志配置 33 | def init_logconfig(): 34 | log_file = 'schedule_web.log' 35 | logging.basicConfig(level=logging.INFO, 36 | format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s', 37 | datefmt='', 38 | filename=log_file, 39 | filemode='a') 40 | 41 | settings = { 42 | "template_path":os.path.join(os.path.dirname(__file__), "../templates"), 43 | "static_path": os.path.join(os.path.dirname(__file__), "../static") 44 | } 45 | 46 | #路径路由 47 | application = tornado.web.Application([ 48 | #(r"/upload", UploadHandler), 49 | (r"/job_list", JobListHandler), 50 | (r"/job_to_update", JobToUpdateHandler), 51 | (r"/job_update", JobUpdateHandler), 52 | (r"/job_delete", JobDeleteHandler), 53 | (r"/job_upload", JobUploadHandler), 54 | (r"/job_check_exist", JobCheckExistHandler), 55 | (r"/job_api",JobApiHandler), 56 | (r"/job_status",JobStatusHandler), 57 | (r"/dag",DagOpHandler), 58 | ],**settings) 59 | 60 | if __name__ == "__main__": 61 | #初始化logging 62 | init_logconfig() 63 | # logging.info(template_path) 64 | logging.info('-----quality monitor service startup-------') 65 | tornado.options.parse_command_line() 66 | logging.info('port:%s' % options.port) 67 | 68 | server = tornado.httpserver.HTTPServer(application) 69 | server.bind(options.port) 70 | server.start(5) 71 | tornado.ioloop.IOLoop.instance().start() 72 | #logging.info('----------service startup---------') 73 | -------------------------------------------------------------------------------- /schedule/webapp/shutdown.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/sh 2 | 3 | pid=`ps aux | grep "router/schedule_router.py" |grep -v grep |awk '{print $2}'` 4 | [ "$pid" != "" ] && kill -9 $pid 5 | echo $pid 6 | 7 | -------------------------------------------------------------------------------- /schedule/webapp/startup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | CURDIR=`pwd` 4 | #export CONF_HOME=$CURDIR/conf 5 | export PYTHONPATH=$CURDIR:$PYTHONPATH 6 | 7 | nohup python router/schedule_router.py --port=8445 > schedule_web.log 2>&1 & 8 | -------------------------------------------------------------------------------- /schedule/webapp/static/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Base structure 3 | */ 4 | 5 | /* Move down content because we have a fixed navbar that is 50px tall */ 6 | body { 7 | padding-top: 50px; 8 | } 9 | 10 | 11 | /* 12 | * Global add-ons 13 | */ 14 | 15 | .sub-header { 16 | padding-bottom: 10px; 17 | border-bottom: 1px solid #eee; 18 | } 19 | 20 | /* 21 | * Top navigation 22 | * Hide default border to remove 1px line. 23 | */ 24 | .navbar-fixed-top { 25 | border: 0; 26 | } 27 | 28 | /* 29 | * Sidebar 30 | */ 31 | 32 | /* Hide for mobile, show later */ 33 | .sidebar { 34 | display: none; 35 | } 36 | @media (min-width: 768px) { 37 | .sidebar { 38 | position: fixed; 39 | top: 51px; 40 | bottom: 0; 41 | left: 0; 42 | z-index: 1000; 43 | display: block; 44 | padding: 20px; 45 | overflow-x: hidden; 46 | overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ 47 | background-color: #f5f5f5; 48 | border-right: 1px solid #eee; 49 | } 50 | } 51 | 52 | /* Sidebar navigation */ 53 | .nav-sidebar { 54 | margin-right: -21px; /* 20px padding + 1px border */ 55 | margin-bottom: 20px; 56 | margin-left: -20px; 57 | } 58 | .nav-sidebar > li > a { 59 | padding-right: 20px; 60 | padding-left: 20px; 61 | } 62 | .nav-sidebar > .active > a, 63 | .nav-sidebar > .active > a:hover, 64 | .nav-sidebar > .active > a:focus { 65 | color: #fff; 66 | background-color: #428bca; 67 | } 68 | 69 | 70 | /* 71 | * Main content 72 | */ 73 | 74 | .main { 75 | padding: 20px; 76 | } 77 | @media (min-width: 768px) { 78 | .main { 79 | padding-right: 40px; 80 | padding-left: 40px; 81 | } 82 | } 83 | .main .page-header { 84 | margin-top: 0; 85 | } 86 | 87 | 88 | /* 89 | * Placeholder dashboard ideas 90 | */ 91 | 92 | .placeholders { 93 | margin-bottom: 30px; 94 | text-align: center; 95 | } 96 | .placeholders h4 { 97 | margin-bottom: 0; 98 | } 99 | .placeholder { 100 | margin-bottom: 20px; 101 | } 102 | .placeholder img { 103 | display: inline-block; 104 | border-radius: 50%; 105 | } 106 | -------------------------------------------------------------------------------- /schedule/webapp/static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/webapp/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /schedule/webapp/static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/webapp/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /schedule/webapp/static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/webapp/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /schedule/webapp/static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/webapp/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /schedule/webapp/static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | owl 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 43 | 44 | 45 |
46 |
47 | 53 | 54 |
55 | 66 | 67 |

未处理的日志报警列表

68 |
69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 |
#HeaderHeaderHeaderHeader
1,001Loremipsumdolorsitsit
1,002ametconsecteturadipiscingelit
99 |
100 |
101 |
102 |
103 | 104 | 106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /schedule/webapp/static/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /schedule/webapp/static/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Bootstrap 101 Template 9 | 10 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 21 |

你好,世界!

22 |

图标

23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |

按钮

33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |

按钮尺寸

41 | 42 | 43 | 44 | 45 | 46 |

把图标显示在按钮里

47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /schedule/webapp/templates/to_login.html: -------------------------------------------------------------------------------- 1 | 密码错误,请重新从azkaban登陆 2 | -------------------------------------------------------------------------------- /schedule/webapp/templates/upload.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | nice调度任务 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 42 | 43 | 44 |
45 |
46 | 51 | 52 |
53 | 54 |

上传结果

55 |
56 |
57 |
58 | 59 | 60 |
61 |
62 |
63 | 64 |
65 | {% for result_dict in result_list %} 66 |
67 |
68 |

{{ '[%s]上传%s' % (result_dict['project_name'],'成功' if result_dict['upload_flag']=='true' else '失败') }}

69 |
70 |
71 | 上传信息: 72 |
{{ result_dict['mes'] }}
73 |
74 |
75 | {% end %} 76 |
77 |
78 |
79 |
80 | 81 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /todo.md: -------------------------------------------------------------------------------- 1 | # Todo列表 2 | 3 | - 当前配置方式对于无依赖关系的任务还是比较麻烦,后面会针对crontab类型提供一个便捷版本 4 | --------------------------------------------------------------------------------