Skip to content

Commit

Permalink
htmc-cgi-ws refactoring and bug fix
Browse files Browse the repository at this point in the history
  • Loading branch information
Alessandro-Salerno committed Oct 21, 2024
1 parent bda150e commit f3f5fc6
Show file tree
Hide file tree
Showing 3 changed files with 203 additions and 125 deletions.
152 changes: 27 additions & 125 deletions cgi-ws/cgi-ws.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,94 +27,10 @@ import (
"net/http"
"net/http/cgi"
"os"
"os/exec"
"bufio"
"strings"
"io"
)

func checkUpdates() bool {
fmt.Println("Checking for updates...")

output_bytes, err := exec.Command("./bin/htmc", "--version").Output();
if err != nil {
fmt.Println("Error while checking for updates");
return false;
}

cur_v := string(output_bytes)

resp, err := http.Get("https://raw.githubusercontent.com/Alessandro-Salerno/htmc/refs/heads/latest-linux-bundle/.htmc-version")
if err != nil {
fmt.Println("Error while requesting new version string")
return false
}
defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {
fmt.Println("Error while requesting new version string")
return false
}

body_bytes, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error while reading server response")
return false
}

new_v := string(body_bytes)

fmt.Print("Installed: ")
fmt.Print(cur_v)
fmt.Print("Latest: ")
fmt.Print(new_v)

return !(cur_v == new_v)
}

func download(force bool, filepath string, url string) {
if (exists(filepath) && !force) {
fmt.Print("Ignoring downlaod of <")
fmt.Print(url)
fmt.Print("> because ")
fmt.Print(filepath)
fmt.Println(" already exists")
return
}

fmt.Print("Downloading <")
fmt.Print(url)
fmt.Print("> to ")
fmt.Print(filepath)
fmt.Print(" ... ")

out, err := os.Create(filepath)
if err != nil {
fmt.Println("IO Error")
return
}
defer out.Close()

resp, err := http.Get(url)
if err != nil {
fmt.Println("Request Error")
return
}
defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {
fmt.Println("Request Status Error")
return
}

_, err = io.Copy(out, resp.Body)
if err != nil {
fmt.Println("IO Error")
return
}
fmt.Println("Done!")
}

func htmcCGI(w http.ResponseWriter, r *http.Request) {
handler := cgi.Handler{Path: "./bin/htmc", Dir: "./", Args: []string{"-ll", "off", "-ns"}}
handler.ServeHTTP(w, r)
Expand All @@ -126,31 +42,11 @@ func exists(path string) (bool) {
}

func main() {
if !exists("./bin") {
err := os.MkdirAll("./bin", 0755)
if err != nil {
fmt.Println("Unable to create bin/ directory")
return
}
}

if !exists("./tmp") {
err := os.MkdirAll("./tmp", 0755)
if err != nil {
fmt.Println("Unable to create tmp/ directory")
return
}
}

if !exists("./include/libhtmc") {
err := os.MkdirAll("./include/libhtmc", 0755)
if err != nil {
fmt.Println("Unable to create include/libhtmc/ directory")
return
}
if !createDirectory(BIN_DIRECTORY_PATH) || !createDirectory(INCLUDE_DIRECTORY_PATH) || !createDirectory(TMP_DIRECTORY_PATH) {
return
}

if (!exists("./bin/htmc") && !exists("./bin/htmc.exe")) || !exists("./bin/libhtmc.a") || !exists("./include/libhtmc/libhtmc.h") {
if !exists(getHtmcExecPath()) || !exists(LIBHTMC_HEADER_PATH) || !exists(INDEX_HT_FILE) {
fmt.Print("You're missing some important htmc files, proceed with the download? [Y/n]: ")
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
Expand All @@ -166,46 +62,52 @@ func main() {
return
}

download(false, "./bin/htmc", "https://alessandro-salerno.github.io/htmc/bin/htmc")
download(false, "./bin/libhtmc.a", "https://alessandro-salerno.github.io/htmc/bin/libhtmc.a")
download(false, "./include/libhtmc/libhtmc.h", "https://alessandro-salerno.github.io/htmc/include/libhtmc/libhtmc.h")
download(false, "./index.htmc", "https://alessandro-salerno.github.io/htmc/examples/index.htmc")
download(false, getHtmcExecPath(), "https://alessandro-salerno.github.io/htmc/bin/htmc")
download(false, LIBHTMC_BINARY_PATH, "https://alessandro-salerno.github.io/htmc/bin/libhtmc.a")
download(false, LIBHTMC_HEADER_PATH, "https://alessandro-salerno.github.io/htmc/include/libhtmc/libhtmc.h")
download(false, INDEX_HT_FILE, "https://alessandro-salerno.github.io/htmc/examples/index.htmc")

// Temporary hard code
if exec.Command("chmod", "+x", "./bin/htmc").Run() != nil {
fmt.Println("Error while setting permissions for ./bin/htmc")
if !markFileAsExecutable(getHtmcExecPath()) {
return
}
}

// This is used as a state check for terminal output
up_to_date := true

if (checkUpdates()) {
up_to_date = false

fmt.Println()
fmt.Println("Files to be updated:")
fmt.Println("\t./bin/htmc")
fmt.Println("\t./bin/libhtmc.a")
fmt.Println("\t./include/libhtmc/libhtmc.h")
fmt.Println("\t", getHtmcExecPath())
fmt.Println("\t", LIBHTMC_BINARY_PATH)
fmt.Println("\t", LIBHTMC_HEADER_PATH)
fmt.Println()
fmt.Print(":: Proceed with the installation? [Y/n]: ")
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
text = strings.Replace(text, "\n", "", -1)

if (len(text) == 0 || text == "Y") {
download(true, "./bin/htmc", "https://alessandro-salerno.github.io/htmc/bin/htmc")
download(true, "./bin/libhtmc.a", "https://alessandro-salerno.github.io/htmc/bin/libhtmc.a")
download(true, "./include/libhtmc/libhtmc.h", "https://alessandro-salerno.github.io/htmc/include/libhtmc/libhtmc.h")
download(true, getHtmcExecPath(), "https://alessandro-salerno.github.io/htmc/bin/htmc")
download(true, LIBHTMC_BINARY_PATH, "https://alessandro-salerno.github.io/htmc/bin/libhtmc.a")
download(true, LIBHTMC_HEADER_PATH, "https://alessandro-salerno.github.io/htmc/include/libhtmc/libhtmc.h")

// Temporary hard code
if exec.Command("chmod", "+x", "./bin/htmc").Run() != nil {
fmt.Println("Error while setting permissions for ./bin/htmc")
if !markFileAsExecutable(getHtmcExecPath()) {
return
}

up_to_date = true
}
}

fmt.Println()
fmt.Println("All up to date")
if up_to_date {
fmt.Println()
fmt.Println("All up to date")
}

fmt.Println()
fmt.Println("Listening on localhost:80")
fmt.Println()

Expand Down
104 changes: 104 additions & 0 deletions cgi-ws/update-install.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// MIT License
//
// Copyright (c) 2024 Alessandro Salerno
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

package main

import (
"fmt"
"net/http"
"os"
"os/exec"
"io"
)

func checkUpdates() bool {
fmt.Println("Checking for updates...")

output_bytes, err := exec.Command("./bin/htmc", "--version").Output();
if err != nil {
fmt.Println("Error while checking for updates");
return false;
}

cur_v := string(output_bytes)

resp, err := http.Get("https://raw.githubusercontent.com/Alessandro-Salerno/htmc/refs/heads/latest-linux-bundle/.htmc-version")
if err != nil {
fmt.Println("Error while requesting new version string")
return false
}
defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {
fmt.Println("Error while requesting new version string")
return false
}

body_bytes, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error while reading server response")
return false
}

new_v := string(body_bytes)

fmt.Print("Installed: ", cur_v)
fmt.Print("Latest: ", new_v)

return cur_v != new_v
}

func download(force bool, filepath string, url string) {
if (exists(filepath) && !force) {
fmt.Println("Ignoring downlaod of <", url, "> because ", filepath, " already exists");
return
}

fmt.Print("Downloading <", url, "> to ", filepath, " ... ")

out, err := os.Create(filepath)
if err != nil {
fmt.Println("IO Error")
return
}
defer out.Close()

resp, err := http.Get(url)
if err != nil {
fmt.Println("Request Error")
return
}
defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {
fmt.Println("Request Status Error")
return
}

_, err = io.Copy(out, resp.Body)
if err != nil {
fmt.Println("IO Error")
return
}
fmt.Println("Done!")
}

72 changes: 72 additions & 0 deletions cgi-ws/util.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// MIT License
//
// Copyright (c) 2024 Alessandro Salerno
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

package main

import (
"runtime"
"fmt"
"os"
"os/exec"
)

const (
BIN_DIRECTORY_PATH = "./bin/"
TMP_DIRECTORY_PATH = "./tmp/"
INCLUDE_DIRECTORY_PATH = "./include/libhtmc/"
DOCUMENT_ROOT_PATH = "./"
INDEX_HT_FILE = DOCUMENT_ROOT_PATH + "index.htmc"
HTMC_EXEC_BASE_PATH = BIN_DIRECTORY_PATH + "htmc"
LIBHTMC_BINARY_PATH = BIN_DIRECTORY_PATH + "libhtmc.a"
LIBHTMC_HEADER_PATH = INCLUDE_DIRECTORY_PATH + "libhtmc.h"
)

func getHtmcExecPath() string {
if runtime.GOOS == "windows" {
return HTMC_EXEC_BASE_PATH + ".exe"
}

return HTMC_EXEC_BASE_PATH
}

func createDirectory(directory string) bool {
if !exists(directory) {
err := os.MkdirAll(directory, 0755)
if err != nil {
fmt.Println("Unable to create ", directory, " directory")
return false
}
}

return true
}

func markFileAsExecutable(filepath string) bool {
if runtime.GOOS == "linux" {
if exec.Command("chmod", "+x", filepath).Run() != nil {
fmt.Println("Error while setting permissions for ./bin/htmc")
return false
}
}

return true
}

0 comments on commit f3f5fc6

Please sign in to comment.