Exemple #1
0
    def _create_snat(self, info, iptc):
        privnicname = linux.get_nic_name_by_mac(info.privateNicMac)
        if not privnicname:
            raise virtualrouter.VirtualRouterError(
                'cannot get private nic name for mac[%s]' % info.privateNicMac)
        pubnicnames = linux.get_nic_names_by_mac(info.publicNicMac)
        if not pubnicnames:
            raise virtualrouter.VirtualRouterError(
                'cannot get public nic name for mac[%s]' % info.publicNicMac)
        pubnicname = pubnicnames[0].split(':')[0]

        snat_chain_name = self.make_snat_chain_name(privnicname)
        iptc.add_rule('-A POSTROUTING -j %s' % snat_chain_name,
                      iptc.NAT_TABLE_NAME)
        iptc.add_rule(
            '-A {0} -o {1} -j SNAT --to-source {2}'.format(
                snat_chain_name, pubnicname, info.publicIp),
            iptc.NAT_TABLE_NAME)

        fwd_chain_name = self._make_forward_chain_name(privnicname)
        iptc.add_rule('-A FORWARD -i {0} -o {1} -j {2}'.format(
            pubnicname, privnicname, fwd_chain_name))
        iptc.add_rule('-A FORWARD -i {0} -o {1} -j {2}'.format(
            privnicname, pubnicname, fwd_chain_name))
        iptc.add_rule('-A FORWARD -i {0} -o {1} -j {2}'.format(
            privnicname, privnicname, fwd_chain_name))
        iptc.add_rule('-A {0} -j ACCEPT'.format(fwd_chain_name))
    def _get_nics(self):
        info = shell.ShellCmd('ip link')()
        nics = {}
        infos = info.split('\n')
        lines = []
        for i in infos:
            i = i.strip().strip('\t').strip('\r').strip('\n')
            if i == '':
                continue
            lines.append(i)

        i = 0
        while (i < len(lines)):
            l1 = lines[i]
            dev_name = l1.split(':')[1].strip()
            i += 1
            l2 = lines[i]
            mac = l2.split()[1].strip()
            i += 1
            if nics.has_key(mac):
                wrong_dev_name = nics[mac]
                err = 'two nics[%s, %s] has the same mac address[%s], this is not allowed in virtual router' % (
                    dev_name, wrong_dev_name, mac)
                raise virtualrouter.VirtualRouterError(err)

            nics[mac] = dev_name

        return nics
Exemple #3
0
    def _restart_dnsmasq(self):
        self._do_dnsmasq_restart()
        
        def check_start(_):
            dnsmasq_pid = linux.get_pid_by_process_name('dnsmasq')
            return dnsmasq_pid is not None 

        if not linux.wait_callback_success(check_start, None, 5, 0.5):
            logger.debug('dnsmasq is not running, former start failed, try to start it again ...')
            cmd = self._do_dnsmasq_start()
            
            if cmd.return_code != 0:
                raise virtualrouter.VirtualRouterError('dnsmasq in virtual router is not running, we try to start it but fail, error is %s' % cmd.stdout)

            if not linux.wait_callback_success(check_start, None, 5, 0.5):
                raise virtualrouter.VirtualRouterError('dnsmasq in virtual router is not running, "/etc/init.d/dnsmasq start" returns success, but the process is not running after 5 seconds')
Exemple #4
0
        def check_eip(table):
            if not table:
                return

            for chain in table.children:
                vip_nic = self._get_vip_nic_name_from_chain_name(chain.name)
                if vip_nic == vip_nic_name:
                    raise virtualrouter.VirtualRouterError('eip[%s] has been occupied, this is an internal error' % vip)
Exemple #5
0
    def _remove_snat(self, info, iptc):
        privnicname = linux.get_nic_name_by_mac(info.privateNicMac)
        if not privnicname:
            raise virtualrouter.VirtualRouterError('cannot get private nic name for mac[%s]' % info.privateNicMac)

        snat_chain_name = self.make_snat_chain_name(privnicname)
        iptc.delete_chain(snat_chain_name, iptc.NAT_TABLE_NAME)
        fwd_chain_name = self._make_forward_chain_name(privnicname)
        iptc.delete_chain(fwd_chain_name)
Exemple #6
0
    def _refresh_dnsmasq(self):
        dnsmasq_pid = linux.get_pid_by_process_name('dnsmasq')
        if not dnsmasq_pid:
            logger.debug('dnsmasq is not running, try to start it ...')
            output = self._do_dnsmasq_start()
            dnsmasq_pid = linux.get_pid_by_process_name('dnsmasq')
            if not dnsmasq_pid:
                raise virtualrouter.VirtualRouterError('dnsmasq in virtual router is not running, we try to start it but fail, error is %s' % output)

        shell.call('kill -1 %s' % dnsmasq_pid)
Exemple #7
0
    def _refresh_dnsmasq(self):
        dnsmasq_pid = linux.get_pid_by_process_name('dnsmasq')
        if not dnsmasq_pid:
            logger.debug('dnsmasq is not running, try to start it ...')
            output = self._do_dnsmasq_start()
            dnsmasq_pid = linux.get_pid_by_process_name('dnsmasq')
            if not dnsmasq_pid:
                raise virtualrouter.VirtualRouterError('dnsmasq in virtual router is not running, we try to start it but fail, error is %s' % output)

        if self.signal_count > self.config.init_command.restartDnsmasqAfterNumberOfSIGUSER1:
            self._restart_dnsmasq()
            self.signal_count = 0
            return

        shell.call('kill -1 %s' % dnsmasq_pid)
        self.signal_count += 1