403Webshell
Server IP : 185.208.173.17  /  Your IP : 87.236.161.98
Web Server : Microsoft-IIS/10.0
System : Windows NT SRV8576125506 10.0 build 26100 (Windows Server 2016) AMD64
User : IUSR ( 0)
PHP Version : 7.4.13
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  C:/Program Files/MySQL/MySQL Workbench 8.0/swb/shell/lib/mysqlsh/plugins/mds_plugin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : C:/Program Files/MySQL/MySQL Workbench 8.0/swb/shell/lib/mysqlsh/plugins/mds_plugin//network.py
# Copyright (c) 2021, 2025, Oracle and/or its affiliates.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is designed to work with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms, as
# designated in a particular file or component or in included license
# documentation.  The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have either included with
# the program or referenced in the documentation.
#
# This program is distributed in the hope that it will be useful,  but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
# the GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

"""Sub-Module to manage OCI Networking"""

from mysqlsh.plugin_manager import plugin_function
from mds_plugin import core, configuration

# cSpell:ignore vcns


def subnet_is_public(subnet, config):
    import oci.exceptions

    # Create VirtualNetworkClient
    virtual_network = core.get_oci_virtual_network_client(
        config=config)

    # Get Routing Table
    try:
        rt = virtual_network.get_route_table(subnet.route_table_id).data

        is_public = False
        for rr in rt.route_rules:
            if "internetgateway" in rr.network_entity_id:
                is_public = True
                break

        return is_public
    except oci.exceptions.ServiceError as e:
        if e.status == 404:
            return False


def subnet_privilege_check(subnet, config):
    # Create VirtualNetworkClient
    virtual_network = core.get_oci_virtual_network_client(
        config=config)

    try:
        subnet = virtual_network.get_subnet(subnet.id)

        return True
    except:
        return False


def network_has_subnet(network, compartment_id, config, public_subnet=None,
                       check_privileges=False):
    # Create VirtualNetworkClient
    virtual_network = core.get_oci_virtual_network_client(
        config=config)

    # Get Subnets
    subnets = virtual_network.list_subnets(
        compartment_id=compartment_id, vcn_id=network.id).data

    if public_subnet is not None:
        if public_subnet:
            subnets = [s for s in subnets
                       if subnet_is_public(subnet=s, config=config)]
        else:
            subnets = [s for s in subnets
                       if not subnet_is_public(subnet=s, config=config)]

    return len(subnets) > 0


def format_network_listing(vcns, current_network_id=None):
    import re

    out = ""

    # return compartments in READABLE text output
    i = 1
    for v in vcns:
        # Shorten to 24 chars max, remove linebreaks
        name = re.sub(r'[\n\r]', ' ',
                      v.display_name[:32] + '..'
                      if len(v.display_name) > 34
                      else v.display_name)

        # Shorten to 24 chars max, remove linebreaks
        domain_name = v.vcn_domain_name if v.vcn_domain_name else ''
        domain_name = re.sub(r'[\n\r]', ' ',
                             domain_name[:30] + '..'
                             if len(domain_name) > 32
                             else domain_name)

        index = f"*{i:>3}" if current_network_id == v.id else f"{i:>4}"
        out += f"{index} {name:34} {domain_name:32} {v.cidr_block:19} " \
            f"{v.lifecycle_state}\n"
        i += 1

    if len(vcns) == 0:
        out = "No virtual networks available in this compartment.\n"

    return out


def format_subnet_listing(subnets):
    import re

    out = ""

    i = 1
    for s in subnets:
        s_name = re.sub(r'[\n\r]', ' ',
                        s.display_name[:22] + '..'
                        if len(s.display_name) > 24
                        else s.display_name)

        availability_domain = \
            s.availability_domain if s.availability_domain else ''
        availability_domain = re.sub(r'[\n\r]', ' ',
                                     availability_domain[:22] + '..'
                                     if len(availability_domain) > 24
                                     else availability_domain)

        domain_name = s.subnet_domain_name if s.subnet_domain_name else ''
        domain_name = re.sub(r'[\n\r]', ' ',
                             domain_name[:42] + '..'
                             if len(domain_name) > 44
                             else domain_name)

        out += f"{i:>4} {s_name:24} {s.cidr_block:19} {availability_domain:24} "
        out += f"{domain_name:44}\n"
        i += 1

    if len(subnets) == 0:
        out = "No subnets available in this virtual network.\n"

    return out


def format_load_balancer_listing(items, current=None) -> str:
    """Formats a given list of objects in a human readable form

    Args:
        items: Either a list of objects or a single object
        current (str): OCID of the current item

    Returns:
       The db_systems formatted as str
    """

    # If a single db_system was given, wrap it in a list
    if not type(items) is list:
        items = [items]

    # return objects in READABLE text output
    out = ""
    id = 1
    for i in items:
        index = f"*{id:>3} " if current == i.id else f"{id:>4} "
        ips = ""
        for ip in i.ip_addresses:
            ips += ip.ip_address + "*, " if ip.is_public else ", "
        if len(ips) > 2:
            ips = ips[0:-2]
        out += (index +
                core.fixed_len(i.display_name, 24, ' ', True) +
                core.fixed_len(i.lifecycle_state, 8, ' ') +
                core.fixed_len(f"{ips}", 24, '\n'))
        id += 1

    return out


@plugin_function('mds.list.networks', shell=True, cli=False, web=True)
def list_networks(**kwargs):
    """Lists all networks of the given compartment

    Args:
        **kwargs: Additional options

    Keyword Args:
        public_subnet (bool): Whether only public or private subnets should be
            considered
        compartment_id (str): OCID of the parent compartment.
        config (object): An OCI config object or None.
        config_profile (str): The name of an OCI config profile
        return_formatted (bool): If set to true, a list object is returned.
        check_privileges (bool): Checks if the user has privileges for the
            subnet

    Returns:
        a network object
    """
    public_subnet = kwargs.get("public_subnet")
    compartment_id = kwargs.get("compartment_id")
    config = kwargs.get("config")
    config_profile = kwargs.get("config_profile")
    return_formatted = kwargs.get("return_formatted", True)
    check_privileges = kwargs.get("check_privileges", False)

    # Get the active config and compartment
    try:
        config = configuration.get_current_config(
            config=config, config_profile=config_profile)
        compartment_id = configuration.get_current_compartment_id(
            compartment_id=compartment_id, config=config)

        import oci.exceptions

        # Create VirtualNetworkClient
        virtual_network = core.get_oci_virtual_network_client(
            config=config)

        # List the virtual networks
        vcns = virtual_network.list_vcns(
            compartment_id=compartment_id).data

        # Filter out all sub-nets that are not conforming to the
        # public_subnet options
        if public_subnet is not None:
            # Loop over VCNs to see if access is granted
            good_vcns = []
            for vcn in vcns:
                try:
                    if network_has_subnet(
                            network=vcn, compartment_id=compartment_id,
                            config=config,
                            public_subnet=public_subnet,
                            check_privileges=check_privileges):
                        good_vcns.append(vcn)
                except oci.exceptions.ServiceError as e:
                    pass
            vcns = good_vcns

        if return_formatted:
            return format_network_listing(vcns)
        else:
            return oci.util.to_dict(vcns)

    except ValueError as e:
        print(f"ERROR: {str(e)}")
        return


@plugin_function('mds.get.network')
def get_network(**kwargs):
    """Returns a network object

    If multiple or no networks are available in the current compartment,
    let the user select a different compartment

    Args:
        **kwargs: Additional options

    Keyword Args:
        network_name (str): The display_name of the network
        network_id (str): The OCID of the network
        public_subnet (bool): Whether only public or private subnets should be
            considered
        compartment_id (str): OCID of the parent compartment.
        config (object): An OCI config object or None.
        interactive (bool): Whether to query the user for input
        ignore_current (bool): Whether to ignore the current

    Returns:
        a network object
    """
    network_name = kwargs.get("network_name")
    network_id = kwargs.get("network_id")
    public_subnet = kwargs.get("public_subnet")
    compartment_id = kwargs.get("compartment_id")
    config = kwargs.get("config")
    interactive = kwargs.get("interactive", True)
    ignore_current = kwargs.get("ignore_current", False)

    # Get the active config and compartment
    try:
        config = configuration.get_current_config(config=config)
        compartment_id = configuration.get_current_compartment_id(
            compartment_id=compartment_id, config=config)

        import oci.exceptions
        from mds_plugin import compartment

        # Create VirtualNetworkClient
        virtual_network = core.get_oci_virtual_network_client(
            config=config)

        # If a specific network was specified, return this network
        if network_id:
            vcn = virtual_network.get_vcn(vcn_id=network_id).data
            return vcn

        # Loop until the user selected a compartment with vcns
        vcns = []
        rejected_vcns = []
        while len(vcns) == 0:
            try:
                # List the virtual networks, filter by network_name if given
                vcns = virtual_network.list_vcns(
                    compartment_id=compartment_id,
                    display_name=network_name).data
                # Filter out rejected VCNs
                vcns = [n for n in vcns if n not in rejected_vcns]
                if len(vcns) == 0:
                    network_comp = compartment.get_compartment_by_id(
                        compartment_id=compartment_id, config=config)
                    print(f"The compartment {network_comp.name} does not "
                          "contain a suitable virtual network.")
                    if interactive:
                        print("Please select another compartment.\n")
                    else:
                        return

                    compartment_id = compartment.get_compartment_id(
                        parent_compartment_id=compartment_id, config=config)

                    if compartment_id == None:
                        print("Operation cancelled.")
                        return
                else:
                    # Filter out all sub-nets that are not conforming to the
                    # public_subnet options
                    if public_subnet is not None:
                        # Loop over VCNs to see if access is granted
                        good_vcns = []
                        for vcn in vcns:
                            newly_rejected_vcns = []
                            try:
                                if network_has_subnet(
                                        network=vcn,
                                        compartment_id=compartment_id,
                                        config=config,
                                        public_subnet=public_subnet):
                                    good_vcns.append(vcn)
                                else:
                                    newly_rejected_vcns.append(vcn)
                            except oci.exceptions.ServiceError as e:
                                if e.status == 404:
                                    newly_rejected_vcns.append(vcn)

                        rejected_vcns = rejected_vcns + newly_rejected_vcns
                        vcns = good_vcns

            except oci.exceptions.ServiceError as e:
                if e.code == "NotAuthorizedOrNotFound":
                    print(f'You do not have privileges to list the '
                          f'networks of this compartment.')
                else:
                    print(f'Could not list networks of compartment '
                          f'{network_comp.name}\n')
                print(
                    f'ERROR: {e.message}. (Code: {e.code}; '
                    f'Status: {e.status})')
                vcns = []
            except (ValueError, oci.exceptions.ClientError) as e:
                print(f'ERROR: {e}')
                vcns = []

        # If there is a single network in this compartment, return this
        # one if it matches the network_name (if given)
        if len(vcns) == 1 and not ignore_current:
            return vcns[0]

        if not interactive:
            print("Error: There are multiple virtual networks in this "
                  "compartment.")
            return

        # Let the user choose from the list
        vcn = core.prompt_for_list_item(
            item_list=vcns, prompt_caption=("Please enter the name or index "
                                            "of the virtual network: "),
            item_name_property="display_name",
            print_list=True)

        return vcn

    except oci.exceptions.ServiceError as e:
        if e.code == "NotAuthorizedOrNotFound":
            print(f'You do not have privileges to access this network.')
        else:
            print(f'Could not get the network.')
        print(
            f'ERROR: {e.message}. (Code: {e.code}; '
            f'Status: {e.status})')
    except (ValueError, oci.exceptions.ClientError) as e:
        print(f'ERROR: {e}')


@plugin_function('mds.list.subnets', shell=True, cli=False, web=True)
def list_subnets(**kwargs):
    """Lists all subnets of the given network

    Args:
        **kwargs: Additional options

    Keyword Args:
        network_id (str): The OCID of the parent network_id
        public_subnet (bool): Whether only public subnets should be considered
        availability_domain (str): The name if the availability_domain
        ignore_current_network (bool): Whether to ignore the current network
        compartment_id (str): OCID of the parent compartment.
        config (object): An OCI config object or None.
        config_profile (str): The name of an OCI config profile
        interactive (bool): Whether to query the user for input
        return_formatted (bool): If set to true, a list object is returned.

    Returns:
        A list of subnets
    """

    network_id = kwargs.get("network_id")
    public_subnet = kwargs.get("public_subnet")
    # availability_domain = kwargs.get("availability_domain")
    ignore_current_network = kwargs.get("ignore_current_network")
    compartment_id = kwargs.get("compartment_id")
    config = kwargs.get("config")
    config_profile = kwargs.get("config_profile")
    interactive = kwargs.get("interactive", True)
    return_formatted = kwargs.get("return_formatted", True)

    # Get the active config and compartment
    try:
        config = configuration.get_current_config(
            config=config, config_profile=config_profile)
        # compartment_id = configuration.get_current_compartment_id(
        #     compartment_id=compartment_id, config=config)
        if not ignore_current_network:
            network_id = configuration.get_current_network_id(
                network_id=network_id, config=config)

        import oci.exceptions
        from mds_plugin import compartment

        # Create VirtualNetworkClient
        virtual_network = core.get_oci_virtual_network_client(
            config=config)

        # If a subnet_id was given, return the subnet of that subnet_id
        # if subnet_id is not None:
        #     try:
        #         return virtual_network.get_subnet(subnet_id=subnet_id).data
        #     except oci.exceptions.ServiceError as e:
        #         print(f'ERROR: {e.message}. (Code: {e.code}; Status: {e.status})')
        #         return
        #     except (ValueError, oci.exceptions.ClientError) as e:
        #         print(f'ERROR: {e}')
        #         return

        network = get_network(network_id=network_id,
                              compartment_id=compartment_id, config=config,
                              public_subnet=public_subnet, interactive=interactive)
        if network is None:
            return
        network_name = network.display_name if network.display_name else \
            network.id
        network_compartment = network.compartment_id

        # Get the compartment
        compartment = compartment.get_compartment_by_id(
            compartment_id=network_compartment, config=config)
        if compartment is None:
            return

        # If no availability_domain was specified, use a random one
        # if availability_domain is None:
        #     availability_domain = compartment.get_availability_domain(
        #         compartment_id=compartment_id,
        #         availability_domain=availability_domain, config=config)

        subnets = virtual_network.list_subnets(
            compartment_id=network_compartment, vcn_id=network.id).data

        # Filter subnets by Availability Domain, None means the subnet
        # spans across all Availability Domains
        # subnets = [s for s in subnets
        #            if s.availability_domain == availability_domain or
        #            s.availability_domain is None]

        # Filter out all sub-nets that are not conforming to the
        # public_subnet options
        if public_subnet is not None and public_subnet:
            out = "All public "
            subnets = [s for s in subnets
                       if subnet_is_public(subnet=s, config=config)]
        elif public_subnet is not None and not public_subnet:
            out = "All private "
            subnets = [s for s in subnets
                       if not subnet_is_public(subnet=s, config=config)]
        else:
            out = "All "

        out += f"subnets of Network '{network_name}' in compartment " + \
            f"'{compartment.name}':\n\n"

        if return_formatted:
            return out + format_subnet_listing(subnets)
        else:
            return oci.util.to_dict(subnets)

    except oci.exceptions.ServiceError as e:
        print(f'ERROR: {e.message}. (Code: {e.code}; Status: {e.status})')
        return
    except (ValueError, oci.exceptions.ClientError) as e:
        print(f'ERROR: {e}')
        return


@plugin_function('mds.get.subnet')
def get_subnet(**kwargs):
    """Returns a subnet object

    If multiple or no networks are available in the current compartment,
    let the user select a different compartment

    Args:
        **kwargs: Additional options

    Keyword Args:
        subnet_name (str): The display_name of the subnet
        subnet_id (str): The OCID of the subnet
        network_id (str): The OCID of the parent network_id
        public_subnet (bool): Whether only public subnets should be considered
        availability_domain (str): The name if the availability_domain
        compartment_id (str): OCID of the parent compartment.
        config (object): An OCI config object or None.
        interactive (bool): Whether to query the user for input

    Returns:
        a subnet object
    """

    subnet_name = kwargs.get("subnet_name")
    subnet_id = kwargs.get("subnet_id")
    network_id = kwargs.get("network_id")
    public_subnet = kwargs.get("public_subnet")
    availability_domain = kwargs.get("availability_domain")
    compartment_id = kwargs.get("compartment_id")
    config = kwargs.get("config")
    interactive = kwargs.get("interactive", True)

    # Get the active config and compartment
    try:
        config = configuration.get_current_config(config=config)
        compartment_id = configuration.get_current_compartment_id(
            compartment_id=compartment_id, config=config)
        network_id = configuration.get_current_network_id(
            network_id=network_id, config=config)
    except ValueError as e:
        print(f"ERROR: {str(e)}")
        return

    import oci.exceptions
    from mds_plugin import compartment
    import re

    # Create VirtualNetworkClient
    virtual_network = core.get_oci_virtual_network_client(
        config=config)

    # If a subnet_id was given, return the subnet of that subnet_id
    if subnet_id:
        try:
            return virtual_network.get_subnet(subnet_id=subnet_id).data
        except oci.exceptions.ServiceError as e:
            print(f'ERROR: {e.message}. (Code: {e.code}; Status: {e.status})')
            return
        except (ValueError, oci.exceptions.ClientError) as e:
            print(f'ERROR: {e}')
            return

    # If no network_id was given, query the user for one
    network = get_network(
        network_id=network_id,
        compartment_id=compartment_id, config=config,
        public_subnet=public_subnet, interactive=interactive)
    if network is None:
        return
    network_id = network.id
    compartment_id = network.compartment_id

    # If no availability_domain was specified, use a random one
    if availability_domain is None:
        availability_domain_obj = compartment.get_availability_domain(
            compartment_id=compartment_id,
            random_selection=True,
            availability_domain=availability_domain, config=config,
            interactive=False, return_python_object=True)
        availability_domain = availability_domain_obj.name

    try:
        subnets = virtual_network.list_subnets(
            compartment_id=compartment_id, vcn_id=network_id).data

        # Filter subnets by Availability Domain, None means the subnet
        # spans across all Availability Domains
        subnets = [s for s in subnets
                   if s.availability_domain == availability_domain or
                   s.availability_domain is None]

        # Filter out all sub-nets that are not conforming to the
        # public_subnet options
        if public_subnet:
            subnets = [s for s in subnets
                       if subnet_is_public(subnet=s, config=config)]
        elif public_subnet is not None and not public_subnet:
            subnets = [s for s in subnets
                       if not subnet_is_public(subnet=s, config=config)]

        # If there are several subnets, let the user choose
        if len(subnets) == 0:
            return
        elif len(subnets) == 1:
            # If there is exactly 1 subnet, return that
            return subnets[0]

        print("\nPlease choose a subnet:\n")
        i = 1
        for s in subnets:
            s_name = re.sub(r'[\n\r]', ' ',
                            s.display_name[:22] + '..'
                            if len(s.display_name) > 24
                            else s.display_name)
            print(f"{i:>4} {s_name:24} {s.cidr_block:15}")
            i += 1
        print()

        return core.prompt_for_list_item(
            item_list=subnets, prompt_caption=(
                "Please enter the name or index of the subnet: "),
            item_name_property="display_name",
            given_value=subnet_name)

    except oci.exceptions.ServiceError as e:
        print(f'ERROR: {e.message}. (Code: {e.code}; Status: {e.status})')
        return
    except Exception as e:
        print(f'ERROR: {e}')
        return


@plugin_function('mds.list.loadBalancers', shell=True, cli=False, web=True)
def list_load_balancers(**kwargs):
    """Lists load balancers

    This function will list all load balancers of the compartment with the
    given compartment_id.

    Args:
        **kwargs: Optional parameters

    Keyword Args:
        compartment_id (str): OCID of the parent compartment
        config (dict): An OCI config object or None
        config_profile (str): The name of an OCI config profile
        interactive (bool): Indicates whether to execute in interactive mode
        return_type (str): "STR" will return a formatted string, "DICT" will
            return the object converted to a dict structure and "OBJ" will
            return the OCI Python object for internal plugin usage
        raise_exceptions (bool): If set to true exceptions are raised

    Returns:
        Based on return_type
    """

    compartment_id = kwargs.get("compartment_id")
    config = kwargs.get("config")
    config_profile = kwargs.get("config_profile")

    interactive = kwargs.get("interactive", core.get_interactive_default())
    return_type = kwargs.get(
        "return_type",  # In interactive mode, default to formatted str return
        core.RETURN_STR if interactive else core.RETURN_DICT)
    raise_exceptions = kwargs.get(
        "raise_exceptions",  # On internal call (RETURN_OBJ), raise exceptions
        True if return_type == core.RETURN_OBJ else not interactive)

    try:
        config = configuration.get_current_config(
            config=config, config_profile=config_profile,
            interactive=interactive)
        compartment_id = configuration.get_current_compartment_id(
            compartment_id=compartment_id, config=config)

        import oci.exceptions
        try:
            # Initialize the  Object Store client
            load_balancer_cl = core.get_oci_load_balancer_client(config=config)

            # List the load balancers
            load_balancers = load_balancer_cl.list_load_balancers(
                compartment_id=compartment_id).data

            # Filter out all deleted items
            load_balancers = [
                l for l in load_balancers if l.lifecycle_state != "DELETED"]

            return core.oci_object(
                oci_object=load_balancers,
                return_type=return_type,
                format_function=format_load_balancer_listing)
        except oci.exceptions.ServiceError as e:
            if raise_exceptions:
                raise
            print(f'ERROR: {e.message}. (Code: {e.code}; Status: {e.status})')
    except Exception as e:
        if raise_exceptions:
            raise
        print(f'ERROR: {e}')

Youez - 2016 - github.com/yon3zu
LinuXploit