diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 83071745ea..b42ac8e905 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,7 +16,17 @@ The license applies to all entries newer than 2009-04-28. */ -2011-02-01 01:56 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) +2011-02-01 01:56 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) + * contrib/hbnetio/utils/hbnetio/netiosrv.prg + * contrib/hbnetio/utils/hbnetio/netiocon.prg + + Added RPC and console command to save filters. + They will be reloaded automatically when starting + up the server daemon. + + * ChangeLog + ! Fixed previous entry header. + +2011-02-01 01:56 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * contrib/hbnetio/utils/hbnetio/netiosrv.prg + Keep order of filter lists. diff --git a/harbour/contrib/hbnetio/utils/hbnetio/netiocon.prg b/harbour/contrib/hbnetio/utils/hbnetio/netiocon.prg index 470fbf6f13..c9a29fa5a7 100644 --- a/harbour/contrib/hbnetio/utils/hbnetio/netiocon.prg +++ b/harbour/contrib/hbnetio/utils/hbnetio/netiocon.prg @@ -79,6 +79,7 @@ PROCEDURE hbnetiocon_cmdUI( cIP, nPort, cPassword ) "allowdeladmin" => { "" , "Remove allow filter for management connections" , {| cCommand | cmdConnFilterMod( pConnection, cCommand, "hbnetiomgm_allowdeladmin" ) } },; "blockaddadmin" => { "" , "Add block filter for management connections" , {| cCommand | cmdConnFilterMod( pConnection, cCommand, "hbnetiomgm_blockaddadmin" ) } },; "blockdeladmin" => { "" , "Remove block filter for management connections" , {| cCommand | cmdConnFilterMod( pConnection, cCommand, "hbnetiomgm_blockdeladmin" ) } },; + "filtsave" => { "" , "Save filters to disk." , {|| cmdConnFilterSave( pConnection ) } },; "stop" => { "[|all]", "Stop specified connection(s)." , {| cCommand | cmdConnStop( pConnection, cCommand ) } },; "clientinfo" => { "[" , "Show client details." , {| cCommand | cmdConnClientInfo( pConnection, cCommand ) } },; "quit" => { "" , "Stop server and exit console." , {|| cmdShutdown( pConnection ), lQuit := .T. } },; @@ -539,7 +540,7 @@ STATIC PROCEDURE cmdConnFilterMod( pConnection, cCommand, cRPC ) ELSE aToken := hb_ATokens( cCommand, " " ) IF Len( aToken ) > 1 - IF netio_funcexec( pConnection, cRPC, aToken[ 1 ] ) + IF netio_funcexec( pConnection, cRPC, aToken[ 2 ] ) QQOut( "Done", hb_eol() ) ELSE QQOut( "Failed", hb_eol() ) @@ -567,3 +568,13 @@ STATIC PROCEDURE cmdConnFilters( pConnection, lManagement ) ENDIF RETURN + +STATIC PROCEDURE cmdConnFilterSave( pConnection ) + + IF Empty( pConnection ) + QQOut( "Not connected.", hb_eol() ) + ELSE + netio_funcexec( pConnection, "hbnetiomgm_filtersave" ) + ENDIF + + RETURN diff --git a/harbour/contrib/hbnetio/utils/hbnetio/netiosrv.prg b/harbour/contrib/hbnetio/utils/hbnetio/netiosrv.prg index 56419405ce..526ff225bf 100644 --- a/harbour/contrib/hbnetio/utils/hbnetio/netiosrv.prg +++ b/harbour/contrib/hbnetio/utils/hbnetio/netiosrv.prg @@ -19,8 +19,7 @@ - gracefully shutting down server by waiting for connections to close and not accept new ones - pausing server - sort out console UI from server side output - - add support for subnet masks in allow/block lists, f.e. 172.16.0.0/12, and same for IPv6 - - option to make settings (allow/block lists) persistent by saving them in config file */ + - add support for subnet masks in allow/block lists, f.e. 172.16.0.0/12, and same for IPv6 */ #include "fileio.ch" @@ -185,6 +184,10 @@ PROCEDURE Main( ... ) ENDCASE NEXT + IF netiosrv_ConfLoad( netiosrv, netiomgm ) + OutStd( "Configuration loaded: " + netiosrv_ConfName() + hb_eol() ) + ENDIF + netiosrv[ _NETIOSRV_pListenSocket ] := ; netio_mtserver( netiosrv[ _NETIOSRV_nPort ],; netiosrv[ _NETIOSRV_cIFAddr ],; @@ -227,6 +230,7 @@ PROCEDURE Main( ... ) "hbnetiomgm_blockdeladmin" => {| ... | netiomgm_rpc_filtermod( netiomgm, netiomgm[ _NETIOSRV_hBlock ], .F., ... ) } ,; "hbnetiomgm_filters" => {| ... | netiomgm_rpc_filters( netiosrv ) } ,; "hbnetiomgm_filtersadmin" => {| ... | netiomgm_rpc_filters( netiomgm ) } ,; + "hbnetiomgm_filtersave" => {| ... | netiomgm_rpc_filtersave( netiosrv, netiomgm ) } ,; "hbnetiomgm_stop" => {| ... | netiomgm_rpc_stop( netiosrv, ... ) } ,; "hbnetiomgm_conn" => {| ... | netiomgm_rpc_conn( netiosrv, .T. ) } ,; "hbnetiomgm_noconn" => {| ... | netiomgm_rpc_conn( netiosrv, .F. ) } ,; @@ -274,6 +278,57 @@ PROCEDURE Main( ... ) RETURN +#define _NETIOSRV_SIGNATURE "netiosrv" + +STATIC FUNCTION netiosrv_ConfName() + RETURN hb_ProgName() + ".config" + +STATIC FUNCTION netiosrv_ConfSave( netiosrv, netiomgm ) + LOCAL hConf := { => } + +// hb_HKeepOrder( hConf, .T. ) + + hConf[ "signature" ] := _NETIOSRV_SIGNATURE + hConf[ "version" ] := 1 + hConf[ "srv.showconn" ] := netiosrv[ _NETIOSRV_lShowConn ] + hConf[ "srv.allow" ] := netiosrv[ _NETIOSRV_hAllow ] + hConf[ "srv.block" ] := netiosrv[ _NETIOSRV_hBlock ] + hConf[ "mgm.showconn" ] := netiomgm[ _NETIOSRV_lShowConn ] + hConf[ "mgm.allow" ] := netiomgm[ _NETIOSRV_hAllow ] + hConf[ "mgm.block" ] := netiomgm[ _NETIOSRV_hBlock ] + + RETURN hb_MemoWrit( netiosrv_ConfName(), hb_Serialize( hConf ) ) + +STATIC FUNCTION netiosrv_ConfLoad( netiosrv, netiomgm ) + LOCAL hConf := hb_Deserialize( hb_MemoRead( netiosrv_ConfName() ) ) + + IF hb_isHash( hConf ) .AND. ; + "signature" $ hConf .AND. ; + hConf[ "signature" ] == _NETIOSRV_SIGNATURE + + IF "srv.showconn" $ hConf + netiosrv[ _NETIOSRV_lShowConn ] := hConf[ "srv.showconn" ] + ENDIF + IF "srv.allow" $ hConf + netiosrv[ _NETIOSRV_hAllow ] := hConf[ "srv.allow" ] + ENDIF + IF "srv.block" $ hConf + netiosrv[ _NETIOSRV_hBlock ] := hConf[ "srv.block" ] + ENDIF + IF "mgm.showconn" $ hConf + netiomgm[ _NETIOSRV_lShowConn ] := hConf[ "mgm.showconn" ] + ENDIF + IF "mgm.allow" $ hConf + netiomgm[ _NETIOSRV_hAllow ] := hConf[ "mgm.allow" ] + ENDIF + IF "mgm.block" $ hConf + netiomgm[ _NETIOSRV_hBlock ] := hConf[ "mgm.block" ] + ENDIF + RETURN .T. + ENDIF + + RETURN .F. + STATIC FUNCTION netiosrv_config( netiosrv, netiomgm ) LOCAL aArray := {; "Listening on: " + netiosrv[ _NETIOSRV_cIFAddr ] + ":" + hb_ntos( netiosrv[ _NETIOSRV_nPort ] ),; @@ -647,6 +702,9 @@ STATIC FUNCTION netiomgm_rpc_filters( netiosrv ) RETURN aArray +STATIC FUNCTION netiomgm_rpc_filtersave( netiosrv, netiomgm ) + RETURN netiosrv_ConfSave( netiosrv, netiomgm ) + STATIC FUNCTION ConnStatusStr( nStatus ) SWITCH nStatus