From 18f85cd9cdde214c7ceb4eaee2af1edd702fd09a Mon Sep 17 00:00:00 2001 From: focus Date: Wed, 16 Mar 2011 12:57:09 +0000 Subject: [PATCH] Testing changes to support wireless network adapters configuration. All network setup GUI related code now part of gui/network_setup.cpp, old code in setting_helpers.cpp commented. Removed recursive menu call in network setup gui. When compiled with -DDEBUG, ifup/ifdown not executed, only printed. git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-experimental@1305 e54a6e83-5905-42d5-8d5c-058d10e6a962 --- src/gui/network_setup.cpp | 353 +++++++++++++++++++++++++------ src/gui/network_setup.h | 18 +- src/system/configure_network.cpp | 174 +++++++++++++-- src/system/configure_network.h | 12 ++ src/system/setting_helpers.cpp | 8 +- 5 files changed, 482 insertions(+), 83 deletions(-) diff --git a/src/gui/network_setup.cpp b/src/gui/network_setup.cpp index 4a65d5146..06048702a 100644 --- a/src/gui/network_setup.cpp +++ b/src/gui/network_setup.cpp @@ -32,6 +32,7 @@ #include #endif +#include #include "gui/network_setup.h" #include "gui/proxyserver_setup.h" @@ -50,17 +51,20 @@ #include +#include + +extern "C" int pinghost( const char *hostname ); CNetworkSetup::CNetworkSetup(bool wizard_mode) { networkConfig = CNetworkConfig::getInstance(); - + is_wizard = wizard_mode; - + width = w_max (40, 10); selected = -1; - - readNetworkSettings(); + + //readNetworkSettings(); } CNetworkSetup::~CNetworkSetup() @@ -68,33 +72,32 @@ CNetworkSetup::~CNetworkSetup() //delete networkConfig; } - int CNetworkSetup::exec(CMenuTarget* parent, const std::string &actionKey) { int res = menu_return::RETURN_REPAINT; if (parent) - { parent->hide(); - } - if(actionKey=="networkapply") { applyNetworkSettings(); readNetworkSettings(); - showNetworkSetup(); - return menu_return::RETURN_EXIT; + backupNetworkSettings(); + return res; } else if(actionKey=="networktest") { printf("[network setup] doing network test...\n"); +#if 0 testNetworkSettings( networkConfig->address.c_str(), networkConfig->netmask.c_str(), networkConfig->broadcast.c_str(), networkConfig->gateway.c_str(), networkConfig->nameserver.c_str(), networkConfig->inet_static); +#endif + testNetworkSettings(); return res; } else if(actionKey=="networkshow") @@ -111,10 +114,11 @@ int CNetworkSetup::exec(CMenuTarget* parent, const std::string &actionKey) NEUTRINO_ICON_QUESTION, width); - if (result == 0) //yes + if (result == CMessageBox::mbrYes) { restoreNetworkSettings(); + } + return res; } - printf("[neutrino] init network setup...\n"); showNetworkSetup(); @@ -122,7 +126,6 @@ int CNetworkSetup::exec(CMenuTarget* parent, const std::string &actionKey) return res; } - void CNetworkSetup::readNetworkSettings() { network_automatic_start = networkConfig->automatic_start; @@ -134,16 +137,26 @@ void CNetworkSetup::readNetworkSettings() network_nameserver = networkConfig->nameserver; network_gateway = networkConfig->gateway; network_hostname = networkConfig->hostname; + mac_addr = networkConfig->mac_addr; + network_ssid = networkConfig->ssid; + network_key = networkConfig->key; +} +void CNetworkSetup::backupNetworkSettings() +{ old_network_automatic_start = networkConfig->automatic_start; old_network_dhcp = networkConfig->inet_static ? NETWORK_DHCP_OFF : NETWORK_DHCP_ON; - + old_network_address = networkConfig->address; old_network_netmask = networkConfig->netmask; old_network_broadcast = networkConfig->broadcast; old_network_nameserver = networkConfig->nameserver; old_network_gateway = networkConfig->gateway; old_network_hostname = networkConfig->hostname; + old_network_ssid = networkConfig->ssid; + old_network_key = networkConfig->key; + old_ifname = g_settings.ifname; + old_mac_addr = mac_addr; } #define OPTIONS_NTPENABLE_OPTION_COUNT 2 @@ -153,10 +166,19 @@ const CMenuOptionChooser::keyval OPTIONS_NTPENABLE_OPTIONS[OPTIONS_NTPENABLE_OPT { CNetworkSetup::NETWORK_NTP_ON, LOCALE_OPTIONS_NTP_ON } }; - +static int my_filter(const struct dirent * dent) +{ + if(dent->d_name[0] == 'l' && dent->d_name[1] == 'o') + return 0; + if(dent->d_name[0] == '.') + return 0; + return 1; +} void CNetworkSetup::showNetworkSetup() { + struct dirent **namelist; + //menue init CMenuWidget* networkSettings = new CMenuWidget(LOCALE_MAINSETTINGS_HEAD, NEUTRINO_ICON_SETTINGS, width); networkSettings->setWizardMode(is_wizard); @@ -164,11 +186,13 @@ void CNetworkSetup::showNetworkSetup() //apply button CMenuForwarder *m0 = new CMenuForwarder(LOCALE_NETWORKMENU_SETUPNOW, true, NULL, this, "networkapply", CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED); - + + networkConfig->readConfig(g_settings.ifname); + readNetworkSettings(); + backupNetworkSettings(); + //eth id - static CNetAdapter netadapter; - std::string eth_id = netadapter.getMacAddr(); - CMenuForwarder *mac = new CMenuForwarderNonLocalized("MAC", false, eth_id.c_str()); + CMenuForwarder *mac = new CMenuForwarderNonLocalized("MAC", false, mac_addr); //prepare input entries CIPInput * networkSettings_NetworkIP = new CIPInput(LOCALE_NETWORKMENU_IPADDRESS , network_address , LOCALE_IPSETUP_HINT_1, LOCALE_IPSETUP_HINT_2, this); @@ -180,9 +204,22 @@ void CNetworkSetup::showNetworkSetup() //hostname CStringInputSMS * networkSettings_Hostname = new CStringInputSMS(LOCALE_NETWORKMENU_HOSTNAME, &network_hostname, 30, LOCALE_NETWORKMENU_NTPSERVER_HINT1, LOCALE_NETWORKMENU_NTPSERVER_HINT2, "abcdefghijklmnopqrstuvwxyz0123456789-. "); + //if select + int ifcount = scandir("/sys/class/net", &namelist, my_filter, alphasort); + CMenuOptionStringChooser * ifSelect = new CMenuOptionStringChooser(LOCALE_NETWORKMENU_SELECT_IF, g_settings.ifname, ifcount > 1, this, CRCInput::RC_nokey, "", true); + for(int i = 0; i < ifcount; i++) { + ifSelect->addOption(namelist[i]->d_name); + free(namelist[i]); + } + if (ifcount >= 0) + free(namelist); + //auto start CMenuOptionChooser* o1 = new CMenuOptionChooser(LOCALE_NETWORKMENU_SETUPONSTARTUP, &network_automatic_start, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true); + CStringInputSMS * networkSettings_ssid = new CStringInputSMS(LOCALE_NETWORKMENU_SSID, &network_ssid, 30, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "abcdefghijklmnopqrstuvwxyz0123456789-. "); + CStringInputSMS * networkSettings_key = new CStringInputSMS(LOCALE_NETWORKMENU_PASSWORD, &network_key, 30, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "abcdefghijklmnopqrstuvwxyz0123456789-. "); + //dhcp network_dhcp = networkConfig->inet_static ? NETWORK_DHCP_OFF : NETWORK_DHCP_ON; @@ -192,10 +229,22 @@ void CNetworkSetup::showNetworkSetup() CMenuForwarder *m4 = new CMenuForwarder(LOCALE_NETWORKMENU_GATEWAY , networkConfig->inet_static, network_gateway , networkSettings_Gateway ); CMenuForwarder *m5 = new CMenuForwarder(LOCALE_NETWORKMENU_NAMESERVER, networkConfig->inet_static, network_nameserver, networkSettings_NameServer); CMenuForwarder *m8 = new CMenuForwarder(LOCALE_NETWORKMENU_HOSTNAME , !networkConfig->inet_static, network_hostname , networkSettings_Hostname ); - - CDHCPNotifier* dhcpNotifier = new CDHCPNotifier(m1,m2,m3,m4,m5,m8); - CMenuOptionChooser* o2 = new CMenuOptionChooser(LOCALE_NETWORKMENU_DHCP, &network_dhcp, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, dhcpNotifier); - + + dhcpDisable[0] = m1; + dhcpDisable[1] = m2; + dhcpDisable[2] = m3; + dhcpDisable[3] = m4; + dhcpDisable[4] = m5; + dhcpEnable[0] = m8; + + CMenuForwarder *m9 = new CMenuForwarder(LOCALE_NETWORKMENU_SSID , networkConfig->wireless, network_ssid , networkSettings_ssid ); + CMenuForwarder *m10 = new CMenuForwarder(LOCALE_NETWORKMENU_PASSWORD , networkConfig->wireless, network_key , networkSettings_key ); + + wlanEnable[0] = m9; + wlanEnable[1] = m10; + + CMenuOptionChooser* o2 = new CMenuOptionChooser(LOCALE_NETWORKMENU_DHCP, &network_dhcp, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, this); + //paint menu items networkSettings->addIntroItems(LOCALE_MAINSETTINGS_NETWORK); //intros //------------------------------------------------- @@ -203,7 +252,9 @@ void CNetworkSetup::showNetworkSetup() networkSettings->addItem(new CMenuForwarder(LOCALE_NETWORKMENU_TEST, true, NULL, this, "networktest", CRCInput::RC_green, NEUTRINO_ICON_BUTTON_GREEN)); //test networkSettings->addItem(new CMenuForwarder(LOCALE_NETWORKMENU_SHOW, true, NULL, this, "networkshow", CRCInput::RC_help, NEUTRINO_ICON_BUTTON_HELP)); //show settings networkSettings->addItem(GenericMenuSeparatorLine); - //------------------------------------------------- + //------------------------------------------------ + if(ifcount) + networkSettings->addItem(ifSelect); //if select networkSettings->addItem(o1); //set on start networkSettings->addItem(GenericMenuSeparatorLine); //------------------------------------------------ @@ -223,6 +274,12 @@ void CNetworkSetup::showNetworkSetup() networkSettings->addItem( m5); //nameserver networkSettings->addItem(GenericMenuSeparatorLine); //------------------------------------------------ + if(ifcount > 1) { // if there is only one, its probably wired + networkSettings->addItem( m9); //ssid + networkSettings->addItem( m10); //key + networkSettings->addItem(GenericMenuSeparatorLine); + } + //------------------------------------------------ //ntp submenu CMenuWidget* ntp = new CMenuWidget(LOCALE_MAINSETTINGS_NETWORK, NEUTRINO_ICON_SETTINGS, width); networkSettings->addItem(new CMenuForwarder(LOCALE_NETWORKMENU_NTPTITLE, true, NULL, ntp, NULL, CRCInput::RC_yellow, NEUTRINO_ICON_BUTTON_YELLOW)); @@ -236,16 +293,18 @@ void CNetworkSetup::showNetworkSetup() //proxyserver submenu networkSettings->addItem(new CMenuForwarder(LOCALE_FLASHUPDATE_PROXYSERVER_SEP, true, NULL, new CProxySetup(LOCALE_MAINSETTINGS_NETWORK), NULL, CRCInput::RC_0, NEUTRINO_ICON_BUTTON_0)); - - networkSettings->exec(NULL, ""); - networkSettings->hide(); + while(true) { + int res = menu_return::RETURN_EXIT; + networkSettings->exec(NULL, ""); + networkSettings->hide(); + + if (settingsChanged()) + res = saveChangesDialog(); + if(res == menu_return::RETURN_EXIT) + break; + } selected = networkSettings->getSelected(); delete networkSettings; - - // Check for changes - if (settingsChanged()) - saveChangesDialog(); - } void CNetworkSetup::showNetworkNTPSetup(CMenuWidget *menu_ntp) @@ -273,7 +332,6 @@ void CNetworkSetup::showNetworkNFSMounts(CMenuWidget *menu_nfs) menu_nfs->addItem(new CMenuForwarder(LOCALE_NFS_UMOUNT, true, NULL, new CNFSUmountGui(), NULL, CRCInput::RC_green, NEUTRINO_ICON_BUTTON_GREEN)); } - typedef struct n_isettings_t { int old_network_setting; @@ -289,13 +347,16 @@ bool CNetworkSetup::checkIntSettings() {old_network_dhcp, network_dhcp } }; for (uint i = 0; i < (sizeof(n_isettings) / sizeof(n_isettings[0])); i++) - if (n_isettings[i].old_network_setting != n_isettings[i].network_setting) + if (n_isettings[i].old_network_setting != n_isettings[i].network_setting) { +#ifdef DEBUG + printf("CNetworkSetup::checkIntSettings: %d %d -> %d\n", i, n_isettings[i].old_network_setting, n_isettings[i].network_setting); +#endif return true; - + } + return false; } - typedef struct n_ssettings_t { std::string old_network_setting; @@ -312,12 +373,21 @@ bool CNetworkSetup::checkStringSettings() {old_network_broadcast, network_broadcast }, {old_network_gateway, network_gateway }, {old_network_nameserver, network_nameserver }, - {old_network_hostname, network_hostname } + {old_network_hostname, network_hostname }, + {old_ifname, g_settings.ifname } }; for (uint i = 0; i < (sizeof(n_ssettings) / sizeof(n_ssettings[0])); i++) - if (n_ssettings[i].old_network_setting != n_ssettings[i].network_setting) - return true; - + if (n_ssettings[i].old_network_setting != n_ssettings[i].network_setting) { +#ifdef DEBUG + printf("CNetworkSetup::checkStringSettings: %d: %s -> %s\n", i, n_ssettings[i].old_network_setting.c_str(), n_ssettings[i].network_setting.c_str()); +#endif + return true; + } + if(CNetworkConfig::getInstance()->wireless) { + if((old_network_ssid != network_ssid) || (old_network_key != network_key)) + return true; + } + return false; } @@ -340,8 +410,12 @@ void CNetworkSetup::prepareSettings() networkConfig->broadcast = network_broadcast; networkConfig->gateway = network_gateway; networkConfig->nameserver = network_nameserver; - + networkConfig->hostname = network_hostname; + networkConfig->ssid = network_ssid; + networkConfig->key = network_key; + readNetworkSettings(); + backupNetworkSettings(); } typedef struct n_settings_t @@ -368,10 +442,9 @@ bool CNetworkSetup::checkForIP() { if (n_settings[i].network_settings.empty()) //no definied setting { - printf("[network setup] empty address ...\n"); + printf("[network setup] empty address %s\n", g_Locale->getText(n_settings[i].addr_name)); char msg[64]; snprintf(msg, 64, g_Locale->getText(LOCALE_NETWORKMENU_ERROR_NO_ADDRESS), g_Locale->getText(n_settings[i].addr_name)); - ShowMsgUTF(LOCALE_MAINSETTINGS_NETWORK, msg, CMessageBox::mbrOk, CMessageBox::mbOk, NEUTRINO_ICON_ERROR, width); return false; } @@ -411,8 +484,8 @@ void CNetworkSetup::applyNetworkSettings() //open a message dialog with buttons, //yes: applies networksettings and exit network setup -//no: saves networksettings and exit network setup -void CNetworkSetup::saveChangesDialog() +//no: ask to restore networksettings, and return to menu +int CNetworkSetup::saveChangesDialog() { // Save the settings after changes, if user wants to! int result = ShowMsgUTF(LOCALE_MAINSETTINGS_NETWORK, g_Locale->getText(LOCALE_NETWORKMENU_APPLY_SETTINGS_NOW), CMessageBox::mbrYes, @@ -420,26 +493,30 @@ void CNetworkSetup::saveChangesDialog() CMessageBox::mbNo , NEUTRINO_ICON_QUESTION, width); - - //check for missing ip settings - if (!checkForIP()) - result = CMessageBox::mbrNo; //restore - + switch(result) { case CMessageBox::mbrYes: - exec(NULL, "networkapply"); + if (!checkForIP()) + return menu_return::RETURN_REPAINT; + return exec(NULL, "networkapply"); break; case CMessageBox::mbrNo: //no - exec(NULL, "restore"); + return exec(NULL, "restore"); break; } + return menu_return::RETURN_REPAINT; } //restores settings void CNetworkSetup::restoreNetworkSettings() { + snprintf(g_settings.ifname, sizeof(g_settings.ifname), "%s", old_ifname.c_str()); + networkConfig->readConfig(g_settings.ifname);//FIXME ? + + mac_addr = networkConfig->mac_addr; + network_automatic_start = old_network_automatic_start; network_dhcp = old_network_dhcp; network_address = old_network_address; @@ -447,6 +524,9 @@ void CNetworkSetup::restoreNetworkSettings() network_broadcast = old_network_broadcast; network_nameserver = old_network_nameserver; network_gateway = old_network_gateway; + network_hostname = old_network_hostname; + network_ssid = old_network_ssid; + network_key = old_network_key; networkConfig->automatic_start = network_automatic_start; networkConfig->inet_static = (network_dhcp ? false : true); @@ -455,23 +535,49 @@ void CNetworkSetup::restoreNetworkSettings() networkConfig->broadcast = network_broadcast; networkConfig->gateway = network_gateway; networkConfig->nameserver = network_nameserver; + networkConfig->hostname = network_hostname; + networkConfig->ssid = network_ssid; + networkConfig->key = network_key; networkConfig->commitConfig(); } -bool CNetworkSetup::changeNotify(const neutrino_locale_t, void * Data) +bool CNetworkSetup::changeNotify(const neutrino_locale_t locale, void * Data) { - char ip[16]; - unsigned char _ip[4]; - sscanf((char*) Data, "%hhu.%hhu.%hhu.%hhu", &_ip[0], &_ip[1], &_ip[2], &_ip[3]); + if(locale == LOCALE_NETWORKMENU_IPADDRESS) { + char ip[16]; + unsigned char _ip[4]; + sscanf((char*) Data, "%hhu.%hhu.%hhu.%hhu", &_ip[0], &_ip[1], &_ip[2], &_ip[3]); - sprintf(ip, "%hhu.%hhu.%hhu.255", _ip[0], _ip[1], _ip[2]); - networkConfig->broadcast = ip; - network_broadcast = networkConfig->broadcast; + sprintf(ip, "%hhu.%hhu.%hhu.255", _ip[0], _ip[1], _ip[2]); + networkConfig->broadcast = ip; + network_broadcast = networkConfig->broadcast; - networkConfig->netmask = (_ip[0] == 10) ? "255.0.0.0" : "255.255.255.0"; - network_netmask = networkConfig->netmask; - + networkConfig->netmask = (_ip[0] == 10) ? "255.0.0.0" : "255.255.255.0"; + network_netmask = networkConfig->netmask; + + } else if(locale == LOCALE_NETWORKMENU_SELECT_IF) { + networkConfig->readConfig(g_settings.ifname); + readNetworkSettings(); + printf("CNetworkSetup::changeNotify: using %s, static %d\n", g_settings.ifname, CNetworkConfig::getInstance()->inet_static); + + changeNotify(LOCALE_NETWORKMENU_DHCP, &CNetworkConfig::getInstance()->inet_static); + + int ecnt = sizeof(wlanEnable) / sizeof(CMenuForwarder*); + for(int i = 0; i < ecnt; i++) + wlanEnable[i]->setActive(CNetworkConfig::getInstance()->wireless); + + } else if(locale == LOCALE_NETWORKMENU_DHCP) { + CNetworkConfig::getInstance()->inet_static = (network_dhcp == NETWORK_DHCP_OFF); + int ecnt = sizeof(dhcpDisable) / sizeof(CMenuForwarder*); + + for(int i = 0; i < ecnt; i++) + dhcpDisable[i]->setActive(CNetworkConfig::getInstance()->inet_static); + ecnt = sizeof(dhcpEnable) / sizeof(CMenuForwarder*); + + for(int i = 0; i < ecnt; i++) + dhcpEnable[i]->setActive(!CNetworkConfig::getInstance()->inet_static); + } return true; } @@ -480,4 +586,125 @@ void CNetworkSetup::setWizardMode(bool mode) { printf("[neutrino network setup] %s set network settings menu to mode %d...\n", __FUNCTION__, mode); is_wizard = mode; -} \ No newline at end of file +} + +void CNetworkSetup::showCurrentNetworkSettings() +{ + char ip[16]; + char mask[16]; + char broadcast[16]; + char router[16]; + char nameserver[16]; + std::string text; + + netGetIP(g_settings.ifname, ip, mask, broadcast); + if (ip[0] == 0) { + text = g_Locale->getText(LOCALE_NETWORKMENU_INACTIVE_NETWORK); + } + else { + netGetNameserver(nameserver); + netGetDefaultRoute(router); + CNetworkConfig networkConfig; + std::string dhcp = networkConfig.inet_static ? g_Locale->getText(LOCALE_OPTIONS_OFF) : g_Locale->getText(LOCALE_OPTIONS_ON); + + text = (std::string)g_Locale->getText(LOCALE_NETWORKMENU_DHCP) + ": " + dhcp + '\n' + + g_Locale->getText(LOCALE_NETWORKMENU_IPADDRESS ) + ": " + ip + '\n' + + g_Locale->getText(LOCALE_NETWORKMENU_NETMASK ) + ": " + mask + '\n' + + g_Locale->getText(LOCALE_NETWORKMENU_BROADCAST ) + ": " + broadcast + '\n' + + g_Locale->getText(LOCALE_NETWORKMENU_NAMESERVER) + ": " + nameserver + '\n' + + g_Locale->getText(LOCALE_NETWORKMENU_GATEWAY ) + ": " + router; + } + ShowMsgUTF(LOCALE_NETWORKMENU_SHOW, text, CMessageBox::mbrBack, CMessageBox::mbBack); // UTF-8 +} + +const char * CNetworkSetup::mypinghost(const char * const host) +{ + int retvalue = pinghost(host); + switch (retvalue) + { + case 1: return (g_Locale->getText(LOCALE_PING_OK)); + case 0: return (g_Locale->getText(LOCALE_PING_UNREACHABLE)); + case -1: return (g_Locale->getText(LOCALE_PING_PROTOCOL)); + case -2: return (g_Locale->getText(LOCALE_PING_SOCKET)); + } + return ""; +} + +void CNetworkSetup::testNetworkSettings() +{ + char our_ip[16]; + char our_mask[16]; + char our_broadcast[16]; + char our_gateway[16]; + char our_nameserver[16]; + + std::string text, testsite; + + //set default testdomain and wiki-IP + std::string defaultsite = "www.google.de", wiki_IP = "89.31.143.1"; + + //get www-domain testsite from /.version + CConfigFile config('\t'); + config.loadConfig("/.version"); + testsite = config.getString("homepage",defaultsite); + testsite.replace( 0, testsite.find("www",0), "" ); + + //use default testdomain if testsite missing + if (testsite.length()==0) + testsite = defaultsite; + + if (networkConfig->inet_static) + { + strcpy(our_ip, networkConfig->address.c_str()); + strcpy(our_mask, networkConfig->netmask.c_str()); + strcpy(our_broadcast, networkConfig->broadcast.c_str()); + strcpy(our_gateway, networkConfig->gateway.c_str()); + strcpy(our_nameserver, networkConfig->nameserver.c_str()); + } + else + { + // FIXME test with current, not changed ifname ? + netGetIP((char *) old_ifname.c_str(), our_ip, our_mask, our_broadcast); + netGetDefaultRoute(our_gateway); + netGetNameserver(our_nameserver); + } + + printf("testNw IP: %s\n", our_ip); + printf("testNw MAC-address: %s\n", old_mac_addr.c_str()); + printf("testNw Netmask: %s\n", our_mask); + printf("testNw Broadcast: %s\n", our_broadcast); + printf("testNw Gateway: %s\n", our_gateway); + printf("testNw Nameserver: %s\n", our_nameserver); + printf("testNw Testsite %s\n", testsite.c_str()); + + if (our_ip[0] == 0) + { + text = g_Locale->getText(LOCALE_NETWORKMENU_INACTIVE_NETWORK); + } + else + { + text = "Box: " + old_mac_addr + "\n "; + text += (std::string)our_ip + " " + (std::string)mypinghost(our_ip); + text += "\n"; + text += g_Locale->getText(LOCALE_NETWORKMENU_GATEWAY); + text += " (Router)\n "; + text += (std::string)our_gateway + " " +(std::string)mypinghost(our_gateway); + text += "\n"; + text += g_Locale->getText(LOCALE_NETWORKMENU_NAMESERVER); + text += "\n "; + text += (std::string)our_nameserver + " " + (std::string)mypinghost(our_nameserver); + text += "\n"; + text += "wiki.neutrino-hd.de:\n "; + text += "via IP (" + wiki_IP + "): " + (std::string)mypinghost(wiki_IP.c_str()); + text += ":\n "; + if (1 == pinghost(our_nameserver)) + { + text += "via DNS: " + (std::string)mypinghost("wiki.neutrino-hd.de"); + text += "\n"; + text += testsite + ":\n "; + text += "via DNS: " + (std::string)mypinghost(testsite.c_str()) + ":\n"; + } + } + + ShowMsgUTF(LOCALE_NETWORKMENU_TEST, text, CMessageBox::mbrBack, CMessageBox::mbBack); // UTF-8 +} diff --git a/src/gui/network_setup.h b/src/gui/network_setup.h index 8fced31bb..3ab1ecbe2 100644 --- a/src/gui/network_setup.h +++ b/src/gui/network_setup.h @@ -57,6 +57,9 @@ class CNetworkSetup : public CMenuTarget, CChangeObserver std::string network_nameserver; std::string network_gateway; std::string network_hostname; + std::string network_ssid; + std::string network_key; + std::string mac_addr; int old_network_dhcp; int old_network_automatic_start; @@ -66,14 +69,24 @@ class CNetworkSetup : public CMenuTarget, CChangeObserver std::string old_network_nameserver; std::string old_network_gateway; std::string old_network_hostname; + std::string old_ifname; + std::string old_network_ssid; + std::string old_network_key; + std::string old_mac_addr; + + + CMenuForwarder* dhcpDisable[5]; + CMenuForwarder* dhcpEnable[1]; + CMenuForwarder* wlanEnable[2]; void restoreNetworkSettings(); void prepareSettings(); void readNetworkSettings(); + void backupNetworkSettings(); void showNetworkSetup(); void showNetworkNTPSetup(CMenuWidget *menu_ntp); void showNetworkNFSMounts(CMenuWidget *menu_nfs); - void saveChangesDialog(); + int saveChangesDialog(); void applyNetworkSettings(); void saveNetworkSettings(); @@ -81,6 +94,7 @@ class CNetworkSetup : public CMenuTarget, CChangeObserver bool checkStringSettings(); bool checkForIP(); bool settingsChanged(); + const char * mypinghost(const char * const host); public: enum NETWORK_DHCP_MODE @@ -115,6 +129,8 @@ class CNetworkSetup : public CMenuTarget, CChangeObserver int exec(CMenuTarget* parent, const std::string & actionKey); virtual bool changeNotify(const neutrino_locale_t, void * Data); + void showCurrentNetworkSettings(); + void testNetworkSettings(); }; diff --git a/src/system/configure_network.cpp b/src/system/configure_network.cpp index f230b8a0a..3bc1526c1 100644 --- a/src/system/configure_network.cpp +++ b/src/system/configure_network.cpp @@ -21,21 +21,23 @@ #include #include /* perror... */ #include +#include #include "configure_network.h" #include "libnet.h" /* netGetNameserver, netSetNameserver */ #include "network_interfaces.h" /* getInetAttributes, setInetAttributes */ #include /* system */ +#include +#include +#include +#include -CNetworkConfig::CNetworkConfig(void) +CNetworkConfig::CNetworkConfig() { char our_nameserver[16]; netGetNameserver(our_nameserver); nameserver = our_nameserver; - inet_static = getInetAttributes("eth0", automatic_start, address, netmask, broadcast, gateway); - - init_vars(); - copy_to_orig(); + ifname = "eth0"; } CNetworkConfig* CNetworkConfig::getInstance() @@ -52,9 +54,16 @@ CNetworkConfig* CNetworkConfig::getInstance() CNetworkConfig::~CNetworkConfig() { - } +void CNetworkConfig::readConfig(std::string iname) +{ + ifname = iname; + inet_static = getInetAttributes(ifname, automatic_start, address, netmask, broadcast, gateway); + + init_vars(); + copy_to_orig(); +} void CNetworkConfig::init_vars(void) { @@ -62,15 +71,41 @@ void CNetworkConfig::init_vars(void) char _broadcast[16]; char router[16]; char ip[16]; + unsigned char addr[6]; hostname = netGetHostname(); netGetDefaultRoute(router); gateway = router; - netGetIP((char *) "eth0", ip, mask, _broadcast); - netmask = mask; - broadcast = _broadcast; - address = ip; + + /* FIXME its enough to read IP for dhcp only ? + * static config should not be different from settings in etc/network/interfaces */ + if(!inet_static) { + netGetIP((char *) ifname.c_str(), ip, mask, _broadcast); + netmask = mask; + broadcast = _broadcast; + address = ip; + } + + netGetMacAddr((char *) ifname.c_str(), addr); + + std::stringstream mac_tmp; + for(int i=0;i<6;++i) + mac_tmp<setActive(!CNetworkConfig::getInstance()->inet_static); return true; } - +#endif COnOffNotifier::COnOffNotifier( CMenuItem* a1,CMenuItem* a2,CMenuItem* a3,CMenuItem* a4,CMenuItem* a5) { number = 0; @@ -514,6 +516,7 @@ bool CKeySetupNotifier::changeNotify(const neutrino_locale_t, void *) return false; } +#if 0 // not used bool CIPChangeNotifier::changeNotify(const neutrino_locale_t, void * Data) { char ip[16]; @@ -531,6 +534,7 @@ bool CIPChangeNotifier::changeNotify(const neutrino_locale_t, void * Data) return true; } +#endif bool CConsoleDestChangeNotifier::changeNotify(const neutrino_locale_t, void * Data) { @@ -778,6 +782,7 @@ std::string CNetAdapter::getMacAddr(void) } } +#if 0 // not used, moved to gui/network_setup.cpp const char * mypinghost(const char * const host) { int retvalue = pinghost(host); @@ -899,6 +904,7 @@ void showCurrentNetworkSettings() } ShowMsgUTF(LOCALE_NETWORKMENU_SHOW, text, CMessageBox::mbrBack, CMessageBox::mbBack); // UTF-8 } +#endif uint64_t getcurrenttime() {