commit 83ad5524015e155e6250743e01eeed7234ccb5a5 Author: Jeff Carr Date: Fri Jan 12 04:14:09 2024 -0600 initial commit Signed-off-by: Jeff Carr diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6fbd073 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.swp +go.wit.com diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f6626d8 --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +all: + echo "build it!" + go build -v -x + sudo setcap 'cap_net_bind_service=+ep' go.wit.com + ./go.wit.com + # ./myrepos >/tmp/myrepos.stderr 2>&1 + +redomod: + rm -f go.* + GO111MODULE= go mod init + GO111MODULE= go mod tidy + diff --git a/dumpClient.go b/dumpClient.go new file mode 100644 index 0000000..928be49 --- /dev/null +++ b/dumpClient.go @@ -0,0 +1,53 @@ +package main + +import ( +// "fmt" + "log" + "net/http" + "io/ioutil" +) + +func dumpClient(r *http.Request) { + // Basic request information + log.Println("Method:", r.Method) + log.Println("URL:", r.URL) + log.Println("Protocol:", r.Proto) + log.Println("Host:", r.Host) + log.Println("Remote Address:", r.RemoteAddr) + + // Headers + log.Println("Headers:") + for name, values := range r.Header { + for _, value := range values { + log.Println(name, value) + } + } + + // Query parameters + log.Println("Query Parameters:") + for param, values := range r.URL.Query() { + for _, value := range values { + log.Println(param, value) + } + } + + // User-Agent + log.Println("User-Agent:", r.UserAgent()) + + // Content Length + log.Println("Content Length:", r.ContentLength) + + // Cookies + log.Println("Cookies:") + for _, cookie := range r.Cookies() { + log.Println(cookie.Name, cookie.Value) + } + + // Request Body (if applicable) + if r.Body != nil { + body, err := ioutil.ReadAll(r.Body) + if err == nil { + log.Println("Body:", string(body)) + } + } +} diff --git a/files/index.html b/files/index.html new file mode 100644 index 0000000..85aa2a1 --- /dev/null +++ b/files/index.html @@ -0,0 +1,200 @@ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Packagego getAuthoritative sources (IPv6 only)github mirrorDocumentation
log/ (needed for the gui)
log go.wit.com/log git.wit.org/wit/log github.com/wit-go/log Go Reference
gui/ packages
gui/gui go.wit.com/gui/gui git.wit.org/gui/gui github.com/wit-go/gui Go Reference
gui/widget go.wit.com/gui/widget git.wit.org/gui/widget github.com/wit-go/widget Go Reference
gui/gadgets go.wit.com/gui/gadgets git.wit.org/gui/gadgets github.com/wit-go/gadgets Go Reference
gui/toolkits go.wit.com/gui/toolkits git.wit.org/gui/toolkits github.com/wit-go/toolkits Go Reference
gui/debugger go.wit.com/gui/debugger git.wit.org/gui/debugger github.com/wit-go/debugger Go Reference
gui/examples go.wit.com/gui/examples git.wit.org/gui/examples github.com/wit-go/examples
gui/digitalocean go.wit.com/gui/digitalocean git.wit.org/gui/digitalocean Go Reference
gui/cloudflare go.wit.com/gui/cloudflare git.wit.org/gui/cloudflare Go Reference
Applications
control-panel-dns go.wit.com/apps/control-panel-dns git.wit.org/jcarr/control-panel-dns Go Reference
control-panel-digitalocean go.wit.com/apps/control-panel-digitalocean git.wit.org/wit/control-panel-digitalocean Go Reference
control-panel-cloudflare go.wit.com/apps/control-panel-cloudflare git.wit.org/wit/control-panel-cloudflare Go Reference
Support packages
arg go.wit.com/arg git.wit.org/wit/arg github.com/wit-go/go-arg Go Reference
spew go.wit.com/spew git.wit.org/wit/spew github.com/wit-go/spew Go Reference
dnssec go.wit.com/dnssec git.wit.org/wit/dnssec github.com/wit-go/dnssec Go Reference
shell go.wit.com/shell git.wit.org/wit/shell github.com/wit-go/shell Go Reference
+
+
+ + + + diff --git a/files/repo.html b/files/repo.html new file mode 100644 index 0000000..c9b9f10 --- /dev/null +++ b/files/repo.html @@ -0,0 +1,11 @@ + + + + + + + + + Nothing to see here. Please move along. + + diff --git a/files/skeleton.v2.css b/files/skeleton.v2.css new file mode 100644 index 0000000..e70350b --- /dev/null +++ b/files/skeleton.v2.css @@ -0,0 +1,418 @@ +/* +* Skeleton V2.0.4 +* Copyright 2014, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 12/29/2014 +*/ + + +/* Table of contents +################################################## +- Grid +- Base Styles +- Typography +- Links +- Buttons +- Forms +- Lists +- Code +- Tables +- Spacing +- Utilities +- Clearing +- Media Queries +*/ + + +/* Grid +################################################## */ +.container { + position: relative; + width: 100%; + max-width: 1600px; + margin: 0 auto; + padding: 0 20px; + box-sizing: border-box; } +.column, +.columns { + width: 100%; + float: left; + box-sizing: border-box; } + +/* For devices larger than 400px */ +@media (min-width: 400px) { + .container { + width: 85%; + padding: 0; } +} + +/* For devices larger than 550px */ +@media (min-width: 550px) { + .container { + width: 80%; } + .column, + .columns { + margin-left: 4%; } + .column:first-child, + .columns:first-child { + margin-left: 0; } + + .one.column, + .one.columns { width: 4.66666666667%; } + .two.columns { width: 13.3333333333%; } + .three.columns { width: 22%; } + .four.columns { width: 30.6666666667%; } + .five.columns { width: 39.3333333333%; } + .six.columns { width: 48%; } + .seven.columns { width: 56.6666666667%; } + .eight.columns { width: 65.3333333333%; } + .nine.columns { width: 74.0%; } + .ten.columns { width: 82.6666666667%; } + .eleven.columns { width: 91.3333333333%; } + .twelve.columns { width: 100%; margin-left: 0; } + + .one-third.column { width: 30.6666666667%; } + .two-thirds.column { width: 65.3333333333%; } + + .one-half.column { width: 48%; } + + /* Offsets */ + .offset-by-one.column, + .offset-by-one.columns { margin-left: 8.66666666667%; } + .offset-by-two.column, + .offset-by-two.columns { margin-left: 17.3333333333%; } + .offset-by-three.column, + .offset-by-three.columns { margin-left: 26%; } + .offset-by-four.column, + .offset-by-four.columns { margin-left: 34.6666666667%; } + .offset-by-five.column, + .offset-by-five.columns { margin-left: 43.3333333333%; } + .offset-by-six.column, + .offset-by-six.columns { margin-left: 52%; } + .offset-by-seven.column, + .offset-by-seven.columns { margin-left: 60.6666666667%; } + .offset-by-eight.column, + .offset-by-eight.columns { margin-left: 69.3333333333%; } + .offset-by-nine.column, + .offset-by-nine.columns { margin-left: 78.0%; } + .offset-by-ten.column, + .offset-by-ten.columns { margin-left: 86.6666666667%; } + .offset-by-eleven.column, + .offset-by-eleven.columns { margin-left: 95.3333333333%; } + + .offset-by-one-third.column, + .offset-by-one-third.columns { margin-left: 34.6666666667%; } + .offset-by-two-thirds.column, + .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } + + .offset-by-one-half.column, + .offset-by-one-half.columns { margin-left: 52%; } + +} + + +/* Base Styles +################################################## */ +/* NOTE +html is set to 62.5% so that all the REM measurements throughout Skeleton +are based on 10px sizing. So basically 1.5rem = 15px :) */ +html { + font-size: 62.5%; } +body { + font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ + line-height: 1.6; + font-weight: 400; + font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #222; } + + +/* Typography +################################################## */ +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 2rem; + font-weight: 300; } +h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} +h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } +h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } +h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } +h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } +h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } + +/* Larger than phablet */ +@media (min-width: 550px) { + h1 { font-size: 5.0rem; } + h2 { font-size: 4.2rem; } + h3 { font-size: 3.6rem; } + h4 { font-size: 3.0rem; } + h5 { font-size: 2.4rem; } + h6 { font-size: 1.5rem; } +} + +p { + margin-top: 0; } + + +/* Links +################################################## */ +a { + color: #1EAEDB; } +a:hover { + color: #0FA0CE; } + + +/* Buttons +################################################## */ +.button, +button, +input[type="submit"], +input[type="reset"], +input[type="button"] { + display: inline-block; + height: 38px; + padding: 0 30px; + color: #555; + text-align: center; + font-size: 11px; + font-weight: 600; + line-height: 38px; + letter-spacing: .1rem; + text-transform: uppercase; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border-radius: 4px; + border: 1px solid #bbb; + cursor: pointer; + box-sizing: border-box; } +.button:hover, +button:hover, +input[type="submit"]:hover, +input[type="reset"]:hover, +input[type="button"]:hover, +.button:focus, +button:focus, +input[type="submit"]:focus, +input[type="reset"]:focus, +input[type="button"]:focus { + color: #333; + border-color: #888; + outline: 0; } +.button.button-primary, +button.button-primary, +input[type="submit"].button-primary, +input[type="reset"].button-primary, +input[type="button"].button-primary { + color: #FFF; + background-color: #33C3F0; + border-color: #33C3F0; } +.button.button-primary:hover, +button.button-primary:hover, +input[type="submit"].button-primary:hover, +input[type="reset"].button-primary:hover, +input[type="button"].button-primary:hover, +.button.button-primary:focus, +button.button-primary:focus, +input[type="submit"].button-primary:focus, +input[type="reset"].button-primary:focus, +input[type="button"].button-primary:focus { + color: #FFF; + background-color: #1EAEDB; + border-color: #1EAEDB; } + + +/* Forms +################################################## */ +input[type="email"], +input[type="number"], +input[type="search"], +input[type="text"], +input[type="tel"], +input[type="url"], +input[type="password"], +textarea, +select { + height: 38px; + padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ + background-color: #fff; + border: 1px solid #D1D1D1; + border-radius: 4px; + box-shadow: none; + box-sizing: border-box; } +/* Removes awkward default styles on some inputs for iOS */ +input[type="email"], +input[type="number"], +input[type="search"], +input[type="text"], +input[type="tel"], +input[type="url"], +input[type="password"], +textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } +textarea { + min-height: 65px; + padding-top: 6px; + padding-bottom: 6px; } +input[type="email"]:focus, +input[type="number"]:focus, +input[type="search"]:focus, +input[type="text"]:focus, +input[type="tel"]:focus, +input[type="url"]:focus, +input[type="password"]:focus, +textarea:focus, +select:focus { + border: 1px solid #33C3F0; + outline: 0; } +label, +legend { + display: block; + margin-bottom: .5rem; + font-weight: 600; } +fieldset { + padding: 0; + border-width: 0; } +input[type="checkbox"], +input[type="radio"] { + display: inline; } +label > .label-body { + display: inline-block; + margin-left: .5rem; + font-weight: normal; } + + +/* Lists +################################################## */ +ul { + list-style: circle inside; } +ol { + list-style: decimal inside; } +ol, ul { + padding-left: 0; + margin-top: 0; } +ul ul, +ul ol, +ol ol, +ol ul { + margin: 1.5rem 0 1.5rem 3rem; + font-size: 90%; } +li { + margin-bottom: 1rem; } + + +/* Code +################################################## */ +code { + padding: .2rem .5rem; + margin: 0 .2rem; + font-size: 90%; + white-space: nowrap; + background: #F1F1F1; + border: 1px solid #E1E1E1; + border-radius: 4px; } +pre > code { + display: block; + padding: 1rem 1.5rem; + white-space: pre; } + + +/* Tables +################################################## */ +th, +td { + padding: 12px 15px; + text-align: left; + border-bottom: 1px solid #E1E1E1; } +th:first-child, +td:first-child { + padding-left: 0; } +th:last-child, +td:last-child { + padding-right: 0; } + + +/* Spacing +################################################## */ +button, +.button { + margin-bottom: 1rem; } +input, +textarea, +select, +fieldset { + margin-bottom: 1.5rem; } +pre, +blockquote, +dl, +figure, +table, +p, +ul, +ol, +form { + margin-bottom: 2.5rem; } + + +/* Utilities +################################################## */ +.u-full-width { + width: 100%; + box-sizing: border-box; } +.u-max-full-width { + max-width: 100%; + box-sizing: border-box; } +.u-pull-right { + float: right; } +.u-pull-left { + float: left; } + + +/* Misc +################################################## */ +hr { + margin-top: 3rem; + margin-bottom: 3.5rem; + border-width: 0; + border-top: 1px solid #E1E1E1; } + + +/* Clearing +################################################## */ + +/* Self Clearing Goodness */ +.container:after, +.row:after, +.u-cf { + content: ""; + display: table; + clear: both; } + + +/* Media Queries +################################################## */ +/* +Note: The best way to structure the use of media queries is to create the queries +near the relevant code. For example, if you wanted to change the styles for buttons +on small devices, paste the mobile query code up in the buttons section and style it +there. +*/ + + +/* Larger than mobile */ +@media (min-width: 400px) {} + +/* Larger than phablet (also point when grid becomes active) */ +@media (min-width: 550px) {} + +/* Larger than tablet */ +@media (min-width: 750px) {} + +/* Larger than desktop */ +@media (min-width: 1600px) {} + +/* Larger than Desktop HD */ +@media (min-width: 1600px) {} diff --git a/https.go b/https.go new file mode 100644 index 0000000..33a1099 --- /dev/null +++ b/https.go @@ -0,0 +1,18 @@ +package main + +import ( + "fmt" + "net/http" +) + +func https() { + http.HandleFunc("/", okHandler) + + certPath := "/etc/letsencrypt/live/yourdomain.com/fullchain.pem" + keyPath := "/etc/letsencrypt/live/yourdomain.com/privkey.pem" + + err := http.ListenAndServeTLS(":443", certPath, keyPath, nil) + if err != nil { + fmt.Println("Error starting HTTPS server:", err) + } +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..50bfae4 --- /dev/null +++ b/main.go @@ -0,0 +1,64 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "embed" +) + +//go:embed files/* +var htmlFiles embed.FS + +func okHandler(w http.ResponseWriter, r *http.Request) { + dumpClient(r) + var tmp string + tmp = r.URL.String() + if tmp == "/test" { + findFile(w) + return + } + if tmp == "/gui" { + doGui(w, "/gui/gui") + return + } + fmt.Fprintln(w, "OK") +} + +func findFile(w http.ResponseWriter) { + fmt.Fprintln(w, "GOT TEST?") + pfile, err := htmlFiles.ReadFile("files/repo.html") + if (err != nil) { + log.Println("ERROR: err") + // w.Write(pfile) + return + } + + var repohtml string + repohtml = string(pfile) + fmt.Fprintln(w, "GOT GUI?", repohtml) + log.Println("repo.html:", repohtml) + // w.Close() + /* + filename = "/tmp/" + name + ".so" + log.Error(err, "write out file here", name, filename, len(pfile)) + f, _ := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0600) + f.Close() + */ +} + +func main() { + /* + pfile, err := htmlFiles.ReadFile("html/repo.html") + if (err != nil) { + log.Println("ERROR:", err) + // w.Write(pfile) + return + } + */ + http.HandleFunc("/", okHandler) + err := http.ListenAndServe(":80", nil) + if err != nil { + log.Println("Error starting server:", err) + } +} diff --git a/repoHTML.go b/repoHTML.go new file mode 100644 index 0000000..f30fcca --- /dev/null +++ b/repoHTML.go @@ -0,0 +1,48 @@ +package main + +import ( + "fmt" + // "log" + "net/http" +) + + +/* + + + + + + + + + Nothing to see here. Please move along. + + +*/ + +func doGui(w http.ResponseWriter, path string) { + fmt.Fprintln(w, "") + fmt.Fprintln(w, "") + fmt.Fprintln(w, "") + // fmt.Fprintln(w, + fmt.Fprintln(w, "") + fmt.Fprintln(w, "") + + fmt.Fprintln(w, "") + fmt.Fprintln(w, "") + fmt.Fprintln(w, "") + fmt.Fprintln(w, "Nothing to see here. Please move along.\"") + fmt.Fprintln(w, "") + fmt.Fprintln(w, "") + + /* + var tmp string + tmp = r.URL.String() + if tmp == "/gui" { + findFile(w) + return + } + fmt.Fprintln(w, "OK") + */ +}