Files
neutrino/src/gui/nfs.cpp
martii 706ea95092 gui/nfs: implement mac address lookup
Conflicts:
	src/gui/moviebrowser.cpp
	src/gui/nfs.cpp
2014-09-15 14:04:20 +04:00

437 lines
15 KiB
C++

/*
Neutrino-GUI - DBoxII-Project
NFSMount/Umount GUI by Zwen
Homepage: http://dbox.cyberphoria.org/
Kommentar:
Diese GUI wurde von Grund auf neu programmiert und sollte nun vom
Aufbau und auch den Ausbaumoeglichkeiten gut aussehen. Neutrino basiert
auf der Client-Server Idee, diese GUI ist also von der direkten DBox-
Steuerung getrennt. Diese wird dann von Daemons uebernommen.
License: GPL
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <gui/nfs.h>
#include <gui/filebrowser.h>
#include <gui/widget/menue.h>
#include <gui/widget/hintbox.h>
#include <gui/widget/stringinput.h>
#include <gui/widget/stringinput_ext.h>
#include <driver/screen_max.h>
#include <fstream>
#include <system/helpers.h>
#include <global.h>
#include <errno.h>
#include <pthread.h>
#include <sys/mount.h>
#include <unistd.h>
#include <neutrino.h>
#include <zapit/client/zapittools.h>
extern int pinghost (const std::string &hostname, std::string *ip = NULL);
CNFSMountGui::CNFSMountGui()
{
// FIXME #warning move probing from exec() to fsmounter
m_nfs_sup = CFSMounter::FS_UNPROBED;
m_cifs_sup = CFSMounter::FS_UNPROBED;
m_lufs_sup = CFSMounter::FS_UNPROBED;
width = w_max (50, 10); //%
}
const char * nfs_entry_printf_string[3] =
{
"NFS %s:%s -> %s auto: %4s",
"CIFS //%s/%s -> %s auto: %4s",
"FTPFS %s/%s -> %s auto: %4s"
};
std::string CNFSMountGui::getEntryString(int i)
{
std::string res;
switch(g_settings.network_nfs[i].type) {
case CFSMounter::NFS: res = "NFS " + g_settings.network_nfs[i].ip + ":"; break;
case CFSMounter::CIFS: res = "CIFS //" + g_settings.network_nfs[i].ip + "/"; break;
case CFSMounter::LUFS: res = "FTPS " + g_settings.network_nfs[i].ip + "/"; break;
}
if (g_settings.network_nfs[i].dir.empty() || g_settings.network_nfs[i].local_dir.empty() || g_settings.network_nfs[i].ip.empty())
return "";
return res
+ FILESYSTEM_ENCODING_TO_UTF8(g_settings.network_nfs[i].dir)
+ " -> "
+ FILESYSTEM_ENCODING_TO_UTF8(g_settings.network_nfs[i].local_dir)
+ " (auto: "
+ g_Locale->getText(g_settings.network_nfs[i].automount ? LOCALE_MESSAGEBOX_YES : LOCALE_MESSAGEBOX_NO)
+ ")";
}
int CNFSMountGui::exec( CMenuTarget* parent, const std::string & actionKey )
{
//printf("exec: %s\n", actionKey.c_str());
int returnval = menu_return::RETURN_REPAINT;
if (m_nfs_sup == CFSMounter::FS_UNPROBED)
m_nfs_sup = CFSMounter::fsSupported(CFSMounter::NFS);
if (m_cifs_sup == CFSMounter::FS_UNPROBED)
m_cifs_sup = CFSMounter::fsSupported(CFSMounter::CIFS);
if (m_lufs_sup == CFSMounter::FS_UNPROBED)
m_lufs_sup = CFSMounter::fsSupported(CFSMounter::LUFS);
printf("SUPPORT: NFS: %d, CIFS: %d, LUFS: %d\n", m_nfs_sup, m_cifs_sup, m_lufs_sup);
if (actionKey.empty())
{
parent->hide();
for(int i=0 ; i < NETWORK_NFS_NR_OF_ENTRIES; i++)
{
m_entry[i] = getEntryString(i);
}
returnval = menu();
}
else if(actionKey == "rc_spkr")
{
int i = mountMenuWPtr->getSelected() - menu_offset;
if (i > -1 && i < NETWORK_NFS_NR_OF_ENTRIES) {
g_settings.network_nfs[i].ip = "";
g_settings.network_nfs[i].dir = "";
g_settings.network_nfs[i].local_dir = "";
g_settings.network_nfs[i].automount = 0;
g_settings.network_nfs[i].type = 0;
g_settings.network_nfs[i].username = "";
g_settings.network_nfs[i].password = "";
g_settings.network_nfs[i].mount_options1 = "ro,soft,udp";
g_settings.network_nfs[i].mount_options2 = "nolock,rsize=8192,wsize=8192";
g_settings.network_nfs[i].mac = "11:22:33:44:55:66";
m_entry[i] = getEntryString(i);
ISO_8859_1_entry[i] = ZapitTools::UTF8_to_Latin1(m_entry[i].c_str());
}
}
else if(actionKey.substr(0,10)=="refreshMAC")
{
int nr=atoi(actionKey.substr(10,1));
std::string h;
pinghost(g_settings.network_nfs[nr].ip, &h);
if (!h.empty()) {
FILE *arptable = fopen("/proc/net/arp", "r");
if (arptable) {
char line[120], ip[120], mac[120];
while (fgets(line, sizeof(line), arptable)) {
if (2 == sscanf(line, "%s %*s %*s %s %*[^\n]", ip, mac)) {
if (!strcmp(ip, h.c_str())) {
g_settings.network_nfs[nr].mac = std::string(mac);
break;
}
}
}
fclose(arptable);
}
}
}
else if(actionKey.substr(0,10)=="mountentry")
{
parent->hide();
returnval = menuEntry(actionKey[10]-'0');
for(int i=0 ; i < NETWORK_NFS_NR_OF_ENTRIES; i++)
{
m_entry[i] = getEntryString(i);
ISO_8859_1_entry[i] = ZapitTools::UTF8_to_Latin1(m_entry[i].c_str());
}
}
else if(actionKey.substr(0,7)=="domount")
{
int nr=atoi(actionKey.substr(7,1).c_str());
CFSMounter::MountRes mres = CFSMounter::mount(
g_settings.network_nfs[nr].ip, g_settings.network_nfs[nr].dir,
g_settings.network_nfs[nr].local_dir, (CFSMounter::FSType) g_settings.network_nfs[nr].type,
g_settings.network_nfs[nr].username, g_settings.network_nfs[nr].password,
g_settings.network_nfs[nr].mount_options1, g_settings.network_nfs[nr].mount_options2);
if (mres == CFSMounter::MRES_OK || mres == CFSMounter::MRES_FS_ALREADY_MOUNTED)
mountMenuEntry[nr]->iconName = NEUTRINO_ICON_MOUNTED;
else
mountMenuEntry[nr]->iconName = NEUTRINO_ICON_NOT_MOUNTED;
// TODO show msg in case of error
returnval = menu_return::RETURN_EXIT;
}
else if(actionKey.substr(0,3)=="dir")
{
parent->hide();
int nr=atoi(actionKey.substr(3,1).c_str());
chooserDir(g_settings.network_nfs[nr].local_dir, false, NULL);
returnval = menu_return::RETURN_REPAINT;
}
return returnval;
}
int CNFSMountGui::menu()
{
CMenuWidget mountMenuW(LOCALE_NFS_MOUNT, NEUTRINO_ICON_NETWORK, width);
mountMenuWPtr = &mountMenuW;
mountMenuW.addIntroItems();
mountMenuW.addKey(CRCInput::RC_spkr, this, "rc_spkr");
char s2[12];
for(int i=0 ; i < NETWORK_NFS_NR_OF_ENTRIES ; i++)
{
sprintf(s2,"mountentry%d",i);
ISO_8859_1_entry[i] = ZapitTools::UTF8_to_Latin1(m_entry[i].c_str());
mountMenuEntry[i] = new CMenuForwarder("", true, ISO_8859_1_entry[i], this, s2);
if (!i)
menu_offset = mountMenuW.getItemsCount();
if (CFSMounter::isMounted(g_settings.network_nfs[i].local_dir))
{
mountMenuEntry[i]->iconName = NEUTRINO_ICON_MOUNTED;
} else
{
mountMenuEntry[i]->iconName = NEUTRINO_ICON_NOT_MOUNTED;
}
mountMenuW.addItem(mountMenuEntry[i]);
}
int ret=mountMenuW.exec(this,"");
return ret;
}
// FIXME #warning MESSAGEBOX_NO_YES_XXX is defined in neutrino.cpp, too!
#define MESSAGEBOX_NO_YES_OPTION_COUNT 2
const CMenuOptionChooser::keyval MESSAGEBOX_NO_YES_OPTIONS[MESSAGEBOX_NO_YES_OPTION_COUNT] =
{
{ 0, LOCALE_MESSAGEBOX_NO },
{ 1, LOCALE_MESSAGEBOX_YES }
};
#define NFS_TYPE_OPTION_COUNT 3
const CMenuOptionChooser::keyval NFS_TYPE_OPTIONS[NFS_TYPE_OPTION_COUNT] =
{
{ CFSMounter::NFS , LOCALE_NFS_TYPE_NFS },
{ CFSMounter::CIFS, LOCALE_NFS_TYPE_CIFS } /*,
{ CFSMounter::LUFS, LOCALE_NFS_TYPE_LUFS } */
};
int CNFSMountGui::menuEntry(int nr)
{
int &type = g_settings.network_nfs[nr].type;
char cmd[9];
char cmd2[9];
snprintf(cmd, sizeof(cmd), "domount%d",nr);
snprintf(cmd2, sizeof(cmd2), "dir%d",nr);
/* rewrite fstype in new entries */
if(g_settings.network_nfs[nr].local_dir.empty())
{
if(m_cifs_sup != CFSMounter::FS_UNSUPPORTED && m_nfs_sup == CFSMounter::FS_UNSUPPORTED && m_lufs_sup == CFSMounter::FS_UNSUPPORTED)
type = (int) CFSMounter::CIFS;
else if(m_lufs_sup != CFSMounter::FS_UNSUPPORTED && m_cifs_sup == CFSMounter::FS_UNSUPPORTED && m_nfs_sup == CFSMounter::FS_UNSUPPORTED)
type = (int) CFSMounter::LUFS;
}
bool typeEnabled = (m_cifs_sup != CFSMounter::FS_UNSUPPORTED && m_nfs_sup != CFSMounter::FS_UNSUPPORTED && m_lufs_sup != CFSMounter::FS_UNSUPPORTED) ||
(m_cifs_sup != CFSMounter::FS_UNSUPPORTED && type != (int)CFSMounter::CIFS) ||
(m_nfs_sup != CFSMounter::FS_UNSUPPORTED && type != (int)CFSMounter::NFS) ||
(m_lufs_sup != CFSMounter::FS_UNSUPPORTED && type != (int)CFSMounter::LUFS);
CMenuWidget mountMenuEntryW(LOCALE_NFS_MOUNT, NEUTRINO_ICON_NETWORK, width);
mountMenuEntryW.addIntroItems();
CIPInput ipInput(LOCALE_NFS_IP, &g_settings.network_nfs[nr].ip, LOCALE_IPSETUP_HINT_1, LOCALE_IPSETUP_HINT_2);
CStringInputSMS dirInput(LOCALE_NFS_DIR, &g_settings.network_nfs[nr].dir, 30, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE,"abcdefghijklmnopqrstuvwxyz0123456789-_.,:|!?/ ");
CMenuOptionChooser *automountInput= new CMenuOptionChooser(LOCALE_NFS_AUTOMOUNT, &g_settings.network_nfs[nr].automount, MESSAGEBOX_NO_YES_OPTIONS, MESSAGEBOX_NO_YES_OPTION_COUNT, true);
CStringInputSMS options1Input(LOCALE_NFS_MOUNT_OPTIONS, &g_settings.network_nfs[nr].mount_options1, 30, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "abcdefghijklmnopqrstuvwxyz0123456789-_=.,:|!?/ ");
CMenuForwarder *options1_fwd = new CMenuForwarder(LOCALE_NFS_MOUNT_OPTIONS, true, g_settings.network_nfs[nr].mount_options1, &options1Input);
CStringInputSMS options2Input(LOCALE_NFS_MOUNT_OPTIONS, &g_settings.network_nfs[nr].mount_options2, 30, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "abcdefghijklmnopqrstuvwxyz0123456789-_=.,:|!?/ ");
CMenuForwarder *options2_fwd = new CMenuForwarder(LOCALE_NFS_MOUNT_OPTIONS, true, g_settings.network_nfs[nr].mount_options2, &options2Input);
CStringInputSMS userInput(LOCALE_NFS_USERNAME, &g_settings.network_nfs[nr].username, 30, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "abcdefghijklmnopqrstuvwxyz0123456789-_.,:|!?/ ");
CMenuForwarder *username_fwd = new CMenuForwarder(LOCALE_NFS_USERNAME, (type != (int)CFSMounter::NFS), g_settings.network_nfs[nr].username, &userInput);
CStringInputSMS passInput(LOCALE_NFS_PASSWORD, &g_settings.network_nfs[nr].password, 30, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "abcdefghijklmnopqrstuvwxyz0123456789-_.,:|!?/ ");
CMenuForwarder *password_fwd = new CMenuForwarder(LOCALE_NFS_PASSWORD, (type != (int)CFSMounter::NFS), NULL, &passInput);
CMACInput macInput(LOCALE_RECORDINGMENU_SERVER_MAC, &g_settings.network_nfs[nr].mac, LOCALE_IPSETUP_HINT_1, LOCALE_IPSETUP_HINT_2);
CMenuForwarder *macInput_fwd = new CMenuForwarder(LOCALE_RECORDINGMENU_SERVER_MAC, true, g_settings.network_nfs[nr].mac, &macInput);
CMenuForwarder *refreshMAC_fwd = new CMenuForwarder(LOCALE_NFS_REFRESH_MAC, true, NULL, this, ("refreshMAC" + to_string(nr)).c_str(), CRCInput::RC_yellow, NEUTRINO_ICON_BUTTON_YELLOW);
CMenuForwarder *mountnow_fwd = new CMenuForwarder(LOCALE_NFS_MOUNTNOW, !(CFSMounter::isMounted(g_settings.network_nfs[nr].local_dir)), NULL, this, cmd);
mountnow_fwd->setItemButton(NEUTRINO_ICON_BUTTON_OKAY, true);
COnOffNotifier notifier(CFSMounter::NFS);
notifier.addItem(username_fwd);
notifier.addItem(password_fwd);
mountMenuEntryW.addItem(new CMenuOptionChooser(LOCALE_NFS_TYPE, &type, NFS_TYPE_OPTIONS, NFS_TYPE_OPTION_COUNT, typeEnabled, &notifier));
mountMenuEntryW.addItem(new CMenuForwarder(LOCALE_NFS_IP , true, g_settings.network_nfs[nr].ip, &ipInput ));
mountMenuEntryW.addItem(new CMenuForwarder(LOCALE_NFS_DIR , true, g_settings.network_nfs[nr].dir, &dirInput ));
mountMenuEntryW.addItem(new CMenuForwarder(LOCALE_NFS_LOCALDIR, true, g_settings.network_nfs[nr].local_dir, this , cmd2));
mountMenuEntryW.addItem(automountInput);
mountMenuEntryW.addItem(options1_fwd);
mountMenuEntryW.addItem(options2_fwd);
mountMenuEntryW.addItem(username_fwd);
mountMenuEntryW.addItem(password_fwd);
mountMenuEntryW.addItem(macInput_fwd);
mountMenuEntryW.addItem(refreshMAC_fwd);
mountMenuEntryW.addItem(GenericMenuSeparatorLine);
mountMenuEntryW.addItem(mountnow_fwd);
int ret = mountMenuEntryW.exec(this,"");
return ret;
}
int CNFSUmountGui::exec( CMenuTarget* parent, const std::string & actionKey )
{
// printf("ac: %s\n", actionKey.c_str());
int returnval;
if (actionKey.empty())
{
parent->hide();
returnval = menu();
}
else if(actionKey.substr(0,8)=="doumount")
{
CFSMounter::umount((actionKey.substr(9)).c_str());
returnval = menu_return::RETURN_EXIT;
}
else
returnval = menu_return::RETURN_REPAINT;
return returnval;
}
int CNFSUmountGui::menu()
{
int count = 0;
CFSMounter::MountInfos infos;
CMenuWidget umountMenu(LOCALE_NFS_UMOUNT, NEUTRINO_ICON_NETWORK, width);
umountMenu.addIntroItems();
CFSMounter::getMountedFS(infos);
for (CFSMounter::MountInfos::const_iterator it = infos.begin();
it != infos.end();++it)
{
if(it->type == "nfs" || it->type == "cifs" || it->type == "lufs")
{
count++;
std::string s1 = it->device;
s1 += " -> ";
s1 += it->mountPoint;
std::string s2 = "doumount ";
s2 += it->mountPoint;
CMenuForwarder *forwarder = new CMenuForwarder(s1.c_str(), true, NULL, this, s2.c_str());
forwarder->iconName = NEUTRINO_ICON_MOUNTED;
umountMenu.addItem(forwarder);
}
}
if( !infos.empty() )
return umountMenu.exec(this,"");
else
return menu_return::RETURN_REPAINT;
}
int CNFSSmallMenu::exec( CMenuTarget* parent, const std::string & actionKey )
{
if (actionKey.empty())
{
CMenuWidget sm_menu(LOCALE_NFSMENU_HEAD, NEUTRINO_ICON_NETWORK, width);
CNFSMountGui mountGui;
CNFSUmountGui umountGui;
CMenuForwarder *remount_fwd = new CMenuForwarder(LOCALE_NFS_REMOUNT, true, NULL, this, "remount");
remount_fwd->setItemButton(NEUTRINO_ICON_BUTTON_OKAY, true);
sm_menu.addIntroItems();
sm_menu.addItem(remount_fwd);
sm_menu.addItem(new CMenuForwarder(LOCALE_NFS_MOUNT , true, NULL, & mountGui));
sm_menu.addItem(new CMenuForwarder(LOCALE_NFS_UMOUNT, true, NULL, &umountGui));
return sm_menu.exec(parent, actionKey);
}
else if(actionKey.substr(0,7) == "remount")
{
//umount automount dirs
for(int i = 0; i < NETWORK_NFS_NR_OF_ENTRIES; i++)
{
if(g_settings.network_nfs[i].automount)
umount2(g_settings.network_nfs[i].local_dir.c_str(),MNT_FORCE);
}
CFSMounter::automount();
return menu_return::RETURN_REPAINT;
}
return menu_return::RETURN_REPAINT;
}
const char * mntRes2Str(CFSMounter::MountRes res)
{
switch(res)
{
case CFSMounter::MRES_FS_NOT_SUPPORTED:
return g_Locale->getText(LOCALE_NFS_MOUNTERROR_NOTSUP);
break;
case CFSMounter::MRES_FS_ALREADY_MOUNTED:
return g_Locale->getText(LOCALE_NFS_ALREADYMOUNTED);
break;
case CFSMounter::MRES_TIMEOUT:
return g_Locale->getText(LOCALE_NFS_MOUNTTIMEOUT);
break;
case CFSMounter::MRES_UNKNOWN:
return g_Locale->getText(LOCALE_NFS_MOUNTERROR);
break;
case CFSMounter::MRES_OK:
return g_Locale->getText(LOCALE_NFS_MOUNTOK);
break;
default:
return g_Locale->getText(NONEXISTANT_LOCALE);
break;
}
}
const char * mntRes2Str(CFSMounter::UMountRes res)
{
switch(res)
{
case CFSMounter::UMRES_ERR:
return g_Locale->getText(LOCALE_NFS_UMOUNTERROR);
break;
case CFSMounter::UMRES_OK:
return g_Locale->getText(NONEXISTANT_LOCALE);
break;
default:
return g_Locale->getText(NONEXISTANT_LOCALE);
break;
}
}