Skip to content

Commit

Permalink
chore: create utils files #30 (#49)
Browse files Browse the repository at this point in the history
  • Loading branch information
jchiarulli authored Oct 1, 2024
1 parent f9ada5d commit 139e5e2
Show file tree
Hide file tree
Showing 30 changed files with 626 additions and 912 deletions.
2 changes: 1 addition & 1 deletion cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func init() {
// Cobra supports persistent flags, which, if defined here,
// will be global for your application.

// rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.relaywiz.yaml)")
// rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.rwz.yaml)")

// Cobra also supports local flags, which will only run
// when this action is called directly.
Expand Down
19 changes: 9 additions & 10 deletions pkg/network/certbot.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package network

import (
"fmt"
"github.com/nodetec/rwz/pkg/utils"
"github.com/nodetec/rwz/pkg/utils/directories"
"github.com/nodetec/rwz/pkg/utils/files"
"github.com/pterm/pterm"
"log"
"os"
"os/exec"
)

Expand All @@ -32,28 +32,27 @@ func GetCertificates(domainName, email string) bool {

spinner, _ := pterm.DefaultSpinner.Start("Checking SSL certificates...")

var certificatePath = fmt.Sprintf("/etc/letsencrypt/live/%s", domainName)

// Check if certificates already exist
if utils.FileExists(fmt.Sprintf("/etc/letsencrypt/live/%s/fullchain.pem", domainName)) &&
utils.FileExists(fmt.Sprintf("/etc/letsencrypt/live/%s/privkey.pem", domainName)) {
if files.FileExists(fmt.Sprintf("%s/fullchain.pem", certificatePath)) &&
files.FileExists(fmt.Sprintf("%s/privkey.pem", certificatePath)) {
spinner.Info("SSL certificates already exist.")
return true
}

err := os.MkdirAll(fmt.Sprintf("/var/www/%s/.well-known/acme-challenge/", domainName), 0755)
if err != nil {
log.Fatalf("Error creating directories for Certbot: %v", err)
}
directories.CreateDirectory(fmt.Sprintf("/var/www/%s/.well-known/acme-challenge/", domainName), 0755)

spinner.UpdateText("Obtaining SSL certificates...")
if email == "" {
cmd := exec.Command("certbot", "certonly", "--webroot", "-w", fmt.Sprintf("/var/www/%s", domainName), "-d", domainName, "--agree-tos", "--no-eff-email", "-q", "--register-unsafely-without-email")
err = cmd.Run()
err := cmd.Run()
if err != nil {
log.Fatalf("Certbot failed to obtain the certificate for %s: %v", domainName, err)
}
} else {
cmd := exec.Command("certbot", "certonly", "--webroot", "-w", fmt.Sprintf("/var/www/%s", domainName), "-d", domainName, "--email", email, "--agree-tos", "--no-eff-email", "-q")
err = cmd.Run()
err := cmd.Run()
if err != nil {
log.Fatalf("Certbot failed to obtain the certificate for %s: %v", domainName, err)
}
Expand Down
58 changes: 15 additions & 43 deletions pkg/relays/khatru29/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,9 @@ package khatru29

import (
"fmt"
"github.com/nodetec/rwz/pkg/utils/directories"
"github.com/nodetec/rwz/pkg/utils/files"
"github.com/pterm/pterm"
"io"
"log"
"net/http"
"os"
"os/exec"
"path/filepath"
)

Expand All @@ -28,44 +25,22 @@ func InstallRelayBinary() {
spinner, _ := pterm.DefaultSpinner.Start("Installing Khatru29 relay...")

// Ensure the data directory exists
err := os.MkdirAll(dataDir, 0755)
if err != nil {
log.Fatalf("Error creating data directory: %v", err)
}
directories.CreateDirectory(dataDir, 0755)

// Determine the file name from the URL
tempFileName := filepath.Base(downloadURL)

// Create the temporary file
out, err := os.Create(fmt.Sprintf("/tmp/%s", tempFileName))
if err != nil {
log.Fatalf("Error creating temporary file: %v", err)
}
defer out.Close()

// Download the file
resp, err := http.Get(downloadURL)
if err != nil {
log.Fatalf("Error downloading file: %v", err)
}
defer resp.Body.Close()

// Check server response
if resp.StatusCode != http.StatusOK {
log.Fatalf("Bad status: %s", resp.Status)
}

// Write the body to the temporary file
_, err = io.Copy(out, resp.Body)
if err != nil {
log.Fatalf("Error writing to temporary file: %v", err)
}
tmpFileName := filepath.Base(downloadURL)

// Temporary file path
tmpFilePath := fmt.Sprintf("/tmp/%s", tmpFileName)

// Check if the temporary file exists and remove it if it does
files.RemoveFile(tmpFilePath)

// Download and copy the file
files.DownloadAndCopyFile(tmpFilePath, downloadURL)

// Extract binary
err = exec.Command("tar", "-xf", fmt.Sprintf("/tmp/%s", tempFileName), "-C", fmt.Sprintf("%s", destDir)).Run()
if err != nil {
log.Fatalf("Error extracting binary to /usr/local/bin: %v", err)
}
files.ExtractFile(tmpFilePath, destDir)

// TODO
// Currently, the downloaded binary is expected to have a name that matches the binaryName variable
Expand All @@ -75,10 +50,7 @@ func InstallRelayBinary() {
destPath := filepath.Join(destDir, binaryName)

// Make the file executable
err = os.Chmod(destPath, 0755)
if err != nil {
log.Fatalf("Error making file executable: %v", err)
}
files.SetPermissions(destPath, 0755)

spinner.Success("Khatru29 relay installed successfully.")
}
30 changes: 9 additions & 21 deletions pkg/relays/khatru29/nginx_http.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,23 @@ package khatru29

import (
"fmt"
"github.com/nodetec/rwz/pkg/utils/directories"
"github.com/nodetec/rwz/pkg/utils/files"
"github.com/nodetec/rwz/pkg/utils/systemd"
"github.com/pterm/pterm"
"log"
"os"
"os/exec"
)

// Function to configure nginx for HTTP
func ConfigureNginxHttp(domainName string) {
spinner, _ := pterm.DefaultSpinner.Start("Configuring nginx for HTTP...")

err := os.MkdirAll(fmt.Sprintf("/var/www/%s/.well-known/acme-challenge/", domainName), 0755)
if err != nil {
log.Fatalf("Error creating directories: %v", err)
}
const configFilePath = "/etc/nginx/conf.d/khatru29.conf"

const configFile = "khatru29.conf"
var configContent string

err = os.Remove(fmt.Sprintf("/etc/nginx/conf.d/%s", configFile))
if err != nil && !os.IsNotExist(err) {
log.Fatalf("Error removing existing nginx configuration: %v", err)
}
directories.CreateDirectory(fmt.Sprintf("/var/www/%s/.well-known/acme-challenge/", domainName), 0755)

var configContent string
files.RemoveFile(configFilePath)

configContent = fmt.Sprintf(`map $http_upgrade $connection_upgrade {
default upgrade;
Expand Down Expand Up @@ -57,15 +51,9 @@ server {
}
`, domainName, domainName, domainName)

err = os.WriteFile(fmt.Sprintf("/etc/nginx/conf.d/%s", configFile), []byte(configContent), 0644)
if err != nil {
log.Fatalf("Error writing nginx configuration: %v", err)
}
files.WriteFile(configFilePath, configContent, 0644)

err = exec.Command("systemctl", "restart", "nginx").Run()
if err != nil {
log.Fatalf("Error reloading nginx: %v", err)
}
systemd.RestartService("nginx")

spinner.Success("Nginx configured for HTTP")
}
24 changes: 7 additions & 17 deletions pkg/relays/khatru29/nginx_https.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,21 @@ package khatru29

import (
"fmt"
"github.com/nodetec/rwz/pkg/utils/files"
"github.com/nodetec/rwz/pkg/utils/systemd"
"github.com/pterm/pterm"
"log"
"os"
"os/exec"
)

// Function to configure nginx for HTTPS
func ConfigureNginxHttps(domainName string) {
spinner, _ := pterm.DefaultSpinner.Start("Configuring nginx for HTTPS...")

const configFile = "khatru29.conf"

err := os.Remove(fmt.Sprintf("/etc/nginx/conf.d/%s", configFile))
if err != nil && !os.IsNotExist(err) {
log.Fatalf("Error removing existing nginx configuration: %v", err)
}
const configFilePath = "/etc/nginx/conf.d/khatru29.conf"

var configContent string

files.RemoveFile(configFilePath)

configContent = fmt.Sprintf(`map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
Expand Down Expand Up @@ -128,15 +124,9 @@ server {
}
`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName)

err = os.WriteFile(fmt.Sprintf("/etc/nginx/conf.d/%s", configFile), []byte(configContent), 0644)
if err != nil {
log.Fatalf("Error writing nginx configuration: %v", err)
}
files.WriteFile(configFilePath, configContent, 0644)

err = exec.Command("systemctl", "reload", "nginx").Run()
if err != nil {
log.Fatalf("Error reloading nginx: %v", err)
}
systemd.ReloadService("nginx")

spinner.Success("Nginx configured for HTTPS")
}
96 changes: 16 additions & 80 deletions pkg/relays/khatru29/service.go
Original file line number Diff line number Diff line change
@@ -1,21 +1,13 @@
package khatru29

import (
"fmt"
"github.com/nodetec/rwz/pkg/utils/directories"
"github.com/nodetec/rwz/pkg/utils/files"
"github.com/nodetec/rwz/pkg/utils/systemd"
"github.com/nodetec/rwz/pkg/utils/users"
"github.com/pterm/pterm"
"log"
"os"
"os/exec"
"text/template"
)

// Function to check if a user exists
func userExists(username string) bool {
cmd := exec.Command("id", "-u", username)
err := cmd.Run()
return err == nil
}

// Function to set up the relay service
func SetupRelayService(domain, privKey string) {
// Template for the environment file
Expand Down Expand Up @@ -61,99 +53,43 @@ WantedBy=multi-user.target
spinner, _ := pterm.DefaultSpinner.Start("Configuring relay service...")

// Ensure the user for the relay service exists
if !userExists("nostr") {
if !users.UserExists("nostr") {
spinner.UpdateText("Creating user 'nostr'...")
err := exec.Command("adduser", "--disabled-login", "--gecos", "", "nostr").Run()
if err != nil {
log.Fatalf("Error creating user: %v", err)
}
users.CreateUser("nostr", true)
} else {
spinner.UpdateText("User 'nostr' already exists")
}

// Ensure the data directory exists and set ownership
spinner.UpdateText("Creating data directory...")
err := os.MkdirAll(dataDir, 0755)
if err != nil {
log.Fatalf("Error creating data directory: %v", err)
}
directories.CreateDirectory(dataDir, 0755)

// Use chown command to set ownership of the data directory to the nostr user
err = exec.Command("chown", "-R", "nostr:nostr", dataDir).Run()
if err != nil {
log.Fatalf("Error setting ownership of the data directory: %v", err)
}
directories.SetOwnerAndGroup("nostr", "nostr", dataDir)

// Check if the environment file exists and remove it if it does
if _, err := os.Stat(envFilePath); err == nil {
err = os.Remove(envFilePath)
if err != nil {
log.Fatalf("Error removing environment file: %v", err)
}
}
files.RemoveFile(envFilePath)

// Check if the service file exists and remove it if it does
if _, err := os.Stat(serviceFilePath); err == nil {
err = os.Remove(serviceFilePath)
if err != nil {
log.Fatalf("Error removing service file: %v", err)
}
}
files.RemoveFile(serviceFilePath)

// Create the environment file
spinner.UpdateText("Creating environment file...")
envFile, err := os.Create(envFilePath)
if err != nil {
log.Fatalf("Error creating environment file: %v", err)
}
defer envFile.Close()

envTmpl, err := template.New("env").Parse(envTemplate)
if err != nil {
log.Fatalf("Error parsing environment template: %v", err)
}

err = envTmpl.Execute(envFile, struct{ Domain, PrivKey string }{Domain: domain, PrivKey: privKey})
if err != nil {
log.Fatalf("Error executing environment template: %v", err)
}
envFileParams := systemd.EnvFileParams{Domain: domain, PrivKey: privKey}
systemd.CreateEnvFile(envFilePath, envTemplate, &envFileParams)

// Create the systemd service file
spinner.UpdateText("Creating service file...")
serviceFile, err := os.Create(serviceFilePath)
if err != nil {
log.Fatalf("Error creating service file: %v", err)
}
defer serviceFile.Close()

tmpl, err := template.New("service").Parse(serviceTemplate)
if err != nil {
log.Fatalf("Error parsing service template: %v", err)
}

err = tmpl.Execute(serviceFile, struct{}{})
if err != nil {
log.Fatalf("Error executing service template: %v", err)
}
systemd.CreateServiceFile(serviceFilePath, serviceTemplate)

// Reload systemd to apply the new service
spinner.UpdateText("Reloading systemd daemon...")
err = exec.Command("systemctl", "daemon-reload").Run()
if err != nil {
log.Fatalf("Error reloading systemd daemon: %v", err)
}
systemd.Reload()

// Enable and start the Nostr relay service
spinner.UpdateText("Enabling and starting service...")
err = exec.Command("systemctl", "enable", fmt.Sprintf("%s", relayService)).Run()
if err != nil {
log.Fatalf("Error enabling Nostr relay service: %v", err)
}

err = exec.Command("systemctl", "start", fmt.Sprintf("%s", relayService)).Run()
if err != nil {
log.Fatalf("Error starting Nostr relay service: %v", err)
}
systemd.EnableService(relayService)
systemd.StartService(relayService)

spinner.Success("Nostr relay service configured")
}
Loading

0 comments on commit 139e5e2

Please sign in to comment.