Initial commit need to add nix code to setup service and timer example service and timer are provided
This commit is contained in:
commit
48fb09cfb9
9 changed files with 249 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
latest_version.txt
|
||||||
26
flake.lock
generated
Normal file
26
flake.lock
generated
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1750400657,
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "b2485d56967598da068b5a6946dadda8bfcbcd37",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-25.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
60
flake.nix
Normal file
60
flake.nix
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
{
|
||||||
|
description = "A simple Go package";
|
||||||
|
|
||||||
|
# Nixpkgs / NixOS version to use.
|
||||||
|
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{ self, nixpkgs }:
|
||||||
|
let
|
||||||
|
# System types to support.
|
||||||
|
supportedSystems = [
|
||||||
|
"x86_64-linux"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Helper function to generate an attrset '{ x86_64-linux = f "x86_64-linux"; ... }'.
|
||||||
|
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
|
||||||
|
|
||||||
|
# Nixpkgs instantiated for supported system types.
|
||||||
|
nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; });
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
# Provide some binary packages for selected system types by mapping over each system architecture.
|
||||||
|
packages = forAllSystems (
|
||||||
|
system:
|
||||||
|
let
|
||||||
|
# Set pkgs = the correct version for a given architecture.
|
||||||
|
pkgs = nixpkgsFor.${system};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
#TODO: NEED TO GO OVER THIS SYNTAX AGAIN.
|
||||||
|
go-hello = pkgs.callPackage ./package.nix { };
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
# Add dependencies that are only needed for development, this also allows for nix develop command to launch a devshell
|
||||||
|
devShells = forAllSystems (
|
||||||
|
system:
|
||||||
|
let
|
||||||
|
pkgs = nixpkgsFor.${system};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
default = pkgs.mkShell {
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
go
|
||||||
|
gopls
|
||||||
|
gotools
|
||||||
|
go-tools
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
# The default package for 'nix build'. This makes sense if the
|
||||||
|
# flake provides only one package or there is a clear "main"
|
||||||
|
# package.
|
||||||
|
defaultPackage = forAllSystems (system: self.packages.${system}.go-hello);
|
||||||
|
};
|
||||||
|
}
|
||||||
2
go.mod
Normal file
2
go.mod
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
module reforgerds-updater
|
||||||
|
go 1.16
|
||||||
106
main.go
Normal file
106
main.go
Normal file
|
|
@ -0,0 +1,106 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Update struct {
|
||||||
|
Version string `json:"version"`
|
||||||
|
Build string `json:"build"`
|
||||||
|
Published string `json:"published"`
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
updateURL = "http://127.0.0.1:3000/updates"
|
||||||
|
stateFilePath = "latest_version.txt"
|
||||||
|
)
|
||||||
|
func main() {
|
||||||
|
resp, err := http.Get(updateURL)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Failed to fetch updates: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, _ := io.ReadAll(resp.Body)
|
||||||
|
|
||||||
|
var updates []Update
|
||||||
|
err = json.Unmarshal(body, &updates)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Failed to parse response: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(updates) == 0 {
|
||||||
|
fmt.Println("No updates found.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
latest := updates[0].Version
|
||||||
|
|
||||||
|
prevVersion := ""
|
||||||
|
if data, err := os.ReadFile(stateFilePath); err == nil {
|
||||||
|
prevVersion = strings.TrimSpace(string(data))
|
||||||
|
}
|
||||||
|
|
||||||
|
if prevVersion == "" {
|
||||||
|
fmt.Println("No previous version found. Storing latest:", latest)
|
||||||
|
_ = os.WriteFile(stateFilePath, []byte(latest), 0644)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if versionCompare(latest, prevVersion) > 0 {
|
||||||
|
fmt.Printf("New version found! %s > %s\n", latest, prevVersion)
|
||||||
|
|
||||||
|
// Run steamcmd with reforger_update script
|
||||||
|
fmt.Println("Running update command...")
|
||||||
|
cmd := exec.Command("./steamcmd.sh", "+runscript", "reforger_update")
|
||||||
|
cmd.Stdout = os.Stdout
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Update command failed: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the new latest version
|
||||||
|
_ = os.WriteFile(stateFilePath, []byte(latest), 0644)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("No new version. Latest seen: %s\n", prevVersion)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func versionCompare(a, b string) int {
|
||||||
|
segA := strings.Split(a, ".")
|
||||||
|
segB := strings.Split(b, ".")
|
||||||
|
|
||||||
|
max := len(segA)
|
||||||
|
if len(segB) > max {
|
||||||
|
max = len(segB)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < max; i++ {
|
||||||
|
var ai, bi int
|
||||||
|
if i < len(segA) {
|
||||||
|
fmt.Sscanf(segA[i], "%d", &ai)
|
||||||
|
}
|
||||||
|
if i < len(segB) {
|
||||||
|
fmt.Sscanf(segB[i], "%d", &bi)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ai > bi {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
if ai < bi {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
30
package.nix
Normal file
30
package.nix
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
{ buildGoModule, gitMinimal }:
|
||||||
|
# This is the wrapping around mkderivation that abstracts away the standard boilerplate logic for building go packages.
|
||||||
|
buildGoModule {
|
||||||
|
# The final built binary name.
|
||||||
|
pname = "go-hello";
|
||||||
|
# The binary version | NEEDS TO BE IN STEP WITH GO MOD.
|
||||||
|
version = "v1.0.0";
|
||||||
|
# In 'nix develop', we don't need a copy of the source tree
|
||||||
|
# in the Nix store.
|
||||||
|
src = builtins.path {
|
||||||
|
name = "source";
|
||||||
|
path = ./.;
|
||||||
|
};
|
||||||
|
|
||||||
|
# required deps for build time nativeBuildInputs are runtime deps
|
||||||
|
buildInputs = [
|
||||||
|
# Just an example input
|
||||||
|
gitMinimal
|
||||||
|
];
|
||||||
|
# This hash locks the dependencies of this package. It is
|
||||||
|
# necessary because of how Go requires network access to resolve
|
||||||
|
# VCS. See https://www.tweag.io/blog/2021-03-04-gomod2nix/ for
|
||||||
|
# details. Normally one can build with a fake hash and rely on native Go
|
||||||
|
# mechanisms to tell you what the hash should be or determine what
|
||||||
|
# it should be "out-of-band" with other tooling (eg. gomod2nix).
|
||||||
|
# To begin with it is recommended to set this, but one must
|
||||||
|
# remember to bump this hash when your dependencies change.
|
||||||
|
# vendorHash = pkgs.lib.fakeHash;
|
||||||
|
vendorHash = null;
|
||||||
|
}
|
||||||
6
reforger-updater.service
Normal file
6
reforger-updater.service
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Check and run reforger update if needed
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/local/bin/reforger-updater
|
||||||
10
reforger-updater.timer
Normal file
10
reforger-updater.timer
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Run reforger-updater every 4 hours
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnBootSec=5min
|
||||||
|
OnUnitActiveSec=4h
|
||||||
|
Persistent=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
8
reforger_update
Normal file
8
reforger_update
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
// update_arma_reforger_ds
|
||||||
|
//
|
||||||
|
@ShutdownOnFailedCommand 1
|
||||||
|
@NoPromptForPassword 1
|
||||||
|
force_install_dir ../reforger
|
||||||
|
login anonymous
|
||||||
|
app_update 1874900 validate
|
||||||
|
quit
|
||||||
Loading…
Add table
Add a link
Reference in a new issue