diff --git a/.gitignore b/.gitignore index 8881cfa..18483ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .vscode/ lab/ +bin/* \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..02a8362 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +client: + go build -o bin/client cmd/client/main.go + +server: + go build -o bin/server cmd/server/main.go \ No newline at end of file diff --git a/cmd/client/main.go b/cmd/client/main.go index be04c43..feb34e6 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -1,44 +1,44 @@ -package main +package client import ( "cosync/internal/client" "cosync/internal/server" - "cosync/tests" + + // "cosync/tests" "os" ) -//TODO: handle arguments correctly +// TODO: handle arguments correctly func main() { argc := len(os.Args) if argc < 2 { panic("Not enough arguments (try --help)") } - for i := 1; i < argc; i++ { - switch (os.Args[i]) { - + switch os.Args[i] { + case "-s": server.Run() // break - + case "-c": client.Run() // break case "-p": panic("Not implemented") - + case "--help": panic("Not implemented") - case "--test": - tests.TestAll() - + // case "--test": + // tests.TestAll() + default: panic("Bad argument : \"" + os.Args[i] + "\"") + } } - } -} \ No newline at end of file +} diff --git a/cmd/server/main.go b/cmd/server/main.go index f275077..54e7b99 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -1 +1,38 @@ -package server \ No newline at end of file +package server + +import ( + "cosync/internal/server" + // "cosync/tests" + "os" +) + +// TODO: handle arguments correctly +func main() { + argc := len(os.Args) + if argc < 2 { + panic("Not enough arguments (try --help)") + } + + for i := 1; i < argc; i++ { + + switch os.Args[i] { + + case "-s": + server.Run() + // break + + case "-p": + panic("Not implemented") + + case "--help": + panic("Not implemented") + + // case "--test": + // tests.TestAll() + + default: + panic("Bad argument : \"" + os.Args[i] + "\"") + + } + } +} diff --git a/internal/core/config.go b/internal/core/config.go index 4166fc2..617a99e 100644 --- a/internal/core/config.go +++ b/internal/core/config.go @@ -7,14 +7,11 @@ import ( "github.com/spf13/viper" ) - // Config will follow this model // server : string // port : int - - - +var config_loaded bool = false // Load config file func LoadConfig() error { @@ -43,6 +40,7 @@ func LoadConfig() error { // return err } + config_loaded = true return nil } @@ -57,7 +55,16 @@ func LoadSyncList() error { } // returns all config variables -// ! WARNING: Do not use this function without executing LoadConfig prior func GetConfig() map[string]any { - return viper.AllSettings() + + if config_loaded { + return viper.AllSettings() + } else { + err := LoadConfig() + if err != nil { + panic("GetConfig: Failed to load config file -> " + err.Error()) + } + + return viper.AllSettings() + } } diff --git a/internal/core/models.go b/internal/core/models.go index 3a18d09..e0c4b3f 100644 --- a/internal/core/models.go +++ b/internal/core/models.go @@ -5,10 +5,10 @@ import ( ) type File struct { - ID string - ParentDirectory string - Metadata FileMetadata - State SynchronizationState + ID string + ParentDirectory Folder + Metadata FileMetadata + State SynchronizationState } type FileMetadata struct { @@ -22,4 +22,13 @@ type SynchronizationState struct { Status string // "pending", "in_progress", "completed", "error" Progress float64 LastError error +} + +type Folder struct { + ID string + Files []File + Subfolders []Folder + + Name string + Path string } \ No newline at end of file diff --git a/internal/core/utils.go b/internal/core/utils.go index ebaad97..8162569 100644 --- a/internal/core/utils.go +++ b/internal/core/utils.go @@ -1,8 +1,36 @@ package core +import ( + "crypto/sha256" + "io" + "os" +) -//! Not implemented -func CompareFiles(file1 File, file2 File) bool { - return false +// Panic if e contains an error +func Check(e error) { + if e != nil { + panic("Check: A fatal error occured during execution -> " + e.Error()) + } } +// Returns true if files correspond +func CompareFiles(file1 File, file2 File) bool { + return file1.Metadata.Hash == file2.Metadata.Hash +} + +// Gets the sha256 hash of a file's content +func GetHash(file File) ([]byte, error) { + // init + hasher := sha256.New() + file_path := "" //TODO: missing + // Open file + f, err := os.Open(file_path) + if err != nil { // Path error + return nil, err + } + // Compute hash + io.Copy(hasher, f) + sum := hasher.Sum(nil) + + return sum, nil +} diff --git a/internal/server/server.go b/internal/server/server.go index 7a5be5a..907de84 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -27,7 +27,7 @@ func Run() { serverPort := strconv.Itoa(config["port"].(int)) // Listening - listener, err := net.Listen("tcp", ":" + serverPort) + listener, err := net.Listen("tcp", ":"+serverPort) if err != nil { panic(err) } @@ -65,7 +65,7 @@ func handleConnection(conn net.Conn) { log.Println("Error reading from ", clientAddress, ": ", err) return } - + // to rm println(message) // fmt.Println("Received from client:", message) @@ -76,7 +76,7 @@ func handleConnection(conn net.Conn) { // Send a response to the client _, err = conn.Write([]byte("Server received your message\n")) if err != nil { - log.Println("Error replying to", clientAddress,": ", err) + log.Println("Error replying to", clientAddress, ": ", err) return } } diff --git a/tests/cosync_test.go b/tests/cosync_test.go new file mode 100644 index 0000000..b0b4dcb --- /dev/null +++ b/tests/cosync_test.go @@ -0,0 +1,22 @@ +package tests + +import ( + "testing" + "cosync/internal/client" + "cosync/internal/server" +) + +func TestAll(t *testing.T) { + TestClientServerCommunication(t) +} + +func TestClientServerCommunication(t *testing.T) { + go client.Run() + go server.Run() +} + +func TestConfigLoading(t *testing.T) { +} + +func TestConfigCreation(t *testing.T) { +} \ No newline at end of file diff --git a/tests/tests.go b/tests/tests.go deleted file mode 100644 index df7e5a8..0000000 --- a/tests/tests.go +++ /dev/null @@ -1,26 +0,0 @@ -package tests - -import ( - // "testing" - "cosync/internal/client" - "cosync/internal/server" -) - -func TestAll() bool { - TestClientServerCommunication() - return false -} - -func TestClientServerCommunication() bool { - go client.Run() - go server.Run() - return false -} - -func TestConfigLoading() bool { - return false -} - -func TestConfigCreation() bool { - return false -} \ No newline at end of file