JavaRunner.py 5.01 KB
Newer Older
# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
#
# Licensed 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.

import json, logging,threading, queue,time,signal
from datetime import datetime, timedelta
from typing import Any, Iterator, List, Optional, Tuple, Union
import logging
import grpc

from concurrent import futures
from lxml import etree
import os
import subprocess
from multiprocessing import Pool


SERVER_ADDRESS = 'localhost:2021'
SERVER_ID = 1
_ONE_DAY_IN_SECONDS = 60 * 60 * 24

XML_FILE="/var/teraflow/bgpls_speaker/service/resources/BGP4Parameters_3.xml"
XML_CONFIG_FILE="TMConfiguration_guillermo.xml"

LOGGER = logging.getLogger(__name__)


class JavaRunner:

    def __init__(self,localPort : int, address : str ="10.95.86.214", mngPort : int = 1112):

        self.__peerPort=179
        self.__localPort=localPort 
        self.__managementPort=mngPort
        # To support multiple speakers at same time 
        # Add 1 to port and then pass port to subproccess call
        self.__configFile=XML_CONFIG_FILE
        self.__process=0
        self.__lock = threading.Lock()
        self.__address = address
        self.__portConf=5007
        self.__asNumber=65006

    def getCurrentLocalPort(self):
        with self.__lock:
            return self.__localPort

    def getCurrentMngPort(self):
        with self.__lock:
            return self.__managementPort
    def getPid(self):
        return self.__process.pid

    def execAndKill(self):

        LOGGER.debug("Before exec and kill")
        os.chdir("/var/teraflow/bgpls_speaker/service/resources/")
        cwd = os.getcwd()
        LOGGER.info("Current working directory: %s", cwd)
        # Security shell=False
        self.__process=subprocess.Popen(['java -jar bgp_ls.jar '+ XML_CONFIG_FILE],
                shell=False,start_new_session=True,stdout=subprocess.PIPE)
        LOGGER.debug("Time to sleep")
        java_pid = self.__process.pid
        print("Java PID:", java_pid)    
        time.sleep(15)
        self.__process.terminate()


    def execBGPLSpeaker(self) -> bool:
            """
            Executes java BGPLS speaker in non-blocking process
            """
            # CHECKEAR muchas cosas
            LOGGER.debug("Before exec")
            os.chdir("/var/teraflow/bgpls_speaker/service/resources/")
            # Security reasons shell=False
            self.__process=subprocess.Popen(['java' , '-jar' , 'bgp_ls.jar' , XML_CONFIG_FILE],
                shell=False,start_new_session=True)
            return self.__process

    def setPort(self,port):
         self.__peerPort=port
         return True
    def setAsNumber(self,asNumber):
         self.__asNumber=asNumber
         return True

    def setPeer(self) -> bool:
            """
            Sets XML existing config file with peer address and port. TODO: as_number
            """

            XMLParser = etree.XMLParser(remove_blank_text=False)
            tree = etree.parse(XML_FILE, parser=XMLParser)
            root = tree.getroot()
            peerAddress = root.find(".//peer")
            peerAddress.text=self.__address
            peerPort = root.find(".//peerPort")
            peerPort.text=str(self.__peerPort)
            localPort = root.find(".//BGP4Port")
            localPort.text=str(self.__localPort)
            myAutonomousSystem = root.find(".//myAutonomousSystem")
            myAutonomousSystem.text=str(self.__asNumber)
            managePort = root.find(".//BGP4ManagementPort")
            managePort.text=str(self.__managementPort)
            tree.write(XML_FILE) #with ... as ..

            # XMLParser = etree.XMLParser(remove_blank_text=False)
            # tree = etree.parse("TMConfiguration_guillermo.xml", parser=XMLParser)
            # root = tree.getroot()
            # portConf = root.find(".//managementPort")
            # portConf.text=str(self.__portConf)
            # tree.write("TMConfiguration_guillermo.xml")
            return True

    def endBGPSpeaker(self) -> bool:
            """
            Kills java program connected to BGPLS Speaker with SIGKILL signal
            """
            LOGGER.debug("sending kill signal to process %s",self.__process.pid)
            # time.sleep(15)
            LOGGER.debug("PID: %d",self.__process.pid)
            # LOGGER.debug("Group PID: %d",os.getpgid(self.__process.pid))
            # os.killpg(os.getpgid(self.__process.pid), signal.SIGKILL)
            self.__process.kill()
            # .terminate() for SIGTERM
            return True
    
    def getRunnerInfo(self):
         return self.__address,self.__asNumber,self.__peerPort