Compare commits
No commits in common. "main" and "scripts" have entirely different histories.
36 changed files with 235 additions and 1188 deletions
25
.gitignore
vendored
25
.gitignore
vendored
|
@ -1,25 +0,0 @@
|
||||||
# ---> Go
|
|
||||||
# If you prefer the allow list template instead of the deny list, see community template:
|
|
||||||
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
|
||||||
#
|
|
||||||
# Binaries for programs and plugins
|
|
||||||
*.exe
|
|
||||||
*.exe~
|
|
||||||
*.dll
|
|
||||||
*.so
|
|
||||||
*.dylib
|
|
||||||
|
|
||||||
# Test binary, built with `go test -c`
|
|
||||||
*.test
|
|
||||||
|
|
||||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
|
||||||
*.out
|
|
||||||
|
|
||||||
# Dependency directories (remove the comment below to include it)
|
|
||||||
# vendor/
|
|
||||||
|
|
||||||
# Go workspace file
|
|
||||||
go.work
|
|
||||||
|
|
||||||
# Go temporary test files
|
|
||||||
**/plugins/tmptest/**
|
|
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
"go.buildFlags": ["-tags=linux"],
|
|
||||||
}
|
|
30
Dockerfile
30
Dockerfile
|
@ -1,30 +0,0 @@
|
||||||
# docker build -t IMAGE_NAME:VERSION .
|
|
||||||
|
|
||||||
# after cd ahenk-go
|
|
||||||
# docker run -it -d --name CONT_NAME --mount type=bind,source=".",target=/ahenk-go/ IMAGE_NAME:VERSION "/bin/bash"
|
|
||||||
|
|
||||||
# THIS IS NOT A DOCKERFILE FOR RUNNING AHENK-GO, THIS DOCKERFILE IS JUST FOR SETTING UP DEVELOPMENT ENVIRONMENT
|
|
||||||
# TODO UPDATE DOCKERFILE TO PROVIDE A RUNNING AHENK-GO DOCKER ENVIRONMENT
|
|
||||||
|
|
||||||
FROM bitnami/minideb
|
|
||||||
|
|
||||||
RUN apt-get update
|
|
||||||
RUN apt-get upgrade -y
|
|
||||||
|
|
||||||
### INSTALL USEFUL UTILITIES ###
|
|
||||||
RUN apt-get install git curl wget tree nano procps lintian -y
|
|
||||||
|
|
||||||
### INSTALL BUILD DEPENDENCIES ###
|
|
||||||
RUN apt-get install sudo dpkg-dev debhelper golang-any -y
|
|
||||||
|
|
||||||
### CONFIGURATIONS ###
|
|
||||||
# Enable UTF8 Encoding
|
|
||||||
RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment
|
|
||||||
RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
|
|
||||||
RUN echo "tr_TR.UTF-8 UTF-8" >> /etc/locale.gen
|
|
||||||
RUN echo "LANG=en_US.UTF-8" > /etc/locale.conf
|
|
||||||
ENV LANG en_US.UTF-8
|
|
||||||
ENV LANGUAGE en_US:en
|
|
||||||
ENV LC_ALL en_US.UTF-8
|
|
||||||
RUN apt install locales -y
|
|
||||||
RUN locale-gen en_US.UTF-8
|
|
165
LICENSE
165
LICENSE
|
@ -1,165 +0,0 @@
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
|
|
||||||
This version of the GNU Lesser General Public License incorporates
|
|
||||||
the terms and conditions of version 3 of the GNU General Public
|
|
||||||
License, supplemented by the additional permissions listed below.
|
|
||||||
|
|
||||||
0. Additional Definitions.
|
|
||||||
|
|
||||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
|
||||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
|
||||||
General Public License.
|
|
||||||
|
|
||||||
"The Library" refers to a covered work governed by this License,
|
|
||||||
other than an Application or a Combined Work as defined below.
|
|
||||||
|
|
||||||
An "Application" is any work that makes use of an interface provided
|
|
||||||
by the Library, but which is not otherwise based on the Library.
|
|
||||||
Defining a subclass of a class defined by the Library is deemed a mode
|
|
||||||
of using an interface provided by the Library.
|
|
||||||
|
|
||||||
A "Combined Work" is a work produced by combining or linking an
|
|
||||||
Application with the Library. The particular version of the Library
|
|
||||||
with which the Combined Work was made is also called the "Linked
|
|
||||||
Version".
|
|
||||||
|
|
||||||
The "Minimal Corresponding Source" for a Combined Work means the
|
|
||||||
Corresponding Source for the Combined Work, excluding any source code
|
|
||||||
for portions of the Combined Work that, considered in isolation, are
|
|
||||||
based on the Application, and not on the Linked Version.
|
|
||||||
|
|
||||||
The "Corresponding Application Code" for a Combined Work means the
|
|
||||||
object code and/or source code for the Application, including any data
|
|
||||||
and utility programs needed for reproducing the Combined Work from the
|
|
||||||
Application, but excluding the System Libraries of the Combined Work.
|
|
||||||
|
|
||||||
1. Exception to Section 3 of the GNU GPL.
|
|
||||||
|
|
||||||
You may convey a covered work under sections 3 and 4 of this License
|
|
||||||
without being bound by section 3 of the GNU GPL.
|
|
||||||
|
|
||||||
2. Conveying Modified Versions.
|
|
||||||
|
|
||||||
If you modify a copy of the Library, and, in your modifications, a
|
|
||||||
facility refers to a function or data to be supplied by an Application
|
|
||||||
that uses the facility (other than as an argument passed when the
|
|
||||||
facility is invoked), then you may convey a copy of the modified
|
|
||||||
version:
|
|
||||||
|
|
||||||
a) under this License, provided that you make a good faith effort to
|
|
||||||
ensure that, in the event an Application does not supply the
|
|
||||||
function or data, the facility still operates, and performs
|
|
||||||
whatever part of its purpose remains meaningful, or
|
|
||||||
|
|
||||||
b) under the GNU GPL, with none of the additional permissions of
|
|
||||||
this License applicable to that copy.
|
|
||||||
|
|
||||||
3. Object Code Incorporating Material from Library Header Files.
|
|
||||||
|
|
||||||
The object code form of an Application may incorporate material from
|
|
||||||
a header file that is part of the Library. You may convey such object
|
|
||||||
code under terms of your choice, provided that, if the incorporated
|
|
||||||
material is not limited to numerical parameters, data structure
|
|
||||||
layouts and accessors, or small macros, inline functions and templates
|
|
||||||
(ten or fewer lines in length), you do both of the following:
|
|
||||||
|
|
||||||
a) Give prominent notice with each copy of the object code that the
|
|
||||||
Library is used in it and that the Library and its use are
|
|
||||||
covered by this License.
|
|
||||||
|
|
||||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
|
||||||
document.
|
|
||||||
|
|
||||||
4. Combined Works.
|
|
||||||
|
|
||||||
You may convey a Combined Work under terms of your choice that,
|
|
||||||
taken together, effectively do not restrict modification of the
|
|
||||||
portions of the Library contained in the Combined Work and reverse
|
|
||||||
engineering for debugging such modifications, if you also do each of
|
|
||||||
the following:
|
|
||||||
|
|
||||||
a) Give prominent notice with each copy of the Combined Work that
|
|
||||||
the Library is used in it and that the Library and its use are
|
|
||||||
covered by this License.
|
|
||||||
|
|
||||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
|
||||||
document.
|
|
||||||
|
|
||||||
c) For a Combined Work that displays copyright notices during
|
|
||||||
execution, include the copyright notice for the Library among
|
|
||||||
these notices, as well as a reference directing the user to the
|
|
||||||
copies of the GNU GPL and this license document.
|
|
||||||
|
|
||||||
d) Do one of the following:
|
|
||||||
|
|
||||||
0) Convey the Minimal Corresponding Source under the terms of this
|
|
||||||
License, and the Corresponding Application Code in a form
|
|
||||||
suitable for, and under terms that permit, the user to
|
|
||||||
recombine or relink the Application with a modified version of
|
|
||||||
the Linked Version to produce a modified Combined Work, in the
|
|
||||||
manner specified by section 6 of the GNU GPL for conveying
|
|
||||||
Corresponding Source.
|
|
||||||
|
|
||||||
1) Use a suitable shared library mechanism for linking with the
|
|
||||||
Library. A suitable mechanism is one that (a) uses at run time
|
|
||||||
a copy of the Library already present on the user's computer
|
|
||||||
system, and (b) will operate properly with a modified version
|
|
||||||
of the Library that is interface-compatible with the Linked
|
|
||||||
Version.
|
|
||||||
|
|
||||||
e) Provide Installation Information, but only if you would otherwise
|
|
||||||
be required to provide such information under section 6 of the
|
|
||||||
GNU GPL, and only to the extent that such information is
|
|
||||||
necessary to install and execute a modified version of the
|
|
||||||
Combined Work produced by recombining or relinking the
|
|
||||||
Application with a modified version of the Linked Version. (If
|
|
||||||
you use option 4d0, the Installation Information must accompany
|
|
||||||
the Minimal Corresponding Source and Corresponding Application
|
|
||||||
Code. If you use option 4d1, you must provide the Installation
|
|
||||||
Information in the manner specified by section 6 of the GNU GPL
|
|
||||||
for conveying Corresponding Source.)
|
|
||||||
|
|
||||||
5. Combined Libraries.
|
|
||||||
|
|
||||||
You may place library facilities that are a work based on the
|
|
||||||
Library side by side in a single library together with other library
|
|
||||||
facilities that are not Applications and are not covered by this
|
|
||||||
License, and convey such a combined library under terms of your
|
|
||||||
choice, if you do both of the following:
|
|
||||||
|
|
||||||
a) Accompany the combined library with a copy of the same work based
|
|
||||||
on the Library, uncombined with any other library facilities,
|
|
||||||
conveyed under the terms of this License.
|
|
||||||
|
|
||||||
b) Give prominent notice with the combined library that part of it
|
|
||||||
is a work based on the Library, and explaining where to find the
|
|
||||||
accompanying uncombined form of the same work.
|
|
||||||
|
|
||||||
6. Revised Versions of the GNU Lesser General Public License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the GNU Lesser General Public License from time to time. Such new
|
|
||||||
versions will be similar in spirit to the present version, but may
|
|
||||||
differ in detail to address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Library as you received it specifies that a certain numbered version
|
|
||||||
of the GNU Lesser General Public License "or any later version"
|
|
||||||
applies to it, you have the option of following the terms and
|
|
||||||
conditions either of that published version or of any later version
|
|
||||||
published by the Free Software Foundation. If the Library as you
|
|
||||||
received it does not specify a version number of the GNU Lesser
|
|
||||||
General Public License, you may choose any version of the GNU Lesser
|
|
||||||
General Public License ever published by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Library as you received it specifies that a proxy can decide
|
|
||||||
whether future versions of the GNU Lesser General Public License shall
|
|
||||||
apply, that proxy's public statement of acceptance of any version is
|
|
||||||
permanent authorization for you to choose that version for the
|
|
||||||
Library.
|
|
60
Makefile
60
Makefile
|
@ -1,60 +0,0 @@
|
||||||
REPO_NAME=ahenk-go
|
|
||||||
REPO_LINK=https://git.aliberksandikci.com.tr/liderahenk/${REPO_NAME}
|
|
||||||
|
|
||||||
DAEMON_NAME=ahenk-go
|
|
||||||
OLD_DAEMON_NAME=ahenkd-go
|
|
||||||
PYTHON_DAEMON_NAME=ahenkd
|
|
||||||
|
|
||||||
DATA_DIR=/etc/ahenk-go/
|
|
||||||
LIB_DIR=/usr/share/ahenk-go/
|
|
||||||
PLUGIN_DIR=${LIB_DIR}/plugins/
|
|
||||||
TEMP_DIR=$(mktemp -d)
|
|
||||||
MAIN_DIR=${TEMP_DIR}/${REPO_NAME}/
|
|
||||||
|
|
||||||
info:
|
|
||||||
@echo "Made by Aliberk Sandıkçı - 2023"
|
|
||||||
@echo "preclean: for cleaning old files, configurations"
|
|
||||||
@echo "TODO test: Test go files"
|
|
||||||
@echo "install: Build and install ahenk-go to DESTDIR"
|
|
||||||
@echo "uninstall: Uninstall ahenk-go from DESTDIR"
|
|
||||||
|
|
||||||
preclean:
|
|
||||||
sudo rm -rf /usr/bin/$(DAEMON_NAME)
|
|
||||||
sudo rm -rf /usr/bin/${OLD_DAEMON_NAME}
|
|
||||||
sudo rm -rf /usr/bin/${PYTHON_DAEMON_NAME}
|
|
||||||
|
|
||||||
@# TODO systemd control for both three process for docker
|
|
||||||
@# REVIEW are both killall and systemctl commands running?
|
|
||||||
@pgrep -x ${DAEMON_NAME} && (sudo killall "${DAEMON_NAME}" || sudo systemctl disable "${DAEMON_NAME}" || sudo systemctl stop "${DAEMON_NAME}") || echo "no ${DAEMON_NAME} found"
|
|
||||||
@pgrep -x ${OLD_DAEMON_NAME} && (sudo killall "${OLD_DAEMON_NAME}" || sudo systemctl disable "${OLD_DAEMON_NAME}" || sudo systemctl stop "${OLD_DAEMON_NAME}") || echo "no ${OLD_DAEMON_NAME} found"
|
|
||||||
|
|
||||||
@# TODO
|
|
||||||
@# echo -e "Do you want to remove python implementation of ahenk if installed in system?"
|
|
||||||
@# read -rp "(Y/N) " input
|
|
||||||
|
|
||||||
@pgrep -x ${PYTHON_DAEMON_NAME} && (sudo killall "${PYTHON_DAEMON_NAME}" || sudo systemctl disable "${PYTHON_DAEMON_NAME}" || sudo systemctl stop "${PYTHON_DAEMON_NAME}") || echo "no ${PYTHON_DAEMON_NAME} found"
|
|
||||||
|
|
||||||
sudo systemctl daemon-reload
|
|
||||||
sudo rm -rf ${DATA_DIR}
|
|
||||||
@echo -e "PRE-CLENING DONE\n"
|
|
||||||
test:
|
|
||||||
@echo -e "Testing go files not implemented yet!"
|
|
||||||
install:
|
|
||||||
sudo go build -o ${DESTDIR}/usr/bin/${REPO_NAME} ./cmd/ahenk-go/
|
|
||||||
@sudo mkdir -p "${DESTDIR}/${LIB_DIR}"
|
|
||||||
@sudo mkdir -p "${DESTDIR}/${PLUGIN_DIR}"
|
|
||||||
|
|
||||||
sudo go build -buildmode=plugin -o ${DESTDIR}/${PLUGIN_DIR}/resources.so ./plugins/resources
|
|
||||||
sudo go build -buildmode=plugin -o ${DESTDIR}/${PLUGIN_DIR}/tmptest.so ./plugins/tmptest
|
|
||||||
@sudo mkdir -p "${DESTDIR}/${DATA_DIR}"
|
|
||||||
|
|
||||||
windows_install:
|
|
||||||
sudo env GOOS=windows GOARCH=amd64 go build -o ${DESTDIR}/usr/bin/${REPO_NAME} ./cmd/ahenk-go/
|
|
||||||
@sudo mkdir -p "${DESTDIR}/${LIB_DIR}"
|
|
||||||
@sudo mkdir -p "${DESTDIR}/${PLUGIN_DIR}"
|
|
||||||
|
|
||||||
sudo GOOS=windows GOARCH=amd64 go build -buildmode=plugin -o ${DESTDIR}/${PLUGIN_DIR}/resources.so ./plugins/resources
|
|
||||||
sudo GOOS=windows GOARCH=amd64 go build -buildmode=plugin -o ${DESTDIR}/${PLUGIN_DIR}/tmptest.so ./plugins/tmptest
|
|
||||||
@sudo mkdir -p "${DESTDIR}/${DATA_DIR}"
|
|
||||||
uninstall:
|
|
||||||
@sudo rm -rf ${DESTDIR}/usr/bin/${REPO_NAME}
|
|
45
README.md
45
README.md
|
@ -1,45 +0,0 @@
|
||||||
# Ahenk Go
|
|
||||||
|
|
||||||
tamamlanmamış değişiklikler için goloader-changes branch'ına ve dökümantasyona bakınız !!!
|
|
||||||
|
|
||||||
**Liderahenk** is an open source project which provides solutions to manage, monitor and audit unlimited number of different systems and users on a network.
|
|
||||||
|
|
||||||
Ahenk-go is a Linux agent written in Go which enables Lider to manage & monitor clients remotely.
|
|
||||||
|
|
||||||
## Packaging
|
|
||||||
1. Install necessary packages (You dont need this step if you are using docker file [godeb](https://git.aliberksandikci.com.tr/Liderahenk/ahenk-docs/src/branch/main/dev/environment.md#creating-docker-development-environment))
|
|
||||||
```sh
|
|
||||||
sudo apt install sudo dpkg-dev debhelper golang-any
|
|
||||||
```
|
|
||||||
2. Clone the repository and move to main directory
|
|
||||||
```sh
|
|
||||||
git clone https://git.aliberksandikci.com.tr/Liderahenk/ahenk-go/
|
|
||||||
cd ahenk-go/
|
|
||||||
```
|
|
||||||
3. Build program and create binary/source packages
|
|
||||||
```sh
|
|
||||||
dpkg-buildpackage
|
|
||||||
```
|
|
||||||
> Refer to Makefile for more info
|
|
||||||
4. *optional*, look for package errors and warnings
|
|
||||||
```sh
|
|
||||||
lintian
|
|
||||||
```
|
|
||||||
|
|
||||||
## Documentation & Changelog
|
|
||||||
- See comprehensively prepared [documentation](https://git.aliberksandikci.com.tr/Liderahenk/ahenk-docs/)
|
|
||||||
- See how to [setup development environment](https://git.aliberksandikci.com.tr/Liderahenk/ahenk-docs/src/branch/main/dev/environment.md)<!-- Web Documentation Link Here -->
|
|
||||||
- See [changelog](https://git.aliberksandikci.com.tr/Liderahenk/ahenk-docs/src/branch/main/admin/changelog.md)
|
|
||||||
<!-- Web Changelog Link Here -->
|
|
||||||
|
|
||||||
## Other Liderahenk Projects
|
|
||||||
- [Pardus-LiderAhenk/ahenk](https://github.com/Pardus-LiderAhenk/ahenk/): Current Python Implementation of Ahenk
|
|
||||||
- [Lider UI](https://github.com/Pardus-LiderAhenk/liderui): Lider Administration User Interface
|
|
||||||
- [Lider API](https://github.com/Pardus-LiderAhenk/liderapi): Lider API
|
|
||||||
- [Liderahenk-ansible](https://github.com/Pardus-LiderAhenk/liderahenk-ansible): Liderahenk setup with ansible
|
|
||||||
- [Ahenkdesk](https://github.com/Pardus-LiderAhenk/ahenkdesk): Ahenk User Interface
|
|
||||||
- See more in our [GitHub Page](https://github.com/Pardus-LiderAhenk)
|
|
||||||
|
|
||||||
## License
|
|
||||||
Liderahenk and its sub projects are licensed under the [LGPL v3](./LICENSE).
|
|
||||||
|
|
|
@ -1,78 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"os/user"
|
|
||||||
|
|
||||||
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils"
|
|
||||||
|
|
||||||
"github.com/sevlyar/go-daemon"
|
|
||||||
"golang.org/x/exp/slices"
|
|
||||||
)
|
|
||||||
|
|
||||||
const PidFile = "/run/ahenk-go.pid"
|
|
||||||
const ExecutablePath = "/usr/bin/ahenk-go"
|
|
||||||
const DataDir = "/etc/ahenk-go/"
|
|
||||||
const LogFile = DataDir + "ahenk.log"
|
|
||||||
const LibDir = "/usr/share/ahenk-go/"
|
|
||||||
const PluginDir = LibDir + "/plugins/"
|
|
||||||
|
|
||||||
// Main Function that starts daemon and controls arguments
|
|
||||||
func main() {
|
|
||||||
if len(os.Args) == 2 && slices.Contains([]string{"start", "stop", "restart", "nodaemon", "tmptest"}, os.Args[1]) {
|
|
||||||
switch os.Args[1] {
|
|
||||||
case "start":
|
|
||||||
utils.CreatePath(DataDir)
|
|
||||||
cntxt := &daemon.Context{
|
|
||||||
PidFileName: PidFile,
|
|
||||||
PidFilePerm: 0644,
|
|
||||||
LogFileName: LogFile,
|
|
||||||
LogFilePerm: 0640,
|
|
||||||
WorkDir: LibDir,
|
|
||||||
Umask: 027,
|
|
||||||
Args: []string{ExecutablePath, "start"},
|
|
||||||
}
|
|
||||||
d, err := cntxt.Reborn()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("Daemon Reborn ERROR:", err)
|
|
||||||
}
|
|
||||||
if d != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer cntxt.Release()
|
|
||||||
log.Println("- - - - - - - - - - - - - - - - - -")
|
|
||||||
log.Print("Daemon Succesfully Started")
|
|
||||||
case "stop":
|
|
||||||
i, _ := daemon.ReadPidFile(PidFile)
|
|
||||||
Stop(i, 15)
|
|
||||||
case "restart":
|
|
||||||
i, _ := daemon.ReadPidFile(PidFile)
|
|
||||||
Restart(i, 15)
|
|
||||||
case "nodaemon":
|
|
||||||
log.Print("STARTED AS NO-DAEMON")
|
|
||||||
|
|
||||||
f := utils.OpenLogFile(LogFile)
|
|
||||||
defer f.Close()
|
|
||||||
log.SetOutput(f)
|
|
||||||
// TODO Also pipe fmt.Print* commands
|
|
||||||
|
|
||||||
case "tmptest":
|
|
||||||
log.Print("TEMPORARY TEST STARTED, log files are NOT redirecting!")
|
|
||||||
PluginManager("tmptest")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
panic("Please enter a valid option !")
|
|
||||||
}
|
|
||||||
|
|
||||||
current, err := user.Current()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if current.Uid != "0" {
|
|
||||||
log.Fatal("Ahenk-go requires superuser privilege")
|
|
||||||
}
|
|
||||||
|
|
||||||
PluginManager()
|
|
||||||
// NEXT Make PluginManager async !
|
|
||||||
}
|
|
|
@ -1,36 +0,0 @@
|
||||||
//go:build linux && !windows
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils"
|
|
||||||
)
|
|
||||||
|
|
||||||
// FIXME there isn't any difference with Stop() function
|
|
||||||
// TODO There can be a Start() function in it but start function doesnt work properly right now
|
|
||||||
// Restart ahenk daemon with a specific PID (running from second copy)
|
|
||||||
func Restart(pid, signal int) {
|
|
||||||
Stop(pid, signal)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop ahenk daemon with a specific PID (running from second copy)
|
|
||||||
func Stop(pid, signal int) {
|
|
||||||
log.Println("Stop Signal Caught")
|
|
||||||
|
|
||||||
// FILLME what you want to do before stopping daemon?
|
|
||||||
|
|
||||||
if err := syscall.Kill(pid, syscall.Signal(signal)); err == nil {
|
|
||||||
log.Printf("Ahenk Daemon with pid number %v Successfully stopped", pid)
|
|
||||||
f := utils.OpenLogFile(LogFile)
|
|
||||||
defer f.Close()
|
|
||||||
log.SetOutput(f)
|
|
||||||
log.Printf("Ahenk Daemon with pid number %v Successfully stopped", pid)
|
|
||||||
} else {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
os.Exit(0)
|
|
||||||
}
|
|
|
@ -1,18 +0,0 @@
|
||||||
//go:build windows
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Restart(pid, signal int) {
|
|
||||||
Stop(pid, signal)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Stop(pid, signal int) {
|
|
||||||
log.Println("Stop Signal Caught")
|
|
||||||
log.Println("TODO, STOP FUNCTION IS NOT FUNCTIONAL IN WINDOWS YET!")
|
|
||||||
os.Exit(0)
|
|
||||||
}
|
|
|
@ -1,103 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"log"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils"
|
|
||||||
)
|
|
||||||
|
|
||||||
// General Functions/Methods that each plugin has
|
|
||||||
type PlugGeneral interface {
|
|
||||||
Info() map[string]interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// plugins/resources
|
|
||||||
type Resources interface {
|
|
||||||
AgentInfo() map[string]interface{}
|
|
||||||
ResourceUsage() map[string]interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// plugins/resources
|
|
||||||
type TmpTest interface {
|
|
||||||
TmpTest()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FILLME creating new plugin interface, template
|
|
||||||
// type NewPluginInterface interface {
|
|
||||||
// PluginMethod() returnType
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Loads Plugins and runs them concurrently.
|
|
||||||
// When you create a new plugin create a new interface and call this plugin in this function
|
|
||||||
func PluginManager(params ...string) {
|
|
||||||
chanPlug := make(chan interface{})
|
|
||||||
|
|
||||||
go LoadPlugin("resources", chanPlug)
|
|
||||||
res, ok := <-chanPlug
|
|
||||||
var resources Resources = res.(Resources)
|
|
||||||
checkPlugin(resources, ok)
|
|
||||||
|
|
||||||
if len(params) > 0 && params[0] == "tmptest" {
|
|
||||||
go LoadPlugin("tmptest", chanPlug)
|
|
||||||
res, ok := <-chanPlug
|
|
||||||
var tmptest TmpTest = res.(TmpTest)
|
|
||||||
checkPlugin(res, ok)
|
|
||||||
tmptest.TmpTest()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FILLME Loading new plugin, template
|
|
||||||
// go LoadPlugin("pluginName", chanPlug)
|
|
||||||
// res, ok = <-chanPlug
|
|
||||||
// var pluginName NewPluginInterface = res.(NewPluginInterface)
|
|
||||||
// checkPlugin(res, ok)
|
|
||||||
|
|
||||||
// Run plugins concurrently and log out
|
|
||||||
go logPlugin("AgentInfo", resources.AgentInfo(), true)
|
|
||||||
for {
|
|
||||||
go logPlugin("ResourceUsage", resources.ResourceUsage(), true)
|
|
||||||
|
|
||||||
// FILLME Running/Log out a plugin, template
|
|
||||||
// go logPlugin("InfoAboutFunction", pluginName.Function(), true)
|
|
||||||
|
|
||||||
time.Sleep(30 * time.Second)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Logs plugin outputs.
|
|
||||||
func logPlugin(title string, mp map[string]interface{}, toJson bool) {
|
|
||||||
log.Printf("\n----- %v -----\n", title)
|
|
||||||
if toJson {
|
|
||||||
data, err := json.MarshalIndent(&mp, "", " ")
|
|
||||||
utils.Check(err)
|
|
||||||
log.Println(string(data))
|
|
||||||
} else {
|
|
||||||
for i, v := range mp {
|
|
||||||
log.Printf("%v: %v\n", i, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Checks plugin status
|
|
||||||
func checkPlugin(plugVal interface{}, status bool) {
|
|
||||||
if status {
|
|
||||||
if plugVal == nil {
|
|
||||||
log.Fatal("Plugin loaded but there is no value!")
|
|
||||||
} else {
|
|
||||||
plugInfo := plugVal.(PlugGeneral).Info()
|
|
||||||
log.Printf("Plugin \"%v\" loaded and ready to use, version \"%v\" ", plugInfo["name"], plugInfo["version"])
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if plugVal == nil {
|
|
||||||
log.Fatal("Plugin closed and there is no value! ")
|
|
||||||
} else {
|
|
||||||
log.Fatal("Plugin closed or there is an error")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// // TODO response to Lider
|
|
||||||
// // func createResponse() {
|
|
||||||
|
|
||||||
// // }
|
|
|
@ -1,37 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"plugin"
|
|
||||||
|
|
||||||
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Load Plugin placed in PluginDir, returns empty interface with channel
|
|
||||||
// Do not forget to cast in plugin manager
|
|
||||||
//
|
|
||||||
// Give Plugin Name as argument and be sure you compiled plugins with `-buildmode=plugin` to PluginDir as `pluginname.so`
|
|
||||||
func LoadPlugin(plugName string, chn chan interface{}) {
|
|
||||||
|
|
||||||
// TODO if error caugth try without relative path, this will be good for local testing
|
|
||||||
plug, err := plugin.Open(PluginDir + plugName + ".so")
|
|
||||||
utils.Check(err)
|
|
||||||
|
|
||||||
// TODO also allow lookup another symbol other than PlugnameConnect
|
|
||||||
symPlug, err := plug.Lookup(utils.FirstUpperEN(plugName) + "Connect")
|
|
||||||
utils.Check(err)
|
|
||||||
|
|
||||||
var plugOut interface{}
|
|
||||||
plugOut, ok := symPlug.(interface{})
|
|
||||||
if !ok {
|
|
||||||
fmt.Println("unexpected type from module symbol")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
chn <- plugOut
|
|
||||||
}
|
|
||||||
|
|
||||||
// NEXT implement unload function
|
|
||||||
// func UnloadPlugin(plugName string) interface{} {
|
|
||||||
|
|
||||||
// }
|
|
17
debian/ahenk-go.service
vendored
17
debian/ahenk-go.service
vendored
|
@ -1,17 +0,0 @@
|
||||||
[Unit]
|
|
||||||
Description=Ahenk Agent
|
|
||||||
Wants=network-online.target
|
|
||||||
After=network.target network-online.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=forking
|
|
||||||
User=root
|
|
||||||
Group=root
|
|
||||||
ExecStart=/usr/bin/ahenk-go start
|
|
||||||
ExecStop=/usr/bin/ahenk-go stop
|
|
||||||
ExecReload=kill -HUP $MAINPID
|
|
||||||
PIDFile=/run/ahenk-go.pid
|
|
||||||
Restart=always
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
5
debian/changelog
vendored
5
debian/changelog
vendored
|
@ -1,5 +0,0 @@
|
||||||
ahenk-go (0.0.1-1) UNRELEASED; urgency=low
|
|
||||||
|
|
||||||
* Initial release
|
|
||||||
|
|
||||||
-- Aliberk Sandıkçı <asandikci@aliberksandikci.com.tr> Mon, 21 Aug 2023 13:05:24 +0000
|
|
23
debian/control
vendored
23
debian/control
vendored
|
@ -1,23 +0,0 @@
|
||||||
Source: ahenk-go
|
|
||||||
Maintainer: Aliberk Sandıkçı <asandikci@aliberksandikci.com.tr>
|
|
||||||
Section: utils
|
|
||||||
Testsuite: autopkgtest-pkg-go
|
|
||||||
Priority: optional
|
|
||||||
Build-Depends: debhelper (>= 13),
|
|
||||||
debhelper-compat (= 10),
|
|
||||||
Standards-Version: 4.6.0
|
|
||||||
Vcs-Browser: https://git.aliberksandikci.com.tr/Liderahenk/go-ahenk
|
|
||||||
Vcs-Git: https://git.aliberksandikci.com.tr/Liderahenk/go-ahenk.git
|
|
||||||
Homepage: https://liderahenk.org
|
|
||||||
Rules-Requires-Root: no
|
|
||||||
XS-Go-Import-Path: git.aliberksandikci.com.tr/Liderahenk/ahenk-go
|
|
||||||
|
|
||||||
Package: ahenk-go
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${misc:Depends},
|
|
||||||
${shlibs:Depends}
|
|
||||||
Built-Using: ${misc:Built-Using}
|
|
||||||
Description: The client side of the Lider Ahenk Project
|
|
||||||
Lider Ahenk is an open source project which provides solutions
|
|
||||||
to manage, monitor and audit unlimited number of different
|
|
||||||
systems and users on a network.
|
|
13
debian/copyright
vendored
13
debian/copyright
vendored
|
@ -1,13 +0,0 @@
|
||||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
|
||||||
Upstream-Name: ahenk-go
|
|
||||||
Upstream-Contact: Aliberk Sandıkçı <asandikci@aliberksandikci.com.tr>
|
|
||||||
Source: https://git.aliberksandikci.com.tr/Liderahenk/ahenk-go
|
|
||||||
|
|
||||||
Files: *
|
|
||||||
Copyright: 2023 Aliberk Sandıkçı <asandikci@aliberksandikci.com.tr>
|
|
||||||
License: LGPL-3.0+
|
|
||||||
|
|
||||||
Files: debian/*
|
|
||||||
Copyright: 2023 Aliberk Sandıkçı <asandikci@aliberksandikci.com.tr>
|
|
||||||
License: LGPL-3.0+
|
|
||||||
Comment: Debian packaging is licensed under the same terms as upstream
|
|
8
debian/rules
vendored
8
debian/rules
vendored
|
@ -1,8 +0,0 @@
|
||||||
#!/usr/bin/make -f
|
|
||||||
|
|
||||||
%:
|
|
||||||
dh $@
|
|
||||||
|
|
||||||
override_dh_auto_install:
|
|
||||||
dh_auto_install
|
|
||||||
dh_installsystemd
|
|
92
docker-build.sh
Normal file
92
docker-build.sh
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# see https://people.debian.org/~stapelberg/2015/07/27/dh-make-golang.html
|
||||||
|
|
||||||
|
GIT_HOST="git.aliberksandikci.com.tr"
|
||||||
|
GIT_ORG="liderahenk"
|
||||||
|
GIT_REPO="ahenk-go"
|
||||||
|
FULL_URL="https://$GIT_HOST/$GIT_ORG/$GIT_REPO"
|
||||||
|
DEV_NAME="Aliberk Sandıkçı"
|
||||||
|
GIT_MAIL="git@aliberksandikci.com.tr"
|
||||||
|
|
||||||
|
UPLOAD_URL="127.0.0.1"
|
||||||
|
UPLOAD_PORT="8000"
|
||||||
|
|
||||||
|
echo "Editing git configs..."
|
||||||
|
git config --global init.defaultBranch main
|
||||||
|
git config --global user.name "$DEV_NAME"
|
||||||
|
git config --global user.email $GIT_MAIL
|
||||||
|
git config --global color.status auto
|
||||||
|
git config --global color.branch auto
|
||||||
|
git config --global color.interactive auto
|
||||||
|
git config --global color.diff auto
|
||||||
|
|
||||||
|
mkdir /build
|
||||||
|
cd /build || exit
|
||||||
|
|
||||||
|
if [[ "$1" != "update" ]]; then
|
||||||
|
|
||||||
|
dh-make-golang make -allow_unknown_hoster "$GIT_HOST/$GIT_ORG/$GIT_REPO"
|
||||||
|
|
||||||
|
if [[ ! ("$1" != "notodo" || "$2" != "notodo") ]]; then
|
||||||
|
|
||||||
|
# TODO Add option to disable writing all these files all the time (-s --skip)
|
||||||
|
nano "itp-$GIT_REPO.txt"
|
||||||
|
sendmail -t <"itp-$GIT_REPO.txt"
|
||||||
|
|
||||||
|
cd $GIT_REPO || exit
|
||||||
|
grep --color=always -r TODO debian
|
||||||
|
echo -e "\nThese files needs review. Starting reviewing automatically in 10sec...\n"
|
||||||
|
sleep 10
|
||||||
|
# TODO Allow users to escape from automatic review and manually do it while in this script
|
||||||
|
|
||||||
|
while [[ $(grep -r TODO debian | wc --lines) -ne 0 ]]; do
|
||||||
|
nano "$(grep -r TODO debian | awk '{sub(/:.*/,"")} NR==1')"
|
||||||
|
|
||||||
|
echo "Continuing from next file..."
|
||||||
|
sleep 1
|
||||||
|
grep --color=always -r TODO debian
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
# TODO Allow user to reviewing remaining files, choosing between them, optional skipping, and waiting for an answer (continue? [Y/n])
|
||||||
|
done
|
||||||
|
echo "ALL FILES DONE"
|
||||||
|
|
||||||
|
dh_installsystemd
|
||||||
|
echo """
|
||||||
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh \$@ --builddirectory=_build --buildsystem=golang --with=golang --with-systemd
|
||||||
|
override_dh_auto_install:
|
||||||
|
dh_auto_install -- --no-source
|
||||||
|
""" >debian/rules
|
||||||
|
sleep 5
|
||||||
|
# FIXME Not working!
|
||||||
|
|
||||||
|
else
|
||||||
|
cd $GIT_REPO || exit
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
gbp clone "$FULL_URL"
|
||||||
|
cd $GIT_REPO || exit
|
||||||
|
git checkout debian/sid
|
||||||
|
pwd
|
||||||
|
if [[ "$1" == "nmu" ]]; then
|
||||||
|
dch --nmu
|
||||||
|
else
|
||||||
|
dch
|
||||||
|
fi
|
||||||
|
echo "Succesfully Updated deb package information"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# TODO ask user to continue
|
||||||
|
|
||||||
|
git add debian && git commit -a -m 'Initial packaging'
|
||||||
|
|
||||||
|
gbp buildpackage
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
lintian -- *.changes
|
||||||
|
|
||||||
|
echo -e "SOLVE LINTIAN ERRORS / WARNINGS\nAFTER THAT, PUSH REPO"
|
24
go.mod
24
go.mod
|
@ -1,24 +0,0 @@
|
||||||
module git.aliberksandikci.com.tr/Liderahenk/ahenk-go
|
|
||||||
|
|
||||||
go 1.20
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/sevlyar/go-daemon v0.1.6
|
|
||||||
github.com/zcalusic/sysinfo v1.0.1
|
|
||||||
golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b
|
|
||||||
golang.org/x/text v0.12.0
|
|
||||||
)
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/go-ole/go-ole v1.2.6 // indirect
|
|
||||||
github.com/stretchr/testify v1.8.4 // indirect
|
|
||||||
github.com/tklauser/go-sysconf v0.3.12 // indirect
|
|
||||||
github.com/tklauser/numcpus v0.6.1 // indirect
|
|
||||||
github.com/yusufpapurcu/wmi v1.2.3 // indirect
|
|
||||||
)
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
|
|
||||||
github.com/shirou/gopsutil v3.21.11+incompatible // direct
|
|
||||||
golang.org/x/sys v0.11.0 // direct
|
|
||||||
)
|
|
29
go.sum
29
go.sum
|
@ -1,29 +0,0 @@
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
||||||
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
|
||||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
|
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
||||||
github.com/sevlyar/go-daemon v0.1.6 h1:EUh1MDjEM4BI109Jign0EaknA2izkOyi0LV3ro3QQGs=
|
|
||||||
github.com/sevlyar/go-daemon v0.1.6/go.mod h1:6dJpPatBT9eUwM5VCw9Bt6CdX9Tk6UWvhW3MebLDRKE=
|
|
||||||
github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
|
|
||||||
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
|
||||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
|
||||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
|
||||||
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
|
|
||||||
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
|
|
||||||
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
|
|
||||||
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
|
|
||||||
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
|
|
||||||
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
|
||||||
github.com/zcalusic/sysinfo v1.0.1 h1:cVh8q3codjh43AGRTa54dJ2Zq+qPejv8n2VWpxKViwc=
|
|
||||||
github.com/zcalusic/sysinfo v1.0.1/go.mod h1:LxwKwtQdbTIQc65drhjQzYzt0o7jfB80LrrZm7SWn8o=
|
|
||||||
golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b h1:r+vk0EmXNmekl0S0BascoeeoHk/L7wmaW2QF90K+kYI=
|
|
||||||
golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
|
||||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
|
|
||||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
|
73
install.sh
Normal file
73
install.sh
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
### Ahenk Agent Local Installation Script
|
||||||
|
### IMPORTANT NOTICE !
|
||||||
|
# Consider to use makefile for building or .deb file for installing package,
|
||||||
|
# using this scripts is not suggested anymore !
|
||||||
|
|
||||||
|
### --------------------- ###
|
||||||
|
|
||||||
|
### --> Prerequisites
|
||||||
|
# git
|
||||||
|
# go 1.20+
|
||||||
|
# systemd
|
||||||
|
|
||||||
|
# wget -qO- https://git.aliberksandikci.com.tr/liderahenk/ahenk-go/raw/branch/main/scripts/install.sh | bash
|
||||||
|
|
||||||
|
### --> Variable Set
|
||||||
|
REPO_NAME="ahenk-go"
|
||||||
|
REPO_LINK="https://git.aliberksandikci.com.tr/liderahenk/${REPO_NAME}"
|
||||||
|
DAEMON_NAME="ahenk-go"
|
||||||
|
CONF_DIR="/etc/ahenk-go/"
|
||||||
|
TEMP_DIR="$(mktemp -d)"
|
||||||
|
MAIN_DIR="${TEMP_DIR}/${REPO_NAME}/"
|
||||||
|
echo -e "VARIABLES SET\n"
|
||||||
|
|
||||||
|
|
||||||
|
### --> Pre-Cleaning
|
||||||
|
sudo rm /usr/bin/${DAEMON_NAME}
|
||||||
|
sudo killall "$DAEMON_NAME"
|
||||||
|
sudo systemctl disable "$DAEMON_NAME"
|
||||||
|
sudo systemctl stop "$DAEMON_NAME"
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo rm -rf "$CONF_DIR"
|
||||||
|
sudo mkdir -p "$CONF_DIR"
|
||||||
|
echo -e "PRE-CLENING DONE\n"
|
||||||
|
|
||||||
|
|
||||||
|
### --> Building
|
||||||
|
cd "$TEMP_DIR" || exit
|
||||||
|
echo "$TEMP_DIR"
|
||||||
|
git clone "$REPO_LINK"
|
||||||
|
cd "$MAIN_DIR" || exit
|
||||||
|
|
||||||
|
# cmd/ahenkd-go
|
||||||
|
cd cmd/ahenkd-go || exit
|
||||||
|
sudo go build -o "/usr/bin/ahenkd-go"
|
||||||
|
|
||||||
|
echo -e "BUILDING DONE\n"
|
||||||
|
|
||||||
|
### --> Configurations
|
||||||
|
sudo touch "$CONF_DIR/user.info"
|
||||||
|
sudo cat << EOF | sudo tee -a "$CONF_DIR/user.info" > /dev/null
|
||||||
|
The current working directory is: $PWD
|
||||||
|
You are logged in as $(whoami)
|
||||||
|
$HOME $USER $SUDO_USER
|
||||||
|
EOF
|
||||||
|
sudo chown root:root "$CONF_DIR/user.info"
|
||||||
|
sudo chmod 640 "$CONF_DIR/user.info"
|
||||||
|
echo -e "CONFIGURATIONS DONE\n"
|
||||||
|
|
||||||
|
### --> Installing
|
||||||
|
if [[ $(ps -p 1 | awk 'FNR == 2 {print $4} ') == "systemd" ]]
|
||||||
|
then
|
||||||
|
sudo mv "${MAIN_DIR}build/package/deb/${DAEMON_NAME}.service" /etc/systemd/system/
|
||||||
|
fi
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable "$DAEMON_NAME"
|
||||||
|
sudo systemctl start "$DAEMON_NAME"
|
||||||
|
echo -e "INSTALLING DONE\n"
|
||||||
|
|
||||||
|
### --> Post-Cleaning
|
||||||
|
sudo rm -rf "$TEMP_DIR"
|
||||||
|
echo -e "POST-CLEANING DONE\n"
|
3
local-build.sh
Normal file
3
local-build.sh
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
sudo go build -o "build/package/bin/ahenkd-go" cmd/ahenkd-go/ahenkd-go.go
|
67
local-install.sh
Normal file
67
local-install.sh
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
### Ahenk Agent Local Installation Script
|
||||||
|
|
||||||
|
### --> Prerequisites
|
||||||
|
# go 1.20+
|
||||||
|
# systemd
|
||||||
|
|
||||||
|
# Change directory to main repo (cd ahenk-go)
|
||||||
|
# bash scripts/local-install.sh
|
||||||
|
|
||||||
|
### --> Variable Set
|
||||||
|
REPO_NAME="ahenk-go"
|
||||||
|
DAEMON_NAME="ahenk-go"
|
||||||
|
CONF_DIR="/etc/ahenk-go/"
|
||||||
|
TEMP_DIR="$(mktemp -d)"
|
||||||
|
MAIN_DIR="${TEMP_DIR}/${REPO_NAME}/"
|
||||||
|
echo -e "VARIABLES SET\n"
|
||||||
|
|
||||||
|
|
||||||
|
### --> Pre-Cleaning
|
||||||
|
sudo rm /usr/bin/${DAEMON_NAME}
|
||||||
|
sudo killall "$DAEMON_NAME"
|
||||||
|
sudo systemctl disable "$DAEMON_NAME"
|
||||||
|
sudo systemctl stop "$DAEMON_NAME"
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo rm -rf "$CONF_DIR"
|
||||||
|
sudo mkdir -p "$CONF_DIR"
|
||||||
|
echo -e "PRE-CLENING DONE\n"
|
||||||
|
|
||||||
|
|
||||||
|
### --> Building
|
||||||
|
cp -r ../ "$TEMP_DIR"
|
||||||
|
cd "$TEMP_DIR" || exit
|
||||||
|
echo "$TEMP_DIR"
|
||||||
|
cd "$MAIN_DIR" || exit
|
||||||
|
|
||||||
|
# cmd/ahenkd-go
|
||||||
|
cd cmd/ahenkd-go || exit
|
||||||
|
sudo go build -o "/usr/bin/ahenkd-go"
|
||||||
|
|
||||||
|
echo -e "BUILDING DONE\n"
|
||||||
|
|
||||||
|
### --> Configurations
|
||||||
|
sudo touch "$CONF_DIR/user.info"
|
||||||
|
sudo cat << EOF | sudo tee -a "$CONF_DIR/user.info" > /dev/null
|
||||||
|
The current working directory is: $PWD
|
||||||
|
You are logged in as $(whoami)
|
||||||
|
$HOME $USER $SUDO_USER
|
||||||
|
EOF
|
||||||
|
sudo chown root:root "$CONF_DIR/user.info"
|
||||||
|
sudo chmod 640 "$CONF_DIR/user.info"
|
||||||
|
echo -e "CONFIGURATIONS DONE\n"
|
||||||
|
|
||||||
|
### --> Installing
|
||||||
|
if [[ $(ps -p 1 | awk 'FNR == 2 {print $4} ') == "systemd" ]]
|
||||||
|
then
|
||||||
|
sudo mv "${MAIN_DIR}debian/${DAEMON_NAME}.service" /etc/systemd/system/
|
||||||
|
fi
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable "$DAEMON_NAME"
|
||||||
|
sudo systemctl start "$DAEMON_NAME"
|
||||||
|
echo -e "INSTALLING DONE\n"
|
||||||
|
|
||||||
|
### --> Post-Cleaning
|
||||||
|
sudo rm -rf "$TEMP_DIR"
|
||||||
|
echo -e "POST-CLEANING DONE\n"
|
|
@ -1,43 +0,0 @@
|
||||||
package osinfo
|
|
||||||
|
|
||||||
import (
|
|
||||||
"runtime"
|
|
||||||
|
|
||||||
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils"
|
|
||||||
"github.com/shirou/gopsutil/cpu"
|
|
||||||
"github.com/zcalusic/sysinfo"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CPU struct {
|
|
||||||
Vendor string `json:"vendor,omitempty"`
|
|
||||||
Model string `json:"model,omitempty"`
|
|
||||||
Speed uint `json:"speed,omitempty"` // CPU clock rate in MHz
|
|
||||||
Cache uint `json:"cache,omitempty"` // CPU cache size in KB
|
|
||||||
Cpus uint `json:"cpus,omitempty"` // number of physical CPUs
|
|
||||||
Cores uint `json:"cores,omitempty"` // number of physical CPU cores
|
|
||||||
Threads uint `json:"threads,omitempty"` // number of logical (HT) CPU cores
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *System) getCPUInfo() {
|
|
||||||
if runtime.GOOS == "linux" {
|
|
||||||
var si sysinfo.SysInfo
|
|
||||||
si.GetSysInfo()
|
|
||||||
|
|
||||||
h.CPU.Vendor = si.CPU.Vendor
|
|
||||||
h.CPU.Model = si.CPU.Model
|
|
||||||
h.CPU.Speed = si.CPU.Speed
|
|
||||||
h.CPU.Cache = si.CPU.Cache
|
|
||||||
h.CPU.Cpus = si.CPU.Cpus
|
|
||||||
h.CPU.Cores = si.CPU.Cores
|
|
||||||
h.CPU.Threads = si.CPU.Threads
|
|
||||||
} else {
|
|
||||||
cpuInfo, err := cpu.Info()
|
|
||||||
utils.Check(err)
|
|
||||||
h.CPU.Vendor = cpuInfo[0].VendorID
|
|
||||||
h.CPU.Vendor = cpuInfo[0].Model
|
|
||||||
// h.CPU.Vendor = cpuInfo[0].Speed // TODO
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// REVIEW Windows compatibility and separate files
|
|
|
@ -1,55 +0,0 @@
|
||||||
package osinfo
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils"
|
|
||||||
"github.com/shirou/gopsutil/disk"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Disk struct {
|
|
||||||
Devices string `json:"devices,omitempty"` // physical disk devices as string
|
|
||||||
Total float64 `json:"total,omitempty"` // Total Disk size in GiB
|
|
||||||
Used float64 `json:"used,omitempty"` // Used Disk size in GiB
|
|
||||||
Free float64 `json:"free,omitempty"` // Free Disk size in GiB
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *System) getDiskInfo() {
|
|
||||||
|
|
||||||
for _, v := range GetDisks() {
|
|
||||||
h.Disk.Devices += v.Device + ", "
|
|
||||||
}
|
|
||||||
h.Disk.Total = GetDiskUsage()["spaceTotal"]
|
|
||||||
h.Disk.Used = GetDiskUsage()["usedTotal"]
|
|
||||||
h.Disk.Free = GetDiskUsage()["usedFree"]
|
|
||||||
}
|
|
||||||
|
|
||||||
// return all physical disks, USB and CD-ROM devices
|
|
||||||
//
|
|
||||||
// An example output:
|
|
||||||
// device: /dev/example, mountpoint: /, fstype: ext4, opts:rw,noatime
|
|
||||||
func GetDisks() []disk.PartitionStat {
|
|
||||||
parts, err := disk.Partitions(false)
|
|
||||||
utils.Check(err)
|
|
||||||
return parts
|
|
||||||
}
|
|
||||||
|
|
||||||
// return disk usage as GiB
|
|
||||||
//
|
|
||||||
// TODO different functions for all disks / a specified disk?
|
|
||||||
// FIXME Wrong Disk values for docker !!! (probably because counting also virtual mountpoints?)
|
|
||||||
func GetDiskUsage() map[string]float64 {
|
|
||||||
var totalSize, freeSize, usedSize uint64
|
|
||||||
for _, part := range GetDisks() {
|
|
||||||
u, err := disk.Usage(part.Mountpoint)
|
|
||||||
utils.Check(err)
|
|
||||||
totalSize += u.Total
|
|
||||||
freeSize += u.Free
|
|
||||||
usedSize += u.Used
|
|
||||||
}
|
|
||||||
return map[string]float64{
|
|
||||||
"spaceTotal": utils.Byte2GiB(totalSize),
|
|
||||||
"freeTotal": utils.Byte2GiB(freeSize),
|
|
||||||
"usedTotal": utils.Byte2GiB(usedSize),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// REVIEW Windows compatibility and separate files
|
|
|
@ -1,32 +0,0 @@
|
||||||
package osinfo
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils"
|
|
||||||
"github.com/zcalusic/sysinfo"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Kernel struct {
|
|
||||||
Sysname string `json:"sysname,omitempty"`
|
|
||||||
Release string `json:"release,omitempty"`
|
|
||||||
Version string `json:"version,omitempty"`
|
|
||||||
Arch string `json:"arch,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *System) getKernelInfo() {
|
|
||||||
|
|
||||||
var si sysinfo.SysInfo
|
|
||||||
si.GetSysInfo()
|
|
||||||
|
|
||||||
var uname syscall.Utsname
|
|
||||||
if err := syscall.Uname(&uname); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
h.Kernel.Sysname = utils.Byte2String(uname.Sysname[:])
|
|
||||||
h.Kernel.Release = si.Kernel.Release
|
|
||||||
h.Kernel.Version = si.Kernel.Version
|
|
||||||
h.Kernel.Arch = si.Kernel.Architecture
|
|
||||||
}
|
|
||||||
|
|
||||||
// REVIEW Windows compatibility
|
|
|
@ -1,39 +0,0 @@
|
||||||
package osinfo
|
|
||||||
|
|
||||||
const KB = uint64(1024)
|
|
||||||
|
|
||||||
type System struct {
|
|
||||||
Kernel Kernel `json:"kernel"`
|
|
||||||
OS OS `json:"OS"`
|
|
||||||
Node Node `json:"node"`
|
|
||||||
|
|
||||||
CPU CPU `json:"cpu"`
|
|
||||||
Memory Memory `json:"memory"`
|
|
||||||
Disk Disk `json:"disk"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// initializes all hardware structs that gets software and hardware (system) information
|
|
||||||
func (h *System) GetSystemInfo() {
|
|
||||||
h.getKernelInfo()
|
|
||||||
h.getOSInfo()
|
|
||||||
h.getNodeInfo()
|
|
||||||
|
|
||||||
h.getCPUInfo()
|
|
||||||
h.getMemoryInfo()
|
|
||||||
h.getDiskInfo()
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO seperate file structure (as in gopsutil)
|
|
||||||
/*
|
|
||||||
main.go
|
|
||||||
disk/
|
|
||||||
--disk.go
|
|
||||||
--disk_linux.go
|
|
||||||
--disk_windows.go
|
|
||||||
cpu/
|
|
||||||
--cpu.go
|
|
||||||
--cpu_linux.go
|
|
||||||
--cpu_windows.go
|
|
||||||
memory/ ...
|
|
||||||
...
|
|
||||||
*/
|
|
|
@ -1,33 +0,0 @@
|
||||||
package osinfo
|
|
||||||
|
|
||||||
import (
|
|
||||||
"runtime"
|
|
||||||
|
|
||||||
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils"
|
|
||||||
"github.com/shirou/gopsutil/mem"
|
|
||||||
"github.com/zcalusic/sysinfo"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Memory struct {
|
|
||||||
Type string `json:"type,omitempty"`
|
|
||||||
Speed uint `json:"speed,omitempty"` // RAM data rate in MT/s
|
|
||||||
Total float64 `json:"total,omitempty"` // Total RAM size in GiB
|
|
||||||
Used float64 `json:"used,omitempty"` // Used RAM size in GiB
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *System) getMemoryInfo() { // TODO also implement swap usage
|
|
||||||
memInfo, err := mem.VirtualMemory()
|
|
||||||
utils.Check(err)
|
|
||||||
h.Memory.Used = utils.Byte2GiB(memInfo.Used)
|
|
||||||
h.Memory.Total = utils.Byte2GiB(memInfo.Total)
|
|
||||||
|
|
||||||
if runtime.GOOS == "linux" {
|
|
||||||
var si sysinfo.SysInfo
|
|
||||||
si.GetSysInfo()
|
|
||||||
|
|
||||||
h.Memory.Type = si.Memory.Type
|
|
||||||
h.Memory.Speed = si.Memory.Speed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// REVIEW Windows compatibility and separate files
|
|
|
@ -1,34 +0,0 @@
|
||||||
package osinfo
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils"
|
|
||||||
"github.com/zcalusic/sysinfo"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Node struct {
|
|
||||||
Domainname string `json:"domainname,omitempty"`
|
|
||||||
Hostname string `json:"hostname,omitempty"`
|
|
||||||
MachineID string `json:"machineid,omitempty"`
|
|
||||||
Hypervisor string `json:"hypervisor,omitempty"`
|
|
||||||
Timezone string `json:"timezone,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *System) getNodeInfo() {
|
|
||||||
var si sysinfo.SysInfo
|
|
||||||
si.GetSysInfo()
|
|
||||||
|
|
||||||
var uname syscall.Utsname
|
|
||||||
if err := syscall.Uname(&uname); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
h.Node.Domainname = utils.Byte2String(uname.Domainname[:])
|
|
||||||
h.Node.Hostname = si.Node.Hostname
|
|
||||||
h.Node.MachineID = si.Node.MachineID
|
|
||||||
h.Node.Hypervisor = si.Node.Hypervisor
|
|
||||||
h.Node.Timezone = si.Node.Timezone
|
|
||||||
}
|
|
||||||
|
|
||||||
// REVIEW Windows compatibility
|
|
|
@ -1,9 +0,0 @@
|
||||||
package osinfo
|
|
||||||
|
|
||||||
type OS struct {
|
|
||||||
Name string `json:"name,omitempty"`
|
|
||||||
Distro string `json:"distro,omitempty"`
|
|
||||||
Version string `json:"version,omitempty"`
|
|
||||||
Release string `json:"release,omitempty"`
|
|
||||||
Arch string `json:"architecture,omitempty"`
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
//go:build linux && !windows
|
|
||||||
|
|
||||||
package osinfo
|
|
||||||
|
|
||||||
import "github.com/zcalusic/sysinfo"
|
|
||||||
|
|
||||||
func (h *System) getOSInfo() { //REVIEW review info in pardus
|
|
||||||
var si sysinfo.SysInfo
|
|
||||||
si.GetSysInfo()
|
|
||||||
|
|
||||||
h.OS.Name = si.OS.Name
|
|
||||||
h.OS.Distro = si.OS.Vendor
|
|
||||||
h.OS.Version = si.OS.Version
|
|
||||||
h.OS.Release = si.OS.Release
|
|
||||||
h.OS.Arch = si.OS.Architecture
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
//go:build windows
|
|
||||||
|
|
||||||
package osinfo
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils"
|
|
||||||
"golang.org/x/sys/windows/registry"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (h *System) getOSInfo() {
|
|
||||||
|
|
||||||
reg, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
|
|
||||||
utils.Check(err)
|
|
||||||
defer reg.Close()
|
|
||||||
|
|
||||||
pn, _, err := reg.GetStringValue("ProductName")
|
|
||||||
utils.Check(err)
|
|
||||||
|
|
||||||
h.OS.Name = pn
|
|
||||||
// TODO add other h.OS values
|
|
||||||
}
|
|
|
@ -1,69 +0,0 @@
|
||||||
package utils
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"golang.org/x/text/cases"
|
|
||||||
"golang.org/x/text/language"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Byte2String(arr []int8) string {
|
|
||||||
b := make([]byte, len(arr))
|
|
||||||
for i, v := range arr {
|
|
||||||
b[i] = byte(v)
|
|
||||||
}
|
|
||||||
return string(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Byte2MiB(b uint64) float64 {
|
|
||||||
return float64(float64(b) / (1024 * 1024))
|
|
||||||
}
|
|
||||||
|
|
||||||
func Byte2GiB(b uint64) float64 {
|
|
||||||
return float64(float64(b) / (1024 * 1024 * 1024))
|
|
||||||
}
|
|
||||||
|
|
||||||
func MB2GiB(b uint64) float64 {
|
|
||||||
return float64(float64(b*1000*1000) / (1024 * 1024 * 1024))
|
|
||||||
}
|
|
||||||
|
|
||||||
func CheckPath(path string) (bool, error) {
|
|
||||||
_, err := os.Stat(path)
|
|
||||||
if err == nil {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreatePath(path string) {
|
|
||||||
if flag, err := CheckPath(path); flag {
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
} else if err := os.Mkdir(path, os.ModePerm); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Check(err error) {
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func OpenLogFile(path string) *os.File {
|
|
||||||
f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return f
|
|
||||||
}
|
|
||||||
|
|
||||||
// Makes first character uppercase of given English string
|
|
||||||
func FirstUpperEN(str string) string {
|
|
||||||
return cases.Title(language.English).String(str)
|
|
||||||
} // TODO cases.NoLower vs cases.Compact !
|
|
|
@ -1,14 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
func (p plug) Info() map[string]interface{} {
|
|
||||||
return map[string]interface{}{
|
|
||||||
"name": "resources",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"support": map[string]interface{}{
|
|
||||||
"linux": "debian",
|
|
||||||
"windows": "10",
|
|
||||||
},
|
|
||||||
"description": "Resource Usage Information and Controls",
|
|
||||||
"developer": "asandikci@aliberksandikci.com.tr",
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,67 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"runtime"
|
|
||||||
|
|
||||||
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/osinfo"
|
|
||||||
)
|
|
||||||
|
|
||||||
type plug string
|
|
||||||
|
|
||||||
// exported plugin Symbol
|
|
||||||
var ResourcesConnect plug
|
|
||||||
|
|
||||||
// return instant resource usage information
|
|
||||||
func (p plug) ResourceUsage() map[string]interface{} {
|
|
||||||
var system osinfo.System
|
|
||||||
system.GetSystemInfo()
|
|
||||||
|
|
||||||
data := map[string]interface{}{
|
|
||||||
// CPU Information
|
|
||||||
"CPU Physical Core Count": system.CPU.Cores,
|
|
||||||
// "CPU Logical Core Count": system.CPU.Logical_core_count, // TODO
|
|
||||||
// "CPU Actual Hz": system.CPU.ActualHz, // TODO
|
|
||||||
// "CPU Advertised Hz": system.CPU.Hz_advertised, // TODO
|
|
||||||
// "Processor": system.CPU.Brand, // TODO
|
|
||||||
|
|
||||||
// Memory Information
|
|
||||||
"Total Memory": system.Memory.Total,
|
|
||||||
"Usage": system.Memory.Used,
|
|
||||||
|
|
||||||
// Disk Information
|
|
||||||
"Total Disk": system.Disk.Total,
|
|
||||||
"Usage Disk": system.Disk.Used,
|
|
||||||
"Device": system.Disk.Devices,
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO see https://github.com/Pardus-LiderAhenk/ahenk/blob/master/src/plugins/resource-usage/resource_info_fetcher.py
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
|
|
||||||
// return general Agent system information
|
|
||||||
//
|
|
||||||
// these values changes rarely, see ResourceUsage() function for instant resource usage information
|
|
||||||
func (p plug) AgentInfo() map[string]interface{} {
|
|
||||||
var system osinfo.System
|
|
||||||
system.GetSystemInfo()
|
|
||||||
|
|
||||||
// Common data
|
|
||||||
data := map[string]interface{}{
|
|
||||||
"System": runtime.GOOS,
|
|
||||||
"DiskSpaceTotal": system.Disk.Total,
|
|
||||||
"MemoryTotal": system.Memory.Total,
|
|
||||||
// TODO "AhenkVersion": get Ahenk self version here
|
|
||||||
|
|
||||||
"Name": system.OS.Name,
|
|
||||||
"Distribution": system.OS.Distro,
|
|
||||||
"Arch": system.OS.Arch,
|
|
||||||
"Version": system.OS.Version,
|
|
||||||
"Hostname": system.Node.Hostname,
|
|
||||||
"KernelVersion": system.Kernel.Version,
|
|
||||||
"KernelRelease": system.Kernel.Release,
|
|
||||||
}
|
|
||||||
|
|
||||||
// REVIEW is calling all functions one by one slow downs code?
|
|
||||||
// TODO see https://github.com/Pardus-LiderAhenk/ahenk/blob/master/src/plugins/resource-usage/agent_info.py
|
|
||||||
return data
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
func (p plug) Info() map[string]interface{} {
|
|
||||||
return map[string]interface{}{
|
|
||||||
"name": "tmptest",
|
|
||||||
"version": "1.0.2",
|
|
||||||
"support": "any",
|
|
||||||
"description": "Temporary testing",
|
|
||||||
"developer": "asandikci@aliberksandikci.com.tr",
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type plug string
|
|
||||||
|
|
||||||
// exported plugin Symbol
|
|
||||||
var TmptestConnect plug
|
|
||||||
|
|
||||||
func (p plug) TmpTest() {
|
|
||||||
fmt.Println()
|
|
||||||
fmt.Println("----- Entered Test Area -----")
|
|
||||||
fmt.Println()
|
|
||||||
fmt.Println()
|
|
||||||
//s
|
|
||||||
// THIS FILE WON'T UPDATE ANYMORE (bsecause of .gitignore)
|
|
||||||
|
|
||||||
fmt.Println()
|
|
||||||
fmt.Println()
|
|
||||||
fmt.Println("----- End of Test Area -----")
|
|
||||||
fmt.Println()
|
|
||||||
time.Sleep(5 * time.Second)
|
|
||||||
}
|
|
Loading…
Reference in a new issue