Пример #1
0
def main():
    if len(sys.argv) != 3:
        print("Usage: %s [ifname] [up|down]" % sys.argv[0])
        sys.exit(-1)

    change = 0
    flags = 0
    if sys.argv[2].lower() == "up":
        change |= ifh.IFF_UP
        flags |= ifh.IFF_UP
    elif sys.argv[2].lower() == "down":
        change |= ifh.IFF_UP
        flags &= ~ifh.IFF_UP
    else:
        print("%s is not `up' nor 'down'" % sys.argv[2], file=sys.stderr)
        sys.exit(-1)

    nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE)
    nlh.nlmsg_type = rtnl.RTM_NEWLINK
    nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_ACK
    seq = int(time.time())
    nlh.nlmsg_seq = seq
    ifm = nlh.put_extra_header_as(rtnl.Ifinfomsg)
    ifm.ifi_family = socket.AF_UNSPEC
    ifm.ifi_change = change
    ifm.ifi_flags = flags

    nlh.put_str(if_link.IFLA_IFNAME, sys.argv[1])

    with mnl.Socket(netlink.NETLINK_ROUTE) as nl:
        nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
        portid = nl.get_portid()

        nlh.fprint(rtnl.Ifinfomsg.csize(), out=sys.stdout)

        try:
            nl.send_nlmsg(nlh)
        except Exception as e:
            print("mnl_socket_sendto: %s" % e, file=sys.stderr)
            raise
        try:
            buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE)
        except Exception as e:
            print("mnl_socket_recvfrom: %s" % e, file=sys.stderr)
            raise

        # cb_run will raise OSException in case of error
        try:
            mnl.cb_run(buf, seq, portid, None, None)
        except Exception as e:
            print("mnl_cb_run: %s" % e, file=sys.stderr)
            raise
Пример #2
0
def nursfd_cb(fd, when, producer):
    buf = bytearray(mnl.MNL_SOCKET_BUFFER_SIZE)
    ret = fd.recv_into(buf)
    ret = mnl.cb_run(buf[:ret], 0, 0, data_cb, producer)
    if ret == mnl.MNL_CB_OK:
        return nurs.NURS_RET_OK
    return nurs.NURS_RET_ERROR
Пример #3
0
def main():
    if len(sys.argv) != 2:
        print("Usage: %s [queue_num]" % sys.argv[0])
        sys.exit(-1)
    qnum = int(sys.argv[1])
    buf = bytearray(mnl.MNL_SOCKET_BUFFER_SIZE)

    with mnl.Socket(netlink.NETLINK_NETFILTER) as nl:
        nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
        portid = nl.get_portid()

        nlh = nflog_build_cfg_pf_request(buf, nfulnl.NFULNL_CFG_CMD_PF_UNBIND)
        nl.send_nlmsg(nlh)

        nlh = nflog_build_cfg_pf_request(buf, nfulnl.NFULNL_CFG_CMD_PF_BIND)
        nl.send_nlmsg(nlh)

        nlh = nflog_build_cfg_request(buf, nfulnl.NFULNL_CFG_CMD_BIND, qnum)
        nl.send_nlmsg(nlh)

        nlh = nflog_build_cfg_params(buf, nfulnl.NFULNL_COPY_PACKET, 0xFFFF, qnum)
        nl.send_nlmsg(nlh)

        ret = mnl.MNL_CB_OK
        while ret >= mnl.MNL_CB_STOP:
            try:
                nrecv = nl.recv_into(buf)
                if nrecv == 0: break
                ret = mnl.cb_run(buf[:nrecv], 0, portid, log_cb, None)
            except Exception as e:
                raise
Пример #4
0
def main():
    if len(sys.argv) > 2:
        print("%s [family name]" % sys.argv[0])
        sys.exit(-1)

    nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE)
    nlh.nlmsg_type = genl.GENL_ID_CTRL
    nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_ACK
    seq = int(time.time())
    nlh.nlmsg_seq = seq

    genlh = nlh.put_extra_header_as(genl.Genlmsghdr)
    genlh.cmd = genl.CTRL_CMD_GETFAMILY
    genlh.version = 1

    nlh.put_u32(genl.CTRL_ATTR_FAMILY_ID, genl.GENL_ID_CTRL)
    if len(sys.argv) >= 2:
        nlh.put_strz(genl.CTRL_ATTR_FAMILY_NAME, sys.argv[1])
    else:
        nlh.nlmsg_flags |= netlink.NLM_F_DUMP

    with mnl.Socket(netlink.NETLINK_GENERIC) as nl:
        nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
        portid = nl.get_portid()
        nl.send_nlmsg(nlh)

        ret = mnl.MNL_CB_OK
        while ret > mnl.MNL_CB_STOP:
            try:
                buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE)
                ret = mnl.cb_run(buf, seq, portid, data_cb, None)
            except Exception as e:
                raise
Пример #5
0
def main():
    nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE)
    nlh.nlmsg_type = (nfnl.NFNL_SUBSYS_CTNETLINK << 8) | nfnlct.IPCTNL_MSG_CT_GET
    nlh.nlmsg_flags = netlink.NLM_F_REQUEST|netlink.NLM_F_DUMP
    seq = int(time.time())
    nlh.nlmsg_seq = seq

    nfh = nlh.put_extra_header_as(nfnl.Nfgenmsg)
    nfh.nfgen_family = socket.AF_INET
    nfh.version = nfnl.NFNETLINK_V0
    nfh.res_id = 0

    with mnl.Socket(netlink.NETLINK_NETFILTER) as nl:
        nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
        nl.send_nlmsg(nlh)
        portid = nl.get_portid()

        ret = mnl.MNL_CB_OK
        while ret > mnl.MNL_CB_STOP:
            try:
                buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE)
                if len(buf) == 0: break
            except Exception as e:
                print("mnl_socket_recvfrom: %s" % e, file=sys.stderr)
                raise
            try:
                ret = mnl.cb_run(buf, seq, portid, data_cb, None)
            except Exception as e:
                print("mnl_cb_run: %s" % e, file=sys.stderr)
                raise
Пример #6
0
def main():
    nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE)
    nlh.nlmsg_type = rtnl.RTM_GETLINK
    nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_DUMP
    seq = int(time.time())
    nlh.nlmsg_seq = seq
    rt = nlh.put_extra_header_as(rtnl.Rtgenmsg)
    rt.rtgen_family = socket.AF_PACKET

    with mnl.Socket(netlink.NETLINK_ROUTE) as nl:
        nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
        portid = nl.get_portid()
        nl.send_nlmsg(nlh)

        ret = mnl.MNL_CB_OK
        while ret > mnl.MNL_CB_STOP:
            try:
                buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE)
            except Exception as e:
                print("mnl_socket_recvfrom: %s" % e, file=sys.stderr)
                raise
            if len(buf) == 0: break
            try:
                ret = mnl.cb_run(buf, nlh.nlmsg_seq, portid, data_cb, None)
            except Exception as e:
                print("mnl_cb_run: %s" % e, file=sys.stderr)
                raise
Пример #7
0
def main():
    if len(sys.argv) != 2:
        print("Usage: %s <inet|inet6>" % sys.argv[0])
        sys.exit(-1)

    nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE)
    nlh.nlmsg_type = rtnl.RTM_GETROUTE
    nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_DUMP
    seq = int(time.time())
    nlh.nlmsg_seq = seq
    rtm = nlh.put_extra_header_as(rtnl.Rtmsg)

    if sys.argv[1] == "inet":
        rtm.rtm_family = socket.AF_INET
    elif sys.argv[1] == "inet6":
        rtm.rtm_family = socket.AF_INET6

    with mnl.Socket(netlink.NETLINK_ROUTE) as nl:
        nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
        portid = nl.get_portid()
        nl.send_nlmsg(nlh)

        ret = mnl.MNL_CB_OK
        while ret > mnl.MNL_CB_STOP:
            try:
                buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE)
            except Exception as e:
                print("mnl_socket_recvfrom: %s" % e, file=sys.stderr)
                raise
            if len(buf) == 0: break
            try:
                ret = mnl.cb_run(buf, seq, portid, data_cb, None)
            except Exception as e:
                print("mnl_cb_run: %s" % e, file=sys.stderr)
                raise
Пример #8
0
def nfq_send_accept(queue_num, qid):
    global nl

    buf = bytearray(mnl.MNL_SOCKET_BUFFER_SIZE)
    nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_VERDICT, queue_num)
    nlh.nlmsg_flags |= netlink.NLM_F_ACK
    nfq.nlmsg_verdict_put(nlh, qid, nf.NF_ACCEPT)

    nl.send_nlmsg(nlh)
    nrecv = nl.recv_into(buf)
    return mnl.cb_run(buf[:nrecv], 0, 0, None, None)
Пример #9
0
def main():
    frame_size = 16384
    with mnl.Socket(netlink.NETLINK_ROUTE) as nl:
        nl.set_ringopt(mnl.MNL_RING_RX, mnl.MNL_SOCKET_BUFFER_SIZE * 16, 64,
                       frame_size, int(64 * mnl.MNL_SOCKET_BUFFER_SIZE * 16 / frame_size))
        nl.set_ringopt(mnl.MNL_RING_TX, mnl.MNL_SOCKET_BUFFER_SIZE * 16, 64,
                       frame_size, int(64 * mnl.MNL_SOCKET_BUFFER_SIZE * 16 / frame_size))
        nl.map_ring(mmap.MAP_SHARED)
        txring = nl.get_ring(mnl.MNL_RING_TX)
        frame = txring.current_frame()
        buf = mnl.MNL_FRAME_PAYLOAD(frame, frame_size)

        nlh = mnl.nlmsg_put_header(buf, mnl.Nlmsg)
        nlh.nlmsg_type = rtnl.RTM_GETLINK
        nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_DUMP
        seq = int(time.time())
        nlh.nlmsg_seq = seq
        rt = nlh.put_extra_header_as(rtnl.Rtgenmsg)
        rt.rtm_family = socket.AF_PACKET

        frame.nm_len = nlh.nlmsg_len
        frame.nm_status = netlink.NL_MMAP_STATUS_VALID

        nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
        portid = nl.get_portid()

        # ??? commit a8866ff6a5bce7d0ec465a63bc482a85c09b0d39
        # nl.sendto(None)
        nl.send_nlmsg(nlh)
        txring.advance()

        rxring = nl.get_ring(mnl.MNL_RING_RX)
        ret = mnl.MNL_CB_OK
        while ret > mnl.MNL_CB_STOP:
            # XXX: no try / except
            mnl_socket_poll(nl)
            frame = rxring.current_frame()
            if frame.nm_status == netlink.NL_MMAP_STATUS_VALID:
                buf = mnl.MNL_FRAME_PAYLOAD(frame, frame.nm_len)
            elif frame.nm_status == netlink.NL_MMAP_STATUS_COPY:
                buf = nl.recv(frame_size * 2)
            else:
                frame.nm_status = netlink.NL_MMAP_STATUS_UNUSED
                rxring.advance()
                continue

            try:
                ret = mnl.cb_run(buf, seq, portid, data_cb, None)
            except Exception as e:
                print("mnl_cb_run: %s" % e, file=sys.stderr)
                raise
            frame.nm_status = netlink.NL_MMAP_STATUS_UNUSED
            rxring.advance()
Пример #10
0
def nfq_send_repeat(queue_num, qid, mark, payload):
    global nl

    buf = bytearray(mnl.MNL_SOCKET_BUFFER_SIZE + len(payload))
    nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_VERDICT, queue_num)
    nlh.nlmsg_flags |= netlink.NLM_F_ACK
    nfq.nlmsg_verdict_put(nlh, qid, nf.NF_REPEAT)

    nlh.put_u32(nfqnl.NFQA_MARK, socket.htonl(mark));
    nlh.put(nfqnl.NFQA_PAYLOAD, payload)
    nl.send_nlmsg(nlh)
    nrecv = nl.recv_into(buf)
    return mnl.cb_run(buf[:nrecv], 0, 0, None, None)
Пример #11
0
def main():
    with mnl.Socket(netlink.NETLINK_ROUTE) as nl:
        nl.bind(rtnl.RTMGRP_LINK, mnl.MNL_SOCKET_AUTOPID)
        ret = mnl.MNL_CB_OK
        while ret > mnl.MNL_CB_STOP:
            try:
                buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE)
            except Exception as e:
                print("mnl_socket_recvfrom: %s" % e, file=sys.stderr)
                raise
            if len(buf) == 0: break
            try:
                ret = mnl.cb_run(buf, 0, 0, data_cb, None)
            except Exception as e:
                print("mnl_cb_run: %s" % e, file=sys.stderr)
                raise
Пример #12
0
def main():
    if len(sys.argv) != 2:
        print("Usage: %s [queue_num]" % sys.argv[0])
        sys.exit(-1)

    queue_num = int(sys.argv[1])

    with mnl.Socket(netlink.NETLINK_NETFILTER) as nl:
        nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
        portid = nl.get_portid()

        buf = bytearray(mnl.MNL_SOCKET_BUFFER_SIZE)

        nlh = nfq_build_cfg_pf_request(buf, nfqnl.NFQNL_CFG_CMD_PF_UNBIND)
        nl.send_nlmsg(nlh)

        nlh = nfq_build_cfg_pf_request(buf, nfqnl.NFQNL_CFG_CMD_PF_BIND)
        nl.send_nlmsg(nlh)

        nlh = nfq_build_cfg_request(buf, nfqnl.NFQNL_CFG_CMD_BIND, queue_num)
        nl.send_nlmsg(nlh)

        nlh = nfq_build_cfg_params(buf, nfqnl.NFQNL_COPY_PACKET, 0xFFFF, queue_num)
        nl.send_nlmsg(nlh)

        ret = mnl.MNL_CB_OK
        while ret > mnl.MNL_CB_STOP:
            try:
                nrecv = nl.recv_into(buf)
                if nrecv == 0: break
            except Exception as e:
                print("mnl_socket_recvfrom: %s" % e, file=sys.stderr)
                raise

            try:
                ret = mnl.cb_run(buf[:nrecv], 0, portid, queue_cb, None)
            except Exception as e:
                print("mnl_cb_run: %s" % e, file=sys.stderr)
                raise

            packet_id = ret - mnl.MNL_CB_OK
            nlh = nfq_build_verdict(buf, packet_id, queue_num, nf.NF_ACCEPT)
            try:
                nl.send_nlmsg(nlh)
            except Exception as e:
                print("mnl_socket_sendto: %s" % e, file=sys.stderr)
Пример #13
0
def main():
    if len(sys.argv) != 2:
        print("%s [group]" % sys.argv[0])
        sys.exit(-1)

    global group
    group = int(sys.argv[1])

    with mnl.Socket(netlink.NETLINK_GENERIC) as nl:
        nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
        nl.setsockopt(netlink.NETLINK_ADD_MEMBERSHIP, struct.pack("i", group))

        ret = mnl.MNL_CB_OK
        while ret > mnl.MNL_CB_STOP:
            try:
                buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE)
                ret = mnl.cb_run(buf, 0, 0, data_cb, None)
            except Exception as e:
                raise
Пример #14
0
def main():
    with mnl.Socket(netlink.NETLINK_NETFILTER) as nl:
        nl.bind(nfnlcm.NF_NETLINK_CONNTRACK_NEW | \
                    nfnlcm.NF_NETLINK_CONNTRACK_UPDATE | \
                    nfnlcm.NF_NETLINK_CONNTRACK_DESTROY,
                mnl.MNL_SOCKET_AUTOPID)

        ret = mnl.MNL_CB_OK
        while ret >= mnl.MNL_CB_STOP:
            try:
                buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE)
                if len(buf) == 0: break
            except Exception as e:
                print("mnl_socket_recvfrom: %s" % e, file=sys.stderr)
                raise
            try:
                ret = mnl.cb_run(buf, 0, 0, data_cb, None)
            except Exception as e:
                print("mnl_cb_run: %s" % e, file=sys.stderr)
                raise
Пример #15
0
def main():
    if len(sys.argv) != 2:
        print("Usage: %s [queue_num]" % sys.argv[0])
        sys.exit(-1)

    queue_num = int(sys.argv[1])

    nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
    portid = nl.get_portid()

    buf = bytearray(0xffff + (mnl.MNL_SOCKET_BUFFER_SIZE / 2))

    # PF_(UN)BIND is not needed with kernels 3.8 and later
    nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, 0)
    nfq.nlmsg_cfg_put_cmd(nlh, socket.AF_INET, nfqnl.NFQNL_CFG_CMD_PF_UNBIND)
    nl.send_nlmsg(nlh)

    nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, 0)
    nfq.nlmsg_cfg_put_cmd(nlh, socket.AF_INET, nfqnl.NFQNL_CFG_CMD_PF_BIND)
    nl.send_nlmsg(nlh)

    nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, queue_num)
    nfq.nlmsg_cfg_put_cmd(nlh, socket.AF_INET, nfqnl.NFQNL_CFG_CMD_BIND)
    nl.send_nlmsg(nlh)

    nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, queue_num)
    nfq.nlmsg_cfg_put_params(nlh, nfqnl.NFQNL_COPY_PACKET, 0xffff)
    nlh.put_u32(nfqnl.NFQA_CFG_FLAGS, socket.htonl(nfqnl.NFQA_CFG_F_GSO))
    nlh.put_u32(nfqnl.NFQA_CFG_MASK, socket.htonl(nfqnl.NFQA_CFG_F_GSO))
    nl.send_nlmsg(nlh)

    # ENOBUFS is signalled to userspace when packets were lost
    # on kernel side.  In most cases, userspace isn't interested
    # in this information, so turn it off.
    nl.setsockopt(netlink.NETLINK_NO_ENOBUFS, bytearray([1]))

    while True:
        ret = nl.recv_into(buf)
        ret = mnl.cb_run(buf[:ret], 0, portid, queue_cb, None)

    nl.close()
Пример #16
0
def main():
    if len(sys.argv) != 2:
        print("Usage: %s [queue_num]" % sys.argv[0])
        sys.exit(-1)

    queue_num = int(sys.argv[1])

    nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
    portid = nl.get_portid()

    buf = bytearray(0xffff + (mnl.MNL_SOCKET_BUFFER_SIZE / 2))

    # PF_(UN)BIND is not needed with kernels 3.8 and later
    nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, 0)
    nfq.nlmsg_cfg_put_cmd(nlh, socket.AF_INET, nfqnl.NFQNL_CFG_CMD_PF_UNBIND)
    nl.send_nlmsg(nlh)

    nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, 0)
    nfq.nlmsg_cfg_put_cmd(nlh, socket.AF_INET, nfqnl.NFQNL_CFG_CMD_PF_BIND)
    nl.send_nlmsg(nlh)

    nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, queue_num)
    nfq.nlmsg_cfg_put_cmd(nlh, socket.AF_INET, nfqnl.NFQNL_CFG_CMD_BIND)
    nl.send_nlmsg(nlh)

    nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, queue_num)
    nfq.nlmsg_cfg_put_params(nlh, nfqnl.NFQNL_COPY_PACKET, 0xffff)
    nlh.put_u32(nfqnl.NFQA_CFG_FLAGS, socket.htonl(nfqnl.NFQA_CFG_F_GSO))
    nlh.put_u32(nfqnl.NFQA_CFG_MASK, socket.htonl(nfqnl.NFQA_CFG_F_GSO))
    nl.send_nlmsg(nlh)

    # ENOBUFS is signalled to userspace when packets were lost
    # on kernel side.  In most cases, userspace isn't interested
    # in this information, so turn it off.
    nl.setsockopt(netlink.NETLINK_NO_ENOBUFS, bytearray([1]))

    while True:
        ret = nl.recv_into(buf)
        ret = mnl.cb_run(buf[:ret], 0, portid, queue_cb, None)

    nl.close()
Пример #17
0
def handle(nl):
    try:
        buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE)
    except OSError as e:
        if e.errno == ENOBUFS:
            print("The daemon has hit ENOBUFS, you can " \
                      + "increase the size of your receiver " \
                      + "buffer to mitigate this or enable " \
                      + "reliable delivery.",
                  file=sys.stderr)
        else:
            print("mnl_socket_recvfrom: %s" % e)
        return -1

    try:
        ret = mnl.cb_run(buf, 0, 0, data_cb, None)
    except OSError as e:
        print("mnl_cb_run: %s" % e, file=sys.stderr)
        return -1

    return ret
Пример #18
0
def main():
    if len(sys.argv) <= 3:
        print("Usage: %s iface destination cidr [gateway]" % sys.argv[0])
        print("Example: %s eth0 10.0.1.12 32 10.0.1.11" % sys.argv[0])
        print("	 %s eth0 ffff::10.0.1.12 128 fdff::1" % sys.argv[0])
        sys.exit(-1)

    iface = if_nametoindex(sys.argv[1])

    try:
        # dst = struct.unpack("I", socket.inet_pton(socket.AF_INET, sys.argv[2]))[0]
        dst = bytearray(socket.inet_pton(socket.AF_INET, sys.argv[2]))
        family = socket.AF_INET
    except OSError as e:
        dst = bytearray(socket.inet_pton(socket.AF_INET6, sys.argv[2]))
        family = socket.AF_INET6

    prefix = int(sys.argv[3])

    if len(sys.argv) == 5:
        gw = bytearray(socket.inet_pton(family, sys.argv[4]))

    nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE)
    nlh.nlmsg_type = rtnl.RTM_NEWROUTE
    nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_CREATE | netlink.NLM_F_ACK
    seq = int(time.time())
    nlh.nlmsg_seq = seq

    rtm = nlh.put_extra_header_as(rtnl.Rtmsg)
    rtm.rtm_family = family
    rtm.rtm_dst_len = prefix
    rtm.rtm_src_len = 0
    rtm.rtm_tos = 0
    rtm.rtm_protocol = rtnl.RTPROT_STATIC
    rtm.rtm_table = rtnl.RT_TABLE_MAIN
    rtm.rtm_type = rtnl.RTN_UNICAST
    # is there any gateway?
    rtm.rtm_scope = len(sys.argv) == 4 and rtnl.RT_SCOPE_LINK or rtnl.RT_SCOPE_UNIVERSE
    rtm.rtm_flags = 0

    log.debug("family: %d, dst len: %d" % (family, len(dst)))
    nlh.put(rtnl.RTA_DST, dst)

    nlh.put_u32(rtnl.RTA_OIF, iface)
    if len(sys.argv) == 5:
        log.info("family: %d, gw len: %d" % (family, len(gw)))
        nlh.put(rtnl.RTA_GATEWAY, gw)

    with mnl.Socket(netlink.NETLINK_ROUTE) as nl:
        nl.bind(0, mnl.MNL_SOCKET_AUTOPID)
        portid = nl.get_portid()

        try:
            nl.send_nlmsg(nlh)
        except Exception as e:
            print("mnl_socket_sendto: %s" % e, file=sys.stderr)
            raise

        try:
            buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE)
        except Exception as e:
            print("mnl_socket_recvfrom: %s" % e, file=sys.stderr)
            raise

        try:
            mnl.cb_run(buf, seq, portid, None, None)
        except Exception as e:
            print("mnl_cb_run: %s" % e, file=sys.stderr)
            raise
Пример #19
0
    def test_cb_run(self):
        self.assertEqual(mnl.cb_run(self.nlmsghdr_noop, 1, 1, None, None), mnl.MNL_CB_OK)
        self.assertEqual(mnl.cb_run(self.nlmsghdr_mintype, 1, 1, None, None), mnl.MNL_CB_OK)
        try:
            mnl.cb_run(self.nlmsghdr_error, 1, 1, None, None)
        except OSError as e:
            self.assertEquals(e.errno, errno.EPERM)
        else:
            self.fail("not raise OSError")

        @mnl.mnl_cb_t
        def cb_data(h, d):
            d is not None and d.append(h.nlmsg_type)
            if h.nlmsg_type == 0xff:
                ctypes.set_errno(errno.ENOBUFS)
                return mnl.MNL_CB_ERROR
            elif h.nlmsg_type == 0x7f: return mnl.MNL_CB_STOP
            else: return mnl.MNL_CB_OK

        l = []
        try:
            mnl.cb_run(self.nlmsghdr_typeFF, 1, 1, cb_data, l)
        except OSError as e:
            self.assertEquals(e.errno, errno.ENOBUFS)
        else:
            self.fail("not raise OSError")

        l = []
        ret = mnl.cb_run(self.nlmsghdr_type7F, 1, 1, cb_data, l)
        self.assertEqual(ret, mnl.MNL_CB_STOP)
        self.assertEqual(l[0], netlink.NLMSG_MIN_TYPE)
        self.assertEqual(l[1], 0x7f)

        try:
            mnl.cb_run(self.nlmsghdr_pid2, 1, 1, cb_data, None)
        except OSError as e:
            self.assertEqual(e.errno, errno.ESRCH)
        else:
            self.fail("not raise OSError")

        try:
            mnl.cb_run(self.nlmsghdr_seq2, 1, 1, cb_data, None)
        except OSError as e:
            self.assertEqual(e.errno, errno.EPROTO)
        else:
            self.fail("not raise OSError")

        # Python2.5 returns -1 but could not get EINTR?
        if sys.version_info < (2, 6):
            ret = mnl.cb_run2(self.nlmsghdr_intr, 1, 1, cb_data, None)
            self.assertEquals(ret, mnl.MNL_CB_ERROR)
        else:
            try:
                mnl.cb_run2(self.nlmsghdr_intr, 1, 1, cb_data, None)
            except OSError as e:
                self.assertEqual(e.errno, errno.EINTR)
            else:
                self.fail("not raise OSError")