#!/usr/bin/env python
# -----------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
# -----------------------------------------------------------------------

#
# This creates a signed jconsole jar that the DUCC webserver can use to open
# jconsoles on DUCC processes directly from the web server.
#
# This script sets up the environment and uses ant to do the heavy lifting of
# creating the signed jar.
#
import os
import sys
import shutil
import subprocess

from ducc_util import DuccUtil

class SignJconsole(DuccUtil):
    def main(self, args):
        os.environ['JAVA_HOME'] = self.java_home();
        os.environ['DUCC_HOME'] = self.DUCC_HOME
        os.system('ant -f jconsole.xml')

if __name__ == "__main__":

    signit = SignJconsole()
    signit.main(sys.argv[1:])

