mirror of
https://github.com/arnaucube/padArchiver.git
synced 2026-02-07 03:36:49 +01:00
implemented webServer, and implemented listPadsImporter
This commit is contained in:
45
README.md
45
README.md
@@ -1,9 +1,44 @@
|
|||||||
# padArchiver
|
# padArchiver
|
||||||
Tool to store a pad (from the link) into IPFS and Git.
|
Tool to store a pad (from the link) into IPFS and Git.
|
||||||
|
|
||||||
|
## webServer
|
||||||
|
This is a webserver that automatically generates a web from the pads directories and files stored.
|
||||||
|
To run:
|
||||||
|
```
|
||||||
|
./webServer
|
||||||
|
```
|
||||||
|
|
||||||
|
## listPadsImporter
|
||||||
|
This is to import all pads from the json file 'list.json'.
|
||||||
|
Just need to edit the json file, for example:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"repoid": "repo01",
|
||||||
|
"pads": [
|
||||||
|
{
|
||||||
|
"link": "http://board.net/p/pad1",
|
||||||
|
"dir": "Group1",
|
||||||
|
"title": "Pad1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"link": "http://board.net/p/pad2",
|
||||||
|
"dir": "Group1",
|
||||||
|
"title": "Pad2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"link": "http://board.net/p/pad3",
|
||||||
|
"dir": "Group2",
|
||||||
|
"title": "Pad3"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
And then execute the importer:
|
||||||
|
```
|
||||||
|
./importFromList
|
||||||
|
```
|
||||||
|
|
||||||
## padArchiver-APIserver
|
## apiServer
|
||||||
This is an API to run in localhost.
|
This is an API to run in localhost.
|
||||||
|
|
||||||
#### Run
|
#### Run
|
||||||
@@ -28,7 +63,7 @@ To run using the compiled binary:
|
|||||||
|
|
||||||
#### API Routes
|
#### API Routes
|
||||||
|
|
||||||
###### - GET /repos
|
##### - GET /repos
|
||||||
this returns:
|
this returns:
|
||||||
```
|
```
|
||||||
[
|
[
|
||||||
@@ -38,7 +73,7 @@ this returns:
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
###### - GET /repos/{repoid}
|
##### - GET /repos/{repoid}
|
||||||
this returns:
|
this returns:
|
||||||
```
|
```
|
||||||
[
|
[
|
||||||
@@ -53,7 +88,7 @@ this returns:
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
###### - POST /repos/{repoid}/pad
|
##### - POST /repos/{repoid}/pad
|
||||||
data to send:
|
data to send:
|
||||||
```
|
```
|
||||||
json: {
|
json: {
|
||||||
@@ -73,7 +108,7 @@ this returns:
|
|||||||
```
|
```
|
||||||
The IPFS hash is also added to the first line of the document, before adding the document to Git.
|
The IPFS hash is also added to the first line of the document, before adding the document to Git.
|
||||||
|
|
||||||
## padArchiver-cli
|
## cli
|
||||||
To run the CLI, just need to run:
|
To run the CLI, just need to run:
|
||||||
```
|
```
|
||||||
./padArchiver-cli
|
./padArchiver-cli
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
9
listPadsImporter/error.go
Normal file
9
listPadsImporter/error.go
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "github.com/fatih/color"
|
||||||
|
|
||||||
|
func check(err error) {
|
||||||
|
if err != nil {
|
||||||
|
color.Red(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
20
listPadsImporter/list.json
Normal file
20
listPadsImporter/list.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"repoid": "repo01",
|
||||||
|
"pads": [
|
||||||
|
{
|
||||||
|
"link": "http://board.net/p/pad1",
|
||||||
|
"dir": "Group1",
|
||||||
|
"title": "Pad1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"link": "http://board.net/p/pad2",
|
||||||
|
"dir": "Group1",
|
||||||
|
"title": "Pad2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"link": "http://board.net/p/pad3",
|
||||||
|
"dir": "Group2",
|
||||||
|
"title": "Pad3"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
listPadsImporter/listPadsImporter
Executable file
BIN
listPadsImporter/listPadsImporter
Executable file
Binary file not shown.
66
listPadsImporter/main.go
Normal file
66
listPadsImporter/main.go
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
|
||||||
|
padArchiver ".."
|
||||||
|
"github.com/fatih/color"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PadModel struct {
|
||||||
|
Link string `json:"link"`
|
||||||
|
Dir string `json:"dir"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
}
|
||||||
|
type ListModel struct {
|
||||||
|
RepoID string `json:"repoid"`
|
||||||
|
Pads []PadModel `json:"pads"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func readList(path string) ListModel {
|
||||||
|
file, err := ioutil.ReadFile(path)
|
||||||
|
check(err)
|
||||||
|
content := string(file)
|
||||||
|
var list ListModel
|
||||||
|
json.Unmarshal([]byte(content), &list)
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
asciiart := `
|
||||||
|
.
|
||||||
|
. _ _ _
|
||||||
|
. | | /\ | | (_)
|
||||||
|
_ __ __ _ __| | / \ _ __ ___| |__ ___ _____ _ __
|
||||||
|
| '_ \ / _ |/ _ | / /\ \ | '__/ __| '_ \| \ \ / / _ \ '__|
|
||||||
|
| |_) | (_| | (_| |/ ____ \| | | (__| | | | |\ V / __/ |
|
||||||
|
| .__/ \__,_|\__,_/_/ \_\_| \___|_| |_|_| \_/ \___|_| - listPadsImporter
|
||||||
|
| |
|
||||||
|
|_|
|
||||||
|
|
||||||
|
`
|
||||||
|
color.Blue(asciiart)
|
||||||
|
fmt.Println(" v0.0.1")
|
||||||
|
color.Blue("https://github.com/arnaucode/padArchiver")
|
||||||
|
fmt.Println("")
|
||||||
|
fmt.Println("")
|
||||||
|
fmt.Println("")
|
||||||
|
|
||||||
|
list := readList("list.json")
|
||||||
|
|
||||||
|
//open the repo
|
||||||
|
repo := padArchiver.OpenRepo(list.RepoID)
|
||||||
|
fmt.Println("repo opened")
|
||||||
|
for _, pad := range list.Pads {
|
||||||
|
fmt.Println("importing pad:")
|
||||||
|
fmt.Println(" link: " + pad.Link)
|
||||||
|
fmt.Println(" dir: " + pad.Dir)
|
||||||
|
fmt.Println(" title: " + pad.Title)
|
||||||
|
ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title)
|
||||||
|
check(err)
|
||||||
|
fmt.Println(" ipfs hash: " + ipfsHash)
|
||||||
|
}
|
||||||
|
color.Green("listPadsImporter finished")
|
||||||
|
}
|
||||||
9
webServer/error.go
Normal file
9
webServer/error.go
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "github.com/fatih/color"
|
||||||
|
|
||||||
|
func check(err error) {
|
||||||
|
if err != nil {
|
||||||
|
color.Red(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
23
webServer/files.go
Normal file
23
webServer/files.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
|
||||||
|
"github.com/fatih/color"
|
||||||
|
blackfriday "gopkg.in/russross/blackfriday.v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func readFile(path string) string {
|
||||||
|
dat, err := ioutil.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
color.Red(path)
|
||||||
|
}
|
||||||
|
check(err)
|
||||||
|
return string(dat)
|
||||||
|
}
|
||||||
|
|
||||||
|
func fileToHTML(path string) (string, error) {
|
||||||
|
mdcontent := readFile(path)
|
||||||
|
htmlcontent := string(blackfriday.Run([]byte(mdcontent)))
|
||||||
|
return htmlcontent, nil
|
||||||
|
}
|
||||||
88
webServer/main.go
Normal file
88
webServer/main.go
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"html/template"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
padArchiver ".."
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ItemModel struct {
|
||||||
|
Name string
|
||||||
|
Path string
|
||||||
|
IsDir bool
|
||||||
|
Content template.HTML
|
||||||
|
}
|
||||||
|
type MenuModel struct {
|
||||||
|
PageTitle string
|
||||||
|
Items []ItemModel
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
router := mux.NewRouter()
|
||||||
|
router.HandleFunc("/", getDir).Methods("GET")
|
||||||
|
router.HandleFunc("/dir/{path}", getDir).Methods("GET")
|
||||||
|
router.HandleFunc("/page/{path}", getPage).Methods("GET")
|
||||||
|
|
||||||
|
log.Println("padArchiver web server running")
|
||||||
|
log.Print("port: 8080")
|
||||||
|
log.Fatal(http.ListenAndServe(":8080", router))
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateMenu(dirpath string) MenuModel {
|
||||||
|
var menuPage MenuModel
|
||||||
|
menuPage.PageTitle = "padArchiver - Menu"
|
||||||
|
_ = filepath.Walk(padArchiver.Storage+dirpath, func(path string, f os.FileInfo, err error) error {
|
||||||
|
if path != padArchiver.Storage {
|
||||||
|
path = strings.Replace(path, padArchiver.Storage, "", -1)
|
||||||
|
var item ItemModel
|
||||||
|
item.Name = path
|
||||||
|
path = strings.Replace(path, "/", "%", -1)
|
||||||
|
if f.IsDir() {
|
||||||
|
item.Path = "/dir/" + path
|
||||||
|
} else {
|
||||||
|
item.Path = "/page/" + path
|
||||||
|
}
|
||||||
|
item.IsDir = f.IsDir()
|
||||||
|
menuPage.Items = append(menuPage.Items, item)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return menuPage
|
||||||
|
}
|
||||||
|
func getDir(w http.ResponseWriter, r *http.Request) {
|
||||||
|
vars := mux.Vars(r)
|
||||||
|
var dirpath string
|
||||||
|
if _, ok := vars["path"]; ok {
|
||||||
|
dirpath = vars["path"]
|
||||||
|
dirpath = strings.Replace(dirpath, "%", "/", -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
menuPage := generateMenu(dirpath)
|
||||||
|
|
||||||
|
tmpl := template.Must(template.ParseFiles("templates/menuTemplate.html"))
|
||||||
|
tmpl.Execute(w, menuPage)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getPage(w http.ResponseWriter, r *http.Request) {
|
||||||
|
vars := mux.Vars(r)
|
||||||
|
path := vars["path"]
|
||||||
|
path = strings.Replace(path, "%", "/", -1)
|
||||||
|
path = padArchiver.Storage + path
|
||||||
|
|
||||||
|
content, err := fileToHTML(path)
|
||||||
|
check(err)
|
||||||
|
|
||||||
|
var item ItemModel
|
||||||
|
item.Name = path
|
||||||
|
item.Content = template.HTML(content)
|
||||||
|
|
||||||
|
tmpl := template.Must(template.ParseFiles("templates/pageTemplate.html"))
|
||||||
|
tmpl.Execute(w, item)
|
||||||
|
}
|
||||||
91
webServer/templates/menuTemplate.html
Normal file
91
webServer/templates/menuTemplate.html
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<!-- Required meta tags -->
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
|
||||||
|
<!-- Bootstrap CSS -->
|
||||||
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
footer {
|
||||||
|
width:100%;
|
||||||
|
background: #38414f;
|
||||||
|
color: #bec0c4;
|
||||||
|
margin-top: 80px;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<title>padArchiver</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
|
<a class="navbar-brand" href="/">padArchiver</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||||
|
<ul class="navbar-nav mr-auto">
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-2"></div>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
<h3>{{.PageTitle}}</h3>
|
||||||
|
<ul class="list-group">
|
||||||
|
{{range .Items}}
|
||||||
|
{{if .IsDir}}
|
||||||
|
<br><br>
|
||||||
|
<nav aria-label="breadcrumb">
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li class="breadcrumb-item active" aria-current="page">
|
||||||
|
<a href="{{.Path}}">{{.Name}}</a>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
{{else}}
|
||||||
|
<a href="{{.Path}}" class="list-group-item">{{.Name}}</a>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<div class="container">
|
||||||
|
<p class="float-right">
|
||||||
|
<a href="#">Back to top</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
padArchiver - webServer
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Github: <a href="https://github.com/arnaucode/padArchiver" target="_blank">https://github.com/arnaucode/padArchiver</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Optional JavaScript -->
|
||||||
|
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||||||
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script>
|
||||||
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
74
webServer/templates/pageTemplate.html
Normal file
74
webServer/templates/pageTemplate.html
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<!-- Required meta tags -->
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
|
||||||
|
<!-- Bootstrap CSS -->
|
||||||
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
footer {
|
||||||
|
width:100%;
|
||||||
|
background: #38414f;
|
||||||
|
color: #bec0c4;
|
||||||
|
margin-top: 80px;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<title>padArchiver</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
|
<a class="navbar-brand" href="/">padArchiver</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||||
|
<ul class="navbar-nav mr-auto">
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-2"></div>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<h3>{{.Name}}</h3>
|
||||||
|
<hr> {{.Content}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer class="text-muted">
|
||||||
|
<div class="container">
|
||||||
|
<p class="float-right">
|
||||||
|
<a href="#">Back to top</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
padArchiver - webServer
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Github: <a href="https://github.com/arnaucode/padArchiver" target="_blank">https://github.com/arnaucode/padArchiver</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Optional JavaScript -->
|
||||||
|
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||||||
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script>
|
||||||
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
BIN
webServer/webServer
Executable file
BIN
webServer/webServer
Executable file
Binary file not shown.
Reference in New Issue
Block a user