Skip to content

Commit

Permalink
Updates v1.122
Browse files Browse the repository at this point in the history
- Fixed bug in File Manager Share function
- Fixed filename with hash issue
- Fixed Chinese filename decode issue
- Fixed root escape bug using rename function
- Fixed user list API bug
- Fixed WebApp reload permission denied UX bug
- Added auto web.tar.gz auto unzip feature for those who dont't know how to properly unzip .tar.gz file on Windows
- Added Network Usage diagram for Windows and Linux
- Added owner can always access their shared file logic
  • Loading branch information
tobychui committed May 14, 2022
1 parent a7fb123 commit 4c6d976
Show file tree
Hide file tree
Showing 15 changed files with 559 additions and 28 deletions.
10 changes: 5 additions & 5 deletions src/file_system.go
Original file line number Diff line number Diff line change
Expand Up @@ -1003,8 +1003,8 @@ func system_fs_restoreFile(w http.ResponseWriter, r *http.Request) {
}

//OK to proceed.
targetPath := filepath.ToSlash(filepath.Dir(filepath.Dir(realpath))) + "/" + strings.TrimSuffix(filepath.Base(realpath), filepath.Ext(filepath.Base(realpath)))
//log.Println(targetPath);
targetPath := filepath.ToSlash(filepath.Join(filepath.Dir(filepath.Dir(realpath)), strings.TrimSuffix(filepath.Base(realpath), filepath.Ext(filepath.Base(realpath)))))
//log.Println(targetPath)
os.Rename(realpath, targetPath)

//Check if the parent dir has no more fileds. If yes, remove it
Expand Down Expand Up @@ -1626,15 +1626,15 @@ func system_fs_handleOpr(w http.ResponseWriter, r *http.Request) {
return
}

thisFilename := newFilenames[i]
thisFilename := filepath.Base(newFilenames[i])
//Check if the name already exists. If yes, return false
if fileExists(filepath.Dir(rsrcFile) + "/" + thisFilename) {
if fileExists(filepath.Join(filepath.Dir(rsrcFile), thisFilename)) {
sendErrorResponse(w, "File already exists")
return
}

//Everything is ok. Rename the file.
targetNewName := filepath.Dir(rsrcFile) + "/" + thisFilename
targetNewName := filepath.Join(filepath.Dir(rsrcFile), thisFilename)
err = os.Rename(rsrcFile, targetNewName)
if err != nil {
sendErrorResponse(w, err.Error())
Expand Down
2 changes: 1 addition & 1 deletion src/main.flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ var subserviceBasePort = 12810 //Next subservice port

// =========== SYSTEM BUILD INFORMATION ==============
var build_version = "development" //System build flag, this can be either {development / production / stable}
var internal_version = "0.1.121" //Internal build version, [fork_id].[major_release_no].[minor_release_no]
var internal_version = "0.1.122" //Internal build version, [fork_id].[major_release_no].[minor_release_no]
var deviceUUID string //The device uuid of this host
var deviceVendor = "IMUSLAB.INC" //Vendor of the system
var deviceVendorURL = "http://imuslab.com" //Vendor contact information
Expand Down
2 changes: 1 addition & 1 deletion src/mediaServer.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ func media_server_validateSourceFile(w http.ResponseWriter, r *http.Request) (st
}

targetfile, _ := mv(r, "file", false)
targetfile, _ = url.QueryUnescape(targetfile)
targetfile, err = url.QueryUnescape(targetfile)
if targetfile == "" {
return "", errors.New("Missing paramter 'file'")
}
Expand Down
68 changes: 68 additions & 0 deletions src/mod/filesystem/fileOpr.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ package filesystem
*/

import (
"archive/tar"
"archive/zip"
"compress/flate"
"compress/gzip"
"errors"
"fmt"
"io"
Expand Down Expand Up @@ -751,3 +753,69 @@ func IsDir(path string) bool {
}
return false
}

//Unzip tar.gz file
func ExtractTarGzipFile(filename string, outfile string) error {
f, err := os.Open(filename)
if err != nil {
return err
}

err = ExtractTarGzipByStream(filepath.Clean(outfile), f, true)
if err != nil {
return err
}

return f.Close()
}
func ExtractTarGzipByStream(basedir string, gzipStream io.Reader, onErrorResumeNext bool) error {
uncompressedStream, err := gzip.NewReader(gzipStream)
if err != nil {
return err
}

tarReader := tar.NewReader(uncompressedStream)

for {
header, err := tarReader.Next()

if err == io.EOF {
break
}

if err != nil {
return err
}

switch header.Typeflag {
case tar.TypeDir:
err := os.Mkdir(header.Name, 0755)
if err != nil {
if !onErrorResumeNext {
return err
}

}
case tar.TypeReg:
outFile, err := os.Create(filepath.Join(basedir, header.Name))
if err != nil {
if !onErrorResumeNext {
return err
}
}
_, err = io.Copy(outFile, tarReader)
if err != nil {
if !onErrorResumeNext {
return err
}
}
outFile.Close()

default:
//Unknown filetype, continue

}

}
return nil
}
3 changes: 3 additions & 0 deletions src/mod/network/mdns/mdns.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,14 @@ func NewMDNS(config NetworkHost) (*MDNSHost, error) {
macAddressBoardcast := ""
if err == nil {
macAddressBoardcast = strings.Join(macAddress, ",")
} else {
log.Println("[mDNS] Unable to get MAC Address: ", err.Error())
}

//Register the mds services
server, err := zeroconf.Register(config.HostName, "_http._tcp", "local.", config.Port, []string{"version_build=" + config.BuildVersion, "version_minor=" + config.MinorVersion, "vendor=" + config.Vendor, "model=" + config.Model, "uuid=" + config.UUID, "domain=" + config.Domain, "mac_addr=" + macAddressBoardcast}, nil)
if err != nil {
log.Println("[mDNS] Error when registering zeroconf broadcast message", err.Error())
return &MDNSHost{}, err
}

Expand Down
2 changes: 1 addition & 1 deletion src/mod/network/neighbour/neighbour.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func (d *Discoverer) StartScanning(interval int, scanDuration int) {
//Update the Discoverer settings
d.d = done
d.t = ticker

log.Println("ArozOS Neighbour Scanning Completed, ", len(d.NearbyHosts), " neighbours found!")
}

func (d *Discoverer) UpdateScan(scanDuration int) {
Expand Down
147 changes: 147 additions & 0 deletions src/mod/network/netstat/netstat.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
package netstat

import (
"encoding/json"
"errors"
"io/ioutil"
"net/http"
"os/exec"
"path/filepath"
"runtime"
"strconv"
"strings"

"imuslab.com/arozos/mod/common"
)

func HandleGetNetworkInterfaceStats(w http.ResponseWriter, r *http.Request) {
rx, tx, err := GetNetworkInterfaceStats()
if err != nil {
common.SendErrorResponse(w, err.Error())
return
}

currnetNetSpec := struct {
RX int64
TX int64
}{
rx,
tx,
}

js, _ := json.Marshal(currnetNetSpec)
common.SendJSONResponse(w, string(js))
}

//Get network interface stats, return accumulated rx bits, tx bits and error if any
func GetNetworkInterfaceStats() (int64, int64, error) {
if runtime.GOOS == "windows" {
cmd := exec.Command("wmic", "path", "Win32_PerfRawData_Tcpip_NetworkInterface", "Get", "BytesReceivedPersec,BytesSentPersec,BytesTotalPersec")
out, err := cmd.Output()
if err != nil {
return 0, 0, err
}

//Filter out the first line

lines := strings.Split(strings.ReplaceAll(string(out), "\r\n", "\n"), "\n")
if len(lines) >= 2 && len(lines[1]) >= 0 {
dataLine := lines[1]
for strings.Contains(dataLine, " ") {
dataLine = strings.ReplaceAll(dataLine, " ", " ")
}
dataLine = strings.TrimSpace(dataLine)
info := strings.Split(dataLine, " ")
if len(info) < 3 {
return 0, 0, errors.New("Invalid wmic results")
}
rxString := info[0]
txString := info[1]

rx := int64(0)
tx := int64(0)
if s, err := strconv.ParseInt(rxString, 10, 64); err == nil {
rx = s
}

if s, err := strconv.ParseInt(txString, 10, 64); err == nil {
tx = s
}

//log.Println(rx, tx)
return rx * 4, tx * 4, nil
} else {
//Invalid data
return 0, 0, errors.New("Invalid wmic results")
}

} else if runtime.GOOS == "linux" {
allIfaceRxByteFiles, err := filepath.Glob("/sys/class/net/*/statistics/rx_bytes")
if err != nil {
//Permission denied
return 0, 0, errors.New("Access denied")
}

if len(allIfaceRxByteFiles) == 0 {
return 0, 0, errors.New("No valid iface found")
}

rxSum := int64(0)
txSum := int64(0)
for _, rxByteFile := range allIfaceRxByteFiles {
rxBytes, err := ioutil.ReadFile(rxByteFile)
if err == nil {
rxBytesInt, err := strconv.Atoi(strings.TrimSpace(string(rxBytes)))
if err == nil {
rxSum += int64(rxBytesInt)
}
}

//Usually the tx_bytes file is nearby it. Read it as well
txByteFile := filepath.Join(filepath.Dir(rxByteFile), "tx_bytes")
txBytes, err := ioutil.ReadFile(txByteFile)
if err == nil {
txBytesInt, err := strconv.Atoi(strings.TrimSpace(string(txBytes)))
if err == nil {
txSum += int64(txBytesInt)
}
}

}

//Return value as bits
return rxSum * 8, txSum * 8, nil

} else if runtime.GOOS == "darwin" {
cmd := exec.Command("netstat", "-ib") //get data from netstat -ib
out, err := cmd.Output()
if err != nil {
return 0, 0, err
}

outStrs := string(out) //byte array to multi-line string
for _, outStr := range strings.Split(strings.TrimSuffix(outStrs, "\n"), "\n") { //foreach multi-line string
if strings.HasPrefix(outStr, "en") { //search for ethernet interface
if strings.Contains(outStr, "<Link#") { //search for the link with <Link#?>
outStrSplit := strings.Fields(outStr) //split by white-space

rxSum, errRX := strconv.Atoi(outStrSplit[6]) //received bytes sum
if errRX != nil {
return 0, 0, errRX
}

txSum, errTX := strconv.Atoi(outStrSplit[9]) //transmitted bytes sum
if errTX != nil {
return 0, 0, errTX
}

return int64(rxSum) * 8, int64(txSum) * 8, nil
}
}
}

return 0, 0, nil //no ethernet adapters with en*/<Link#*>
}

return 0, 0, errors.New("Platform not supported")
}
71 changes: 71 additions & 0 deletions src/mod/notification/notification.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package main

import "container/list"

/*
Notification Producer and Consumer Queue
This module is designed to route the notification from module that produce it
to all the devices or agent that can reach the user
*/

type NotificationPayload struct {
ID string //Notification ID, generate by producer
Title string //Title of the notification
Message string //Message of the notification
Receiver []string //Receiver, username in arozos system
Sender string //Sender, the sender or module of the notification
ActionURL string //URL for futher action or open related pages (as url), leave empty if not appliable
IsUrgent bool //Label this notification as urgent
}

//Notification Consumer, object that use to consume notification from queue
type Consumer struct {
Name string
Desc string

ListenTopicMode int
Notify func(*NotificationPayload) error
ListeningQueue *NotificationQueue
}

//Notification Producer, object that use to create and push notification into the queue
type Producer struct {
Name string
Desc string

PushTopicType int
TargetQueue *NotificationQueue
}

type NotificationQueue struct {
Producers []*Producer
Consumers []*Consumer

MasterQueue *list.List
}

func NewNotificationQueue() *NotificationQueue {
thisQueue := list.New()

return &NotificationQueue{
Producers: []*Producer{},
Consumers: []*Consumer{},
MasterQueue: thisQueue,
}
}

//Add a notification producer into the master queue
func (n *NotificationQueue) AddNotificationProducer(p *Producer) {
n.Producers = append(n.Producers, p)
}

//Add a notification consumer into the master queue
func (n *NotificationQueue) AddNotificationConsumer(c *Consumer) {
n.Consumers = append(n.Consumers, c)
}

//Push a notifiation to all consumers with same topic type
func (n *NotificationQueue) PushNotification(TopicType int, message *NotificationPayload) {

}
3 changes: 3 additions & 0 deletions src/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

network "imuslab.com/arozos/mod/network"
mdns "imuslab.com/arozos/mod/network/mdns"
"imuslab.com/arozos/mod/network/netstat"
ssdp "imuslab.com/arozos/mod/network/ssdp"
upnp "imuslab.com/arozos/mod/network/upnp"
prout "imuslab.com/arozos/mod/prouter"
Expand Down Expand Up @@ -51,6 +52,8 @@ func NetworkServiceInit() {
})
}

router.HandleFunc("/system/network/getNICUsage", netstat.HandleGetNetworkInterfaceStats)

//Start the services that depends on network interface
StartNetworkServices()

Expand Down
Loading

0 comments on commit 4c6d976

Please sign in to comment.