#! /bin/sh # -*- tcl -*- \ exec tclsh "$0" ${1+"$@"} # @@ Meta Begin # Application nnsd 1.0.1 # Meta platform tcl # Meta summary Nano Name Service Demon # Meta description This application is a simple demon on top # Meta description of the nano name service facilities # Meta subject {name service} server demon # Meta require {Tcl 8.4} # Meta require comm # Meta require logger # Meta require interp # Meta require nameserv::common # Meta require nameserv::server # Meta author Andreas Kupries # Meta license BSD # @@ Meta End package provide nnsd 1.0.1 # nnsd - Nano Name Service Demon # ==== = ======================= # # Use cases # --------- # # (1) Run a simple trusted name service on some host. # # Command syntax # -------------- # # Ad 1) nnsd ?-localonly BOOL? ?-port PORT? # # Run the server. If no port is specified the default port 38573 # is used to listen for client. The option -localonly determines # what connections are acceptable, local only (default), or # remote connections as well. Local connections are whose # originating from the same host which is running the server. # Remote connections come from other hosts. lappend auto_path [file join [file dirname [file dirname [file normalize [info script]]]] modules] package require nameserv::server namespace eval ::nnsd {} proc ::nnsd::ProcessCommandLine {} { global argv # Process the options, perform basic validation. while {[llength $argv]} { set opt [lindex $argv 0] if {![string match "-*" $opt]} break switch -exact -- $opt { -localonly { if {[llength $argv] % 2 == 1} Usage # Todo: Check boolean set local [lindex $argv 1] set argv [lrange $argv 2 end] nameserv::server::configure -localonly $local } -port { if {[llength $argv] % 2 == 1} Usage # Todo: Check non-zero unsigned short integer set port [lindex $argv 1] set argv [lrange $argv 2 end] nameserv::server::configure -port $port } -debug { # Undocumented. Activate the logger services provided # by various packages. logger::setlevel debug set argv [lrange $argv 1 end] } default { Usage } } } # Additional validation, and extraction of the non-option # arguments. Of which this application has none. if {[llength $argv]} Usage return } proc ::nnsd::Usage {} { global argv0 puts stderr "$argv0 wrong#args, expected:\ ?-localonly BOOL? ?-port PORT?" exit 1 } proc ::nnsd::ArgError {text} { global argv0 puts stderr "$argv0: $text" exit 1 } proc bgerror {args} { puts stderr $args puts stderr $::errorInfo return } # ### ### ### ######### ######### ######### ## Main proc ::nnsd::Headline {} { global argv0 set p [nameserv::server::cget -port] set l [expr {[nameserv::server::cget -localonly] ? "local only" : "local & remote"}] puts "$argv0 [package require nnsd], listening on $p ($l)" return } proc ::nnsd::Do {} { global argv0 ProcessCommandLine nameserv::server::start Headline vwait forever return } # ### ### ### ######### ######### ######### ## Invoking the functionality. if {[catch { ::nnsd::Do } msg]} { puts $::errorInfo #::nnsd::ArgError $msg } # ### ### ### ######### ######### ######### exit