]> git.entuzijast.net Git - imunes.git/commitdiff
Allow for multiple independent experiments to run in parallel.
authormarko <marko>
Thu, 1 Nov 2007 10:42:27 +0000 (10:42 +0000)
committermarko <marko>
Thu, 1 Nov 2007 10:42:27 +0000 (10:42 +0000)
Each experiment is dynamically assigned an experiment id (eid) which
it then uses throughout its lifetime.  By default the eid is
constructed by appending the process id of the tcl interpreter to
the prefix "imunes_".  All vimages and netgraph nodes corresponding
to virtual nodes in an experiment are created as child nodes of
a "controlling" vimage which has the same name as eid.  All virtual
node specific temporary directories / files are created as
subdirectories in /tmp/$eid directory.

vimageCleanup function is modified to destroy / cleanup only those
vimages / netgraph nodes bellow and including the controlling
vimage for the given experiment.  Temporary files in /tmp/$eid are
no longer automatically deleted.

Bug found by:
Submitted by:
Reviewed by:
Approved by:
Obtained from:

exec.tcl
filemgmt.tcl
imunes.tcl

index 43f6183e9a6bca4704712fd3f1bc3ee8d38ad1fe..ef536a295af7ddec66739d3863d1c644ec67741b 100755 (executable)
--- a/exec.tcl
+++ b/exec.tcl
@@ -1,4 +1,4 @@
-# $Id: exec.tcl,v 1.60 2007/10/29 16:25:23 marko Exp $
+# $Id: exec.tcl,v 1.61 2007/11/01 10:42:27 marko Exp $
 
 # Copyright 2004, 2005 University of Zagreb, Croatia.  All rights reserved.
 #
@@ -97,7 +97,7 @@ proc nexec { args } {
 #   * mode -- the new operating mode. Can be edit or exec.
 #****
 proc setOperMode { mode } {
-    global oper_mode activetool node_list
+    global oper_mode eid activetool node_list
     global editor_only remote_exec execSock
     global undolevel redolevel
 
@@ -159,7 +159,7 @@ proc setOperMode { mode } {
        }
     } else {
        if {$oper_mode != "edit"} {
-           vimageCleanup
+           vimageCleanup $eid
            .menubar.tools entryconfigure "Auto rearrange all" -state normal
            .menubar.tools entryconfigure "Auto rearrange selected" -state normal
        }
@@ -360,10 +360,11 @@ proc l3node.start { eid node } {
     global viewcustomid
     
     set node_id "$eid\.$node"
+    set node_dir "/tmp/$eid/$node"
 
-    nexec rm -fr /tmp/$node_id
-    nexec mkdir /tmp/$node_id
-    nexec chmod 1777 /tmp/$node_id
+    nexec rm -fr $node_dir
+    nexec mkdir $node_dir
+    nexec chmod 1777 $node_dir
     foreach ifc [ifcList $node] {
        set mtu [getIfcMTU $node $ifc]
        nexec vimage $node_id ifconfig $ifc mtu $mtu
@@ -397,7 +398,7 @@ proc l3node.start { eid node } {
     set ipsecCfg ""
     if { [getIpsecEnabled $node] == true } {
        set setkeycfg [ipsecCfggen $node]
-       set setkeyFileId [open /tmp/$node_id/setkey.conf w+]
+       set setkeyFileId [open $node_dir/setkey.conf w+]
        foreach line $setkeycfg {
            puts $setkeyFileId $line
        }
@@ -405,7 +406,7 @@ proc l3node.start { eid node } {
 
        set errorstr ""
        set error [catch "nexec vimage $node_id setkey -f \
-           /tmp/$node_id/setkey.conf" errorstr]
+           $node_dir/setkey.conf" errorstr]
        if { $error == "1" } {
            setkeyError $node_id $errorstr
        }
@@ -416,20 +417,20 @@ proc l3node.start { eid node } {
        set bootcmd [[typemodel $node].bootcmd $node]
     }
     if { ! $remote_exec } {
-       set fileId [open /tmp/$node_id/boot.conf w]
+       set fileId [open $node_dir/boot.conf w]
        foreach line $bootcfg {
            puts $fileId $line
        }
        close $fileId
     } else {
-       nexec create_conf_file /tmp/$node_id/boot.conf
+       nexec create_conf_file $node_dir/boot.conf
        foreach line $bootcfg {
            puts $execSock $line
        }
        nexec close_conf_file
     }
 
-    catch "nexec vimage $node_id $bootcmd /tmp/$node_id/boot.conf &"
+    catch "nexec vimage $node_id $bootcmd $node_dir/boot.conf &"
 }
 
 #****f* exec.tcl/l3node.shutdown 
@@ -483,7 +484,7 @@ proc l3node.destroy { eid node } {
        }
     }
     catch {nexec vimage -d $node_id}
-    nexec rm -fr /tmp/$node_id
+    nexec rm -fr $node_dir
 }
 
 
@@ -510,11 +511,12 @@ proc deployCfg {} {
 
     set t_start [clock seconds]
 
-    vimageCleanup
+    vimageCleanup $eid
 
     catch { nexec vimage -c $eid }
+    catch { nexec rm -fr /tmp/$eid }
+    catch { nexec mkdir /tmp/$eid }
 
-    catch { nexec mv /etc/resolv.conf /etc/resolv.conf.bak }
     catch { nexec kldload ng_ether }
     catch { nexec kldload ng_iface }
     catch { nexec kldload ng_eiface }
@@ -602,10 +604,12 @@ proc deployCfg {} {
        }
     }
 
+    # XXX move those to some quagga specific script
+    # XXX race if starting two imunes instances simultaneously
     nexec rm -fr /var/run/quagga
     nexec rm -f /usr/local/etc/quagga/Quagga.conf
-    catch { nexec ln -s /tmp/@ /var/run/quagga }
-    catch { nexec ln -s /tmp/@/boot.conf /usr/local/etc/quagga/Quagga.conf }
+    catch { nexec ln -s /tmp/$eid/@ /var/run/quagga }
+    catch { nexec ln -s /tmp/$eid/@/boot.conf /usr/local/etc/quagga/Quagga.conf }
     foreach file { bgpd ospfd ospf6d ripd ripngd vtysh zebra } {
        catch { nexec cp /dev/null /usr/local/etc/quagga/$file.conf }
     }
@@ -633,11 +637,14 @@ proc deployCfg {} {
 #   Called in special circumstances only. If cleans all 
 #   the imunes objects from the kernel (vimages and netgraph nodes).
 #****
-proc vimageCleanup {} {
+proc vimageCleanup { eid } {
     global .c
 
     set t_start [clock seconds]
-    set vimages [join [nexec vimage -l | fgrep -v "    " | cut -d: -f 1]]
+    if { [catch {nexec vimage $eid vimage -l | fgrep -v "    " | cut -d: -f 1} res] != 0 } {
+       return
+    }
+    set vimages [join $res]
     set defindex [lsearch $vimages .]
     set vimages [lreplace $vimages $defindex $defindex]
 
@@ -645,32 +652,31 @@ proc vimageCleanup {} {
     foreach vimage $vimages {
        set stattxt "Terminating processes in vimage $vimage"
        statline $stattxt
-       catch {nexec vimage $vimage kill -9 -1 2> /dev/null}
+       catch {nexec vimage $eid.$vimage kill -9 -1 2> /dev/null}
     }
 
     # Detach / destroy / reassign interfaces pipe, eiface, iface, bridge
-    set ngnodes [split [nexec ngctl l | tail -n +3] "
+    set ngnodes [split [nexec vimage $eid ngctl l | tail -n +3] "
 "]
     foreach ngline $ngnodes {
        set node [lindex [eval list $ngline] 1]
        statline "Shutting down netgraph node $node"
-       catch "nexec ngctl msg $node: shutdown"
+       catch "nexec vimage $eid ngctl msg $node: shutdown"
     }
 
     # Shut down all vimages
     foreach vimage $vimages {
        set stattxt "Shutting down vimage $vimage"
        statline $stattxt
-       catch {nexec vimage $vimage kill -9 -1 2> /dev/null}
-       while { [catch {nexec vimage -d $vimage}] } {
+       catch {nexec vimage $eid.$vimage kill -9 -1 2> /dev/null}
+       while { [catch {nexec vimage -d $eid.$vimage}] } {
            set stattxt $stattxt.
            statline $stattxt
-           catch {nexec vimage $vimage kill -9 -1 2> /dev/null}
+           catch {nexec vimage $eid.$vimage kill -9 -1 2> /dev/null}
        }
-       nexec rm -fr /tmp/$vimage
     }
+    catch { nexec vimage -d $eid }
     catch { nexec rm -f /usr/local/etc/quagga/Quagga.conf }
-    catch { nexec mv /etc/resolv.conf.bak /etc/resolv.conf }
     statline "Cleanup completed in [expr [clock seconds] - $t_start] seconds."
 }
 
@@ -894,7 +900,6 @@ proc cleanupCfg { } {
 
 #all the rest...
     catch { nexec rm -f /usr/local/etc/quagga/Quagga.conf }
-    catch { nexec mv /etc/resolv.conf.bak /etc/resolv.conf }
     statline "Cleanup completed in [expr [clock seconds] - $t_start] seconds."
 
 }
index 3400f3a7b40b2b35a76daf14805e1f84d2831dbd..0d0600c474c4eeeec8620b3de2e07b07fac1c011 100755 (executable)
@@ -1,4 +1,4 @@
-# $Id: filemgmt.tcl,v 1.12 2007/07/19 08:08:58 marko Exp $ 
+# $Id: filemgmt.tcl,v 1.13 2007/11/01 10:42:27 marko Exp $ 
 #
 # Copyright 2004, 2005 University of Zagreb, Croatia.  All rights reserved.
 #
@@ -96,11 +96,11 @@ set fileTypes {
 #   Loads an empty configuration, i.e. creates an empty project.
 #****
 proc newFile {} {
-    global currentFile oper_mode
+    global currentFile oper_mode eid
     global canvas_list curcanvas undolevel redolevel
 
     if { $oper_mode == "exec" } {
-       vimageCleanup
+       vimageCleanup $eid
     }
     loadCfg ""
     set undolevel 0
index 6ff706d920a90b467c827985513349df066dfdef..752f9ce6530d3b284dcd505aa1f1965946ec5615 100755 (executable)
@@ -1,4 +1,4 @@
-# $Id: imunes.tcl,v 1.26 2007/08/13 07:12:06 marko Exp $ 
+# $Id: imunes.tcl,v 1.27 2007/11/01 10:42:27 marko Exp $ 
 #
 # Copyright 2004, 2005 University of Zagreb, Croatia.  All rights reserved.
 #
@@ -166,7 +166,7 @@ set node_list {}
 set link_list {}
 set annotation_list {}
 set canvas_list {}
-set eid e0
+set eid imunes_[pid]
 
 #****v* imunes.tcl/exec_hosts
 # NAME
@@ -275,7 +275,7 @@ if {$execMode == "interactive"} {
        loadCfg $cfg
        deployCfg
     } else {
-       vimageCleanup
+       vimageCleanup $eid
     }
 }