Temporarily disable NetworkManager on Linux

Hopefully takes care of #75, #76, and many others.
This commit is contained in:
Joseph C. Lehner 2021-05-25 18:04:00 +02:00
parent 86de6715b4
commit 69bb3ff934

View file

@ -55,6 +55,8 @@ struct ethsock
int fd; int fd;
#ifdef NMRPFLASH_LINUX #ifdef NMRPFLASH_LINUX
bool stp; bool stp;
// managed by NetworkManager
bool nm_managed;
#endif #endif
#else #else
HANDLE handle; HANDLE handle;
@ -86,7 +88,6 @@ static int x_pcap_findalldevs(pcap_if_t **devs)
return 0; return 0;
} }
#ifndef NMRPFLASH_LINUX
static int systemf(const char *fmt, ...) static int systemf(const char *fmt, ...)
{ {
char cmd[1024]; char cmd[1024];
@ -104,7 +105,6 @@ static int systemf(const char *fmt, ...)
return ret; return ret;
} }
#endif
#ifndef NMRPFLASH_WINDOWS #ifndef NMRPFLASH_WINDOWS
static inline bool sockaddr_get_hwaddr(struct sockaddr *sa, uint8_t *hwaddr) static inline bool sockaddr_get_hwaddr(struct sockaddr *sa, uint8_t *hwaddr)
@ -677,6 +677,24 @@ struct ethsock *ethsock_create(const char *intf, uint16_t protocol)
fprintf(stderr, "Warning: failed to disable STP on %s.\n", intf); fprintf(stderr, "Warning: failed to disable STP on %s.\n", intf);
} }
} }
err = system("nmcli -v > /dev/null");
if (!err) {
err = systemf("nmcli -f GENERAL.STATE device show %s | grep -q unmanaged", sock->intf);
if (!err) {
sock->nm_managed = false;
} else {
sock->nm_managed = true;
err = systemf("nmcli device set ifname %s managed no", sock->intf);
if (err) {
printf("Warning: failed to temporarily disable NetworkManager\n");
}
printf("Temporarily disabling NetworkManager on interface.\n");
}
}
} else {
sock->nm_managed = false;
}
#else #else
if (is_bridge) { if (is_bridge) {
fprintf(stderr, "Warning: bridge interfaces are not fully " fprintf(stderr, "Warning: bridge interfaces are not fully "
@ -764,6 +782,10 @@ int ethsock_close(struct ethsock *sock)
if (sock->stp) { if (sock->stp) {
intf_stp_enable(sock->intf, true); intf_stp_enable(sock->intf, true);
} }
if (sock->nm_managed) {
systemf("nmcli device set ifname %s managed yes", sock->intf);
}
#endif #endif
if (sock->pcap) { if (sock->pcap) {
pcap_close(sock->pcap); pcap_close(sock->pcap);