14 files changed, 174 insertions, 54 deletions
diff --git a/noncore/settings/networksettings2/activateprofileGUI.ui b/noncore/settings/networksettings2/activateprofileGUI.ui index 12ab051..861ce96 100644 --- a/noncore/settings/networksettings2/activateprofileGUI.ui +++ b/noncore/settings/networksettings2/activateprofileGUI.ui @@ -11,7 +11,7 @@ <rect> <x>0</x> <y>0</y> - <width>231</width> + <width>219</width> <height>121</height> </rect> </property> @@ -40,6 +40,9 @@ <name>name</name> <cstring>Layout2</cstring> </property> + <property> + <name>layoutSpacing</name> + </property> <hbox> <property stdset="1"> <name>margin</name> @@ -47,7 +50,7 @@ </property> <property stdset="1"> <name>spacing</name> - <number>6</number> + <number>0</number> </property> <widget> <class>QLabel</class> @@ -56,6 +59,13 @@ <cstring>TextLabel1</cstring> </property> <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> <name>text</name> <string>Select profile to activate for </string> </property> @@ -67,6 +77,13 @@ <cstring>DeviceName_LBL</cstring> </property> <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> <name>text</name> <string>TextLabel2</string> </property> @@ -82,4 +99,12 @@ </widget> </vbox> </widget> +<connections> + <connection> + <sender>Profiles_LB</sender> + <signal>doubleClicked(QListBoxItem*)</signal> + <receiver>ActivateProfileGUI</receiver> + <slot>accept()</slot> + </connection> +</connections> </UI> diff --git a/noncore/settings/networksettings2/activatevpn.cpp b/noncore/settings/networksettings2/activatevpn.cpp index b75e623..768a031 100644 --- a/noncore/settings/networksettings2/activatevpn.cpp +++ b/noncore/settings/networksettings2/activatevpn.cpp @@ -18,17 +18,18 @@ MyCheckListItem::MyCheckListItem( NodeCollection * N, QListView * V ): NC = N; } -ActivateVPN::ActivateVPN( void ) : +ActivateVPN::ActivateVPN( const QString & I ) : ActivateVPNGUI( 0, 0, TRUE ), NSD() { QCheckListItem * CI; VPN_LV->clear(); VPN_LV->header()->hide(); + // find all connections that want to be triggered by this interface for( QDictIterator<NodeCollection> it(NSResources->connections()); it.current(); ++it ) { - if( it.current()->triggeredBy( "vpn" ) ) { + if( it.current()->triggeredBy( I ) ) { CI = new MyCheckListItem( it.current(), VPN_LV ); } } diff --git a/noncore/settings/networksettings2/activatevpn.h b/noncore/settings/networksettings2/activatevpn.h index 5794757..49a940b 100644 --- a/noncore/settings/networksettings2/activatevpn.h +++ b/noncore/settings/networksettings2/activatevpn.h @@ -7,7 +7,7 @@ class ActivateVPN : public ActivateVPNGUI { public : - ActivateVPN( void ); + ActivateVPN( const QString & Interface ); ~ActivateVPN( void ); public slots : diff --git a/noncore/settings/networksettings2/main.cpp b/noncore/settings/networksettings2/main.cpp index 973b4b7..2243826 100644 --- a/noncore/settings/networksettings2/main.cpp +++ b/noncore/settings/networksettings2/main.cpp @@ -23,10 +23,12 @@ OPIE_EXPORT_APP( OApplicationFactory<NetworkSettings> ) #define ACT_REGEN 2 // used by interfaces to request user prompt #define ACT_PROMPT 3 -// used by interfaces to trigger VPN -#define ACT_VPN 4 +// used by interfaces to trigger VPN prompting +#define ACT_TRIGGERVPN 4 // activate opietooth #define ACT_OT 5 +// prompt for VPN networks +#define ACT_PROMPTVPN 6 // include Opietooth GUI #include <opietooth2/Opietooth.h> @@ -56,7 +58,11 @@ int main( int argc, char * argv[] ) { Action = ACT_PROMPT; rmv = 1; } else if( strcmp( argv[i], "--triggervpn" ) == 0 ) { - Action = ACT_VPN; + GuiType = QApplication::Tty; + Action = ACT_TRIGGERVPN; + rmv = 1; + } else if( strcmp( argv[i], "--promptvpn" ) == 0 ) { + Action = ACT_PROMPTVPN; rmv = 1; } else if( strcmp( argv[i], "--opietooth" ) == 0 ) { Action = ACT_OT; @@ -95,15 +101,24 @@ int main( int argc, char * argv[] ) { case ACT_REQUEST : { NetworkSettingsData NS; if( NS.canStart( argv[1] ) ) { + QStringList SL; + SL << QPEApplication::qpeDir() + "bin/networksettings2" + << "--prompt" + << argv[1]; + // exec synchronous -> blocks + NSResources->system().execAsUser( SL, 1 ); + } + } + break; + case ACT_TRIGGERVPN : + { NetworkSettingsData NS; + if( NS.couldBeTriggered( argv[1] ) ) { + // there are VPNS that can be triggered QStringList S; - S << QPEApplication::qpeDir() + "/bin/networksettings2"; - S << "networksettings2"; - S << "--prompt"; + S << QPEApplication::qpeDir() + "bin/networksettings2"; + S << "--promptvpn"; S << argv[1]; NSResources->system().execAsUser( S ); - Log(("FAILED %s-cNN-allowed\n", argv[1] )); - // if we come here , failed - printf( "%s-cNN-disallowed", argv[1] ); } } break; @@ -117,17 +132,18 @@ int main( int argc, char * argv[] ) { case ACT_PROMPT : { ActivateProfile AP(argv[1]); if( AP.exec() == QDialog::Accepted ) { - Log(("%s-c%ld-allowed\n", - argv[1], AP.selectedProfile() )); - printf( "%s-c%ld-allowed", argv[1], AP.selectedProfile() ); + Log(("allow profile %ld for %s\n", + AP.selectedProfile(), argv[1] )); + printf( "A%ld%s\n", AP.selectedProfile(), argv[1] ); } else { - Log(("%s-c%NN-disallowed\n", argv[1] )); - printf( "%s-cNN-disallowed", argv[1] ); + Log(("disallow %s\n", argv[1] )); + printf( "D-%s\n", argv[1] ); } } break; - case ACT_VPN : - { ActivateVPN AVPN; + case ACT_PROMPTVPN : + { ActivateVPN AVPN( argv[1] ); + Log(("Trigger vpns on interface %s\n", argv[1] )); AVPN.exec(); } break; diff --git a/noncore/settings/networksettings2/network/network_NNI.cpp b/noncore/settings/networksettings2/network/network_NNI.cpp index 78e6545..34dac54 100644 --- a/noncore/settings/networksettings2/network/network_NNI.cpp +++ b/noncore/settings/networksettings2/network/network_NNI.cpp @@ -116,10 +116,10 @@ short ANetwork::generateFile( SystemFile &SF, // we can safely call from here since device item is deeper if( Data.UseDHCP ) { SF << "iface " - << NIC - << "-c" + << "A" << connection()->number() - << "-allowed inet dhcp" + << NIC + << " inet dhcp" << endl; SF << " up echo \"" << NIC @@ -139,9 +139,10 @@ short ANetwork::generateFile( SystemFile &SF, << endl; } else { SF << "iface " - << NIC << "-c" + << "A" << connection()->number() - << "-allowed inet static" + << NIC + << " inet static" << endl; SF << " up echo \"" << NIC diff --git a/noncore/settings/networksettings2/network/networkrun.cpp b/noncore/settings/networksettings2/network/networkrun.cpp index 2c93d9d..74467ad 100644 --- a/noncore/settings/networksettings2/network/networkrun.cpp +++ b/noncore/settings/networksettings2/network/networkrun.cpp @@ -6,7 +6,7 @@ State_t NetworkRun::detectState( void ) { InterfaceInfo * II = nodeCollection()->assignedInterface(); - Log(( "Interface %p : %d\n", II, (II) ? II->IsUp : 0 )); + Log(( "Interface %p %p : %d\n", II, nodeCollection(), (II) ? II->IsUp : 0 )); if( II && II->IsUp ) { // device has assigned interface return IsUp; @@ -38,9 +38,10 @@ QString NetworkRun::setMyState( NodeCollection * NC, Action_t A, bool ) { return QString(); } - SL << QString().sprintf( "%s=%s-c%d-allowed", - II->Name.latin1(), II->Name.latin1(), - nodeCollection()->number() ); + SL << QString().sprintf( "%s=A%ld%s", + II->Name.latin1(), + nodeCollection()->number(), + II->Name.latin1() ); if( ! NSResources->system().runAsRoot( SL ) ) { return QString("Cannot call %1").arg(SL.join(" ")); diff --git a/noncore/settings/networksettings2/networksettings2/resources.cpp b/noncore/settings/networksettings2/networksettings2/resources.cpp index 3479abb..b81dcaa 100644 --- a/noncore/settings/networksettings2/networksettings2/resources.cpp +++ b/noncore/settings/networksettings2/networksettings2/resources.cpp @@ -247,6 +247,8 @@ const QString & TheNSResources::netNode2Description( const char * s ) { void TheNSResources::addConnection( NodeCollection * NC, bool Dangling ) { ANetNodeInstance * NNI; + Log(( "Add Connection %s, Dangling %d\n", + NC->name().latin1(), Dangling )); if( Dangling ) { DanglingConnectionsMap.insert( NC->name(), NC ); } else { diff --git a/noncore/settings/networksettings2/networksettings2/resources.h b/noncore/settings/networksettings2/networksettings2/resources.h index b27cda1..51c4250 100644 --- a/noncore/settings/networksettings2/networksettings2/resources.h +++ b/noncore/settings/networksettings2/networksettings2/resources.h @@ -110,7 +110,7 @@ public : Name2Connection_t & connections( void ) { return ConnectionsMap; } Name2Connection_t & danglingConnections( void ) - { return ConnectionsMap; } + { return DanglingConnectionsMap; } inline bool userKnown( void ) { return CurrentUser.known(); } diff --git a/noncore/settings/networksettings2/networksettings2/system.cpp b/noncore/settings/networksettings2/networksettings2/system.cpp index f027d35..a290f08 100644 --- a/noncore/settings/networksettings2/networksettings2/system.cpp +++ b/noncore/settings/networksettings2/networksettings2/system.cpp @@ -63,7 +63,7 @@ int System::runAsRoot( QStringList & S, MyProcess * Prc ) { char * usr = getenv("USER"); if( S.count() == 0 ) { - // loophole to start shell + // close loophole to start shell return 8888; } if( usr == 0 || strcmp( usr, "root" ) ) { @@ -119,12 +119,13 @@ int System::runAsRoot( QStringList & S, MyProcess * Prc ) { return 1; } -int System::execAsUser( QStringList & SL ) { +int System::execAsUser( QStringList & SL, bool Synchronous ) { MyProcess * P = new MyProcess(); CurrentQPEUser CU = NSResources->currentUser(); char * usr = getenv("USER"); - if( strcmp( usr, "root" ) == 0 ) { + if( usr == 0 || + strcmp( usr, "root" ) == 0 ) { // find user running qpe if( CU.UserName.isEmpty() ) { // if we come here, the exec was not successfull @@ -153,16 +154,21 @@ int System::execAsUser( QStringList & SL ) { CU.UserName.latin1(), SL.join( " " ).latin1() )); - int rv = ( P->process().start( OProcess::DontCare, - OProcess::NoCommunication ) ); + P->setEchoMode( Synchronous ); + + bool rv = P->process().start( + (Synchronous) ? OProcess::Block : + OProcess::DontCare, + (Synchronous) ? OProcess::AllOutput : + OProcess::NoCommunication ); delete P; - if( rv ) { + if( ! rv ) { // if we come here, the exec was not successfull Log(("Could not exec : %d\n", errno )); } - return ! rv; + return rv; } void System::SLOT_ProcessExited( MyProcess * P ) { @@ -541,6 +547,11 @@ MyProcess::~MyProcess() { } void MyProcess::SLOT_Stdout( Opie::Core::OProcess * , char * Buf, int len ) { + if( EchoMode ) { + write( 1, Buf, len ); + return; + } + char * LB = (char *)alloca( len + 1 ); memcpy( LB, Buf, len ); LB[len] = '\0'; @@ -562,6 +573,11 @@ void MyProcess::SLOT_Stdout( Opie::Core::OProcess * , char * Buf, int len ) { } void MyProcess::SLOT_Stderr( Opie::Core::OProcess * , char * Buf, int len ) { + if( EchoMode ) { + write( 2, Buf, len ); + return; + } + char * LB = (char *)alloca( len + 1 ); memcpy( LB, Buf, len ); LB[len] = '\0'; diff --git a/noncore/settings/networksettings2/networksettings2/system.h b/noncore/settings/networksettings2/networksettings2/system.h index f7a7274..ebee0d5 100644 --- a/noncore/settings/networksettings2/networksettings2/system.h +++ b/noncore/settings/networksettings2/networksettings2/system.h @@ -29,6 +29,10 @@ public : inline OProcess & process() { return *P; } + inline void setEchoMode( bool M ) { + EchoMode = M; + } + public slots : void SLOT_Stdout( Opie::Core::OProcess * P, char *, int ); @@ -46,6 +50,8 @@ private : QString StdoutBuffer; QString StderrBuffer; OProcess * P; + // output all output to my output + bool EchoMode; }; class InterfaceInfo { @@ -104,7 +110,7 @@ public : int runAsRoot( QStringList & S, MyProcess * Prc = 0 ); // exec command as user - int execAsUser( QStringList & Cmd ); + int execAsUser( QStringList & Cmd, bool Synchronous = 0 ); // refresh stats for this interface void refreshStatistics( InterfaceInfo & ); diff --git a/noncore/settings/networksettings2/networksettings2/systemfile.cpp b/noncore/settings/networksettings2/networksettings2/systemfile.cpp index 1b1988e..0314765 100644 --- a/noncore/settings/networksettings2/networksettings2/systemfile.cpp +++ b/noncore/settings/networksettings2/networksettings2/systemfile.cpp @@ -136,7 +136,6 @@ bool SystemFile::close( void ) { F = 0; if( ! InAppend ) { - odebug << "Rename " << OldP << " to " << Path << oendl; return ( rename( OldP.latin1(), Path.latin1() ) >= 0 ); } return 1; diff --git a/noncore/settings/networksettings2/nsdata.cpp b/noncore/settings/networksettings2/nsdata.cpp index d76353a..39031ed 100644 --- a/noncore/settings/networksettings2/nsdata.cpp +++ b/noncore/settings/networksettings2/nsdata.cpp @@ -61,6 +61,8 @@ NetworkSettingsData::NetworkSettingsData( void ) { if( NC ) { NC->assignInterface( NSResources->system().findInterface( interfacename ) ); + Log(( "Assign interface %p\n", + NC->assignedInterface() )); } else { Log(( "Profile nr %d no longer defined\n", profilenr )); @@ -643,7 +645,8 @@ QString NetworkSettingsData::generateSettings( void ) { return S; } -QList<NodeCollection> NetworkSettingsData::collectPossible( const char * Interface ) { +QList<NodeCollection> NetworkSettingsData::collectPossible( + const QString & Interface ) { // collect connections that can work on top of this interface NodeCollection * NC; QList<NodeCollection> PossibleConnections; @@ -656,10 +659,11 @@ QList<NodeCollection> NetworkSettingsData::collectPossible( const char * Interfa NC = it.current(); // check if this profile handles the requested interface if( NC->handlesInterface( Interface ) && // if different Intf. - NC->state() != Disabled && // if not enabled + NC->state() != Disabled && // if enabled NC->state() != IsUp // if already used ) { - Log( ( "Append %s for %s\n", NC->name().latin1(), Interface)); + Log( ( "Append %s for %s\n", + NC->name().latin1(), Interface.latin1() )); PossibleConnections.append( NC ); } } @@ -673,7 +677,7 @@ QList<NodeCollection> NetworkSettingsData::collectPossible( const char * Interfa if allowed, echo Interface-allowed else Interface-disallowed */ -bool NetworkSettingsData::canStart( const char * Interface ) { +bool NetworkSettingsData::canStart( const QString & Interface ) { // load situation NodeCollection * NC = 0; QList<NodeCollection> PossibleConnections; @@ -681,7 +685,7 @@ bool NetworkSettingsData::canStart( const char * Interface ) { PossibleConnections = collectPossible( Interface ); Log( ( "for %s : Possiblilies %d\n", - Interface, PossibleConnections.count() )); + Interface.latin1(), PossibleConnections.count() )); switch( PossibleConnections.count() ) { case 0 : // no connections break; @@ -706,8 +710,8 @@ bool NetworkSettingsData::canStart( const char * Interface ) { { QString S= NC->setState( Activate ); if( ! S.isEmpty() ) { // could not bring device Online -> try other alters - Log(( "%s-c%d-disallowed : %s\n", - Interface, NC->number(), S.latin1() )); + Log(( "disallow %ld for %s : %s\n", + NC->number(), Interface.latin1(), S.latin1() )); break; } // interface assigned @@ -716,15 +720,15 @@ bool NetworkSettingsData::canStart( const char * Interface ) { case Available : case IsUp : // also called for 'ifdown' // device is ready -> done - Log(( "%s-c%d-allowed\n", Interface, NC->number() )); - printf( "%s-c%d-allowed\n", Interface, NC->number() ); + Log(( "allow %ld for %s\n", NC->number(), Interface.latin1())); + printf( "A%ld%s\n", NC->number(), Interface.latin1() ); return 0; } } // if we come here no alternatives are possible - Log(( "%s-cnn-disallowed\n", Interface )); - printf( "%s-cnn-disallowed\n", Interface ); + Log(( "disallow %s\n", Interface.latin1())); + printf( "D-%s\n", Interface.latin1() ); return 0; } @@ -741,3 +745,43 @@ bool NetworkSettingsData::isModified( void ) { } return 0; } + +bool NetworkSettingsData::couldBeTriggered( const QString & Interface ) { + // load situation + QList<NodeCollection> PossibleTriggered; + + PossibleTriggered = collectTriggered( Interface ); + + Log( ( "for %s : Possiblilies %d\n", + Interface.latin1(), PossibleTriggered.count() )); + + return ( PossibleTriggered.count() ) ? 1 : 0; +} + +QList<NodeCollection> NetworkSettingsData::collectTriggered( + const QString & Interface ) { + + // collect connections that could be triggered by this interface + NodeCollection * NC; + QList<NodeCollection> PossibleTriggered; + + // for all connections + Name2Connection_t & M = NSResources->connections(); + + for( QDictIterator<NodeCollection> it(M); + it.current(); + ++it ) { + NC = it.current(); + // check if this profile handles the requested interface + if( NC->triggeredBy( Interface ) && // if different Intf. + NC->state() != Disabled && // if enabled + NC->state() != IsUp // if already used + ) { + Log( ( "Append %s for %s\n", + NC->name().latin1(), Interface.latin1() )); + PossibleTriggered.append( NC ); + } + } + return PossibleTriggered; +} + diff --git a/noncore/settings/networksettings2/nsdata.h b/noncore/settings/networksettings2/nsdata.h index a0ae7d1..5791c1e 100644 --- a/noncore/settings/networksettings2/nsdata.h +++ b/noncore/settings/networksettings2/nsdata.h @@ -19,12 +19,16 @@ public : inline void setModified( bool M ) { ForceModified = M; } - QList<NodeCollection> collectPossible( const char * Interface ); + QList<NodeCollection> collectPossible( const QString & Interface ); // return TRUE if we need gui to decide - bool canStart( const char * Interface ); + bool canStart( const QString & Interface ); + // return TRUE if there are vpns that could be triggered + // by this interface + bool couldBeTriggered( const QString & Interface ); private : + QList<NodeCollection> collectTriggered( const QString &Interface ); bool ForceModified; // collect strings in config file nobody wants diff --git a/noncore/settings/networksettings2/profile/profile_NNI.cpp b/noncore/settings/networksettings2/profile/profile_NNI.cpp index a1e1254..fc2d809 100644 --- a/noncore/settings/networksettings2/profile/profile_NNI.cpp +++ b/noncore/settings/networksettings2/profile/profile_NNI.cpp @@ -1,3 +1,4 @@ +#include <qpe/qpeapplication.h> #include <opie2/odebug.h> #include "profileedit.h" #include "profile_NNI.h" @@ -62,7 +63,11 @@ short AProfile::generateFileEmbedded( SystemFile & SF, Log(("Generate Profile for %s\n", SF.name().latin1() )); if( Data.TriggerVPN ) { // this profile triggers VPN -> insert trigger - SF << " up networksettings2 --triggervpn" + SF << " up " + << QPEApplication::qpeDir() + << "bin/networksettings2 --triggervpn " + << runtime()->device()->netNode()->nodeClass()->genNic( DevNr ) + << " || true" << endl; rvl = 0; } |