From 88fcda2c991c54eb4fd627b9d4c70597f01bb5d3 Mon Sep 17 00:00:00 2001 From: Toshaan Bharvani Date: Wed, 13 Feb 2019 16:54:35 +0100 Subject: [PATCH] lang: funcs: Added an uptime function Signed-off-by: Toshaan Bharvani --- examples/lang/uptime0.mcl | 8 +++ lang/funcs/core/sys/uptime_fact.go | 89 ++++++++++++++++++++++++ lang/funcs/core/sys/uptime_fact_posix.go | 32 +++++++++ 3 files changed, 129 insertions(+) create mode 100644 examples/lang/uptime0.mcl create mode 100644 lang/funcs/core/sys/uptime_fact.go create mode 100644 lang/funcs/core/sys/uptime_fact_posix.go diff --git a/examples/lang/uptime0.mcl b/examples/lang/uptime0.mcl new file mode 100644 index 00000000..d5bf178f --- /dev/null +++ b/examples/lang/uptime0.mcl @@ -0,0 +1,8 @@ +import "fmt" +import "sys" + +$uptime = sys.uptime() + +print "print1" { + msg => fmt.printf("uptime: %d", $uptime), +} diff --git a/lang/funcs/core/sys/uptime_fact.go b/lang/funcs/core/sys/uptime_fact.go new file mode 100644 index 00000000..d8f328d9 --- /dev/null +++ b/lang/funcs/core/sys/uptime_fact.go @@ -0,0 +1,89 @@ +// Mgmt +// Copyright (C) 2013-2018+ James Shubin and the project contributors +// Written by James Shubin and the project contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package coresys + +import ( + "time" + + "github.com/purpleidea/mgmt/lang/funcs/facts" + "github.com/purpleidea/mgmt/lang/types" + + errwrap "github.com/pkg/errors" +) + +func init() { + facts.ModuleRegister(moduleName, "uptime", func() facts.Fact { return &UptimeFact{} }) +} + +// UptimeFact is a fact which returns the current uptime of your system. +type UptimeFact struct { + init *facts.Init + closeChan chan struct{} +} + +// Info returns some static info about itself. +func (obj *UptimeFact) Info() *facts.Info { + return &facts.Info{ + Output: types.TypeInt, + } +} + +// Init runs some startup code for this fact. +func (obj *UptimeFact) Init(init *facts.Init) error { + obj.init = init + obj.closeChan = make(chan struct{}) + return nil +} + +// Stream returns the changing values that this fact has over time. +func (obj *UptimeFact) Stream() error { + defer close(obj.init.Output) + ticker := time.NewTicker(time.Duration(1) * time.Second) + + startChan := make(chan struct{}) + close(startChan) + defer ticker.Stop() + for { + select { + case <-startChan: + startChan = nil + case <-ticker.C: + // send + case <-obj.closeChan: + return nil + } + + uptime, err := uptime() + if err != nil { + return errwrap.Wrapf(err, "could not read uptime value") + } + + select { + case obj.init.Output <- &types.IntValue{V: uptime}: + // send + case <-obj.closeChan: + return nil + } + } +} + +// Close runs some shutdown code for this fact and turns off the stream. +func (obj *UptimeFact) Close() error { + close(obj.closeChan) + return nil +} diff --git a/lang/funcs/core/sys/uptime_fact_posix.go b/lang/funcs/core/sys/uptime_fact_posix.go new file mode 100644 index 00000000..9acdcec6 --- /dev/null +++ b/lang/funcs/core/sys/uptime_fact_posix.go @@ -0,0 +1,32 @@ +// Mgmt +// Copyright (C) 2013-2018+ James Shubin and the project contributors +// Written by James Shubin and the project contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// +build !darwin + +package coresys + +import ( + "syscall" +) + +func uptime() (int64, error) { + var sysinfo syscall.Sysinfo_t + if err := syscall.Sysinfo(&sysinfo); err != nil { + return 0, err + } + return sysinfo.Uptime, nil +}