Browse Source

增加对本地文件的扫描

master
453530270@qq.com 2 years ago
parent
commit
d112fc956b
  1. 164
      fss/core/serverinfo.go
  2. 7
      fss/main.go
  3. 19
      fss/www/index.html

164
fss/core/serverinfo.go

@ -0,0 +1,164 @@
package core
import (
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"path/filepath"
"strings"
)
// json 结构体
type Response struct {
Status string `json:"status"` //状态
Data FilesListJson `json:"data"` //目录下的文件
Curdir string `json:"curdir"` // 扫描的目录
WorksDir string `json:"workdir"` //监听目录
}
// 文件输出的结构
type FileJson struct {
Fname string `json:"fname"`
Dirflag bool `json:"dirflag"`
Isbackup int `json:"isbackup"`
Fhash string `json:"hash"` // hash
Fsize string `json:"size"` //文件大小, 输出带单位的大小
}
type FilesListJson struct {
Flist []FileJson `json:"list"`
}
// 获取运行的路径
var Gpath string
// 遍历监视目录,发送到json中
func SerInfo(w http.ResponseWriter, r *http.Request) {
// 监听的目录通过?p=的方式传入
urlpath := r.URL.Query().Get("p")
// 防止逃逸,造成漏洞
if strings.Contains(urlpath, "../") {
urlpath = "."
}
// urlpath 进行base64 解码
dsrpath := base64dec(urlpath)
// 监听的根目录
realFilePath := filepath.Join(Gpath, dsrpath)
// 时间目录的情况
fileInfo, err := os.Stat(realFilePath)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// list json
var flist FilesListJson
//针对目录的情况才输出
// todo 如果是文件的话 暂时不处理
if fileInfo.IsDir() {
// 遍历目录
files, err := os.ReadDir(realFilePath)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 遍历
for _, v := range files {
// fmt.Printf("rang v:%v\n", v)
isbak := 0
// 如果有 backup
if strings.Contains(v.Name(), "backup") {
isbak = 1
}
// 如果是文件的话,就计算hash和大小
if v.IsDir() {
//While entry is A Directory
flist.Flist = append(flist.Flist, FileJson{Fname: v.Name(), Dirflag: v.IsDir(), Isbackup: isbak, Fhash: "", Fsize: ""})
} else {
// 计算文件的hash
funame := filepath.Join(realFilePath, v.Name())
fhash := CalacHash(funame)
// 文件大小
// 获取文件大小(以字节为单位)
sizeInBytes := fileInfo.Size()
sizeStr := fmt.Sprintf("%.2f KB", float64(sizeInBytes)/1024)
// output
flist.Flist = append(flist.Flist, FileJson{Fname: v.Name(), Dirflag: v.IsDir(), Isbackup: isbak, Fhash: fhash, Fsize: sizeStr})
}
}
}
// respone file list
response := Response{
Status: "success",
Curdir: urlpath,
WorksDir: Gpath,
Data: flist,
}
// 开启跨域
uCorsHadler(w, r)
json.NewEncoder(w).Encode(response)
}
// 跨域函数
func uCorsHadler(w http.ResponseWriter, r *http.Request) {
// 设置跨域响应头
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS,PUT,DELETET")
// w.Header().Set("Access-Control-Allow-Headers", "Content-Type,Accept,Accept-Length,Accept-Encoding,X-XSRF-TOKEN,X-XSRF-TOKEN")
w.Header().Set("Access-Control-Allow-Headers", "*")
//
w.Header().Set("Content-Type", "application/json")
// 如果是OPTIONS请求,返回200 OK
if r.Method == "OPTIONS" {
// fmt.Printf("options is now \n")
// w.WriteHeader(http.StatusOK)
return
}
}
// base64 encode
// url safe
func bas64end(str string) string {
// bdata:=
return base64.URLEncoding.EncodeToString([]byte(str))
}
// base64 url safe uneconde
func base64dec(bsstr string) string {
dedc, _ := base64.URLEncoding.DecodeString(bsstr)
return string(dedc)
}
// 计算文件的hash
func CalacHash(rfile string) string {
// 获取到真实地址
//
file, err := os.Open(rfile)
if err != nil {
panic(err)
}
defer file.Close()
// initlize hash object
hash := sha256.New()
// write file into hash object
if _, err := io.Copy(hash, file); err != nil {
panic(err)
}
// get hash value
hashBytes := hash.Sum(nil)
//converto to hash string
hastString := fmt.Sprintf("%x", hashBytes)
return hastString
}

7
fss/main.go

@ -2,6 +2,7 @@ package main
import (
"fmt"
"fss/core"
"log"
"net/http"
)
@ -12,10 +13,12 @@ func main() {
fileServer := http.FileServer(http.Dir("./www"))
// 将 "/" 路径映射到文件服务器
http.Handle("/", fileServer)
//扫描指定的目录
http.HandleFunc("/sc", core.SerInfo)
fmt.Printf("Starting server at port 9090\n")
fmt.Printf("Starting server at port 9099\n")
// 启动HTTP服务器并监听端口 80,如果出现错误,则打印错误信息并退出
if err := http.ListenAndServe(":9090", nil); err != nil {
if err := http.ListenAndServe(":9099", nil); err != nil {
log.Fatal(err)
}
}

19
fss/www/index.html

@ -226,7 +226,7 @@
urlpath = encodeURIComponent(btoa(jsdir));
}
//
var html = "<li class=\"list-group-item\">输入目标服务器" + scip + "</li>";
var html = "<li class=\"list-group-item\">输入服务器" + scip + "</li>";
$("#mbip").text("源站(" + scip + ")");
// 获取信息
gescinfo("#scsc",scip);
@ -241,25 +241,24 @@
// 目标服务器的文件信息
var tgfs = function () {
//
scip = $("input[name='tsip']").val();
tsip = $("input[name='tsip']").val();
// ip storage
sessionStorage.setItem("scip", scip);
sessionStorage.setItem("tscip", tsip);
//监视目录
var jsdir = $("input[name='tsdir']").val();
if (jsdir != '') {
urlpath = encodeURIComponent(btoa(jsdir));
}
//
var html = "<li class=\"list-group-item\">输入目标服务器" + scip + "</li>";
var html = "<li class=\"list-group-item\">输入目标服务器" + tsip + "</li>";
// 目标站
$("#mbip").text("目标站(" + scip + ")");
$("#mbip").text("目标站(" + tsip + ")");
// 获取信息
gescinfo("#tgsc",scip);
gescinfo("#tgsc",tsip);
//
$("#rstatus").append(html);
}
// 获取目标服务器的信息
var gescinfo = function (elemnt,scip) {
// 客户端的状态地址
@ -267,9 +266,11 @@
//
var html = "";
$.getJSON(url, function (res) {
//
// res.curdir
$.each(res.data.list, function (k, v) {
html += "<li class=\"list-group-item optzone\"><div class=\"col-md-10\">";
html+="<input type=\"checkbox\" name=\"sfiles\" value="+v.fname+" />";
if (v.dirflag) {
html += "<span class=\"icon folder-icon\"></span>" + v.fname + "</div>";
} else {
@ -362,7 +363,7 @@
}
//解码base64
var dbsresp = function (bsStr) {
console.log("respone base64 string ",bsStr)
// console.log("respone base64 string ",bsStr)
if(bsStr=="."){
return "."
}else{

Loading…
Cancel
Save