Posted to tcl by Napier at Sat Nov 08 21:02:30 GMT 2014view pretty

    proc checkCPU {} {
        UCL 1 "Analyzing the CPU over the next 45 seconds"
        set ::Module::CurrentMem ""
		catch {set ::Module::CurrentMem [string map {"cpu" ""} [lindex [split [exec cat /proc/stat] \n] 0]]}
		LOG "Current MEM:\n $::Module::CurrentMem"
        after 30000 {::Module::secondCheck}	
    }

	proc secondCheck {} {
		set mem2 ""
		catch {set mem2 [string map {"cpu" ""} [lindex [split [exec cat /proc/stat] \n] 0]]}
		LOG "MEM2:\n$mem2"
		if {$::Module::CurrentMem == "" || $mem2 == ""} {UCL 1 "Error Getting CPU"; return}
        set currentCPU [::Module::calculateCPU $::Module::CurrentMem $mem2]
        set averageCPU [::Module::calculateCPU $::Module::BootMem $mem2]
        UCL 1 "Current CPU Utilization: $currentCPU"
	    UCL 1 "Average CPU Utilization: $averageCPU"
        set json "
            \{
                    \"Avg CPU\": ${averageCPU},
                    \"Current CPU\": ${currentCPU},
                    \"Timestamp\": [clock milliseconds]
            \}
            "
        http::geturl ${::constants::fbURL}${::constants::fbAccountPath}/${::Module::Username}/clients/${::constants::fbMRXMAC}/Status/System/CPU/.json?auth=${::constants::fbToken} -query $json -command ::Module::UnblockingCallback
	}

    proc calculateCPU {mem1 mem2} {
        set i 0; set subtracted ""
        foreach value $mem1 {
                set v1 [lindex $mem1 $i]
                set v2 [lindex $mem2 $i]
                set result [expr {$v2-$v1}]
                lappend subtracted $result
                incr i	
        }
		LOG "Subtracted: $subtracted"
        set current 0
        foreach value $subtracted {
                set current [expr {$current+$value}]
        }
        set utilization [expr {round(((double($current)-[lindex $subtracted 3])/$current)*100)}]
        return $utilization
    }