Merge branch 'dev' into jeremi

# Conflicts:
#	pkg/utils/FileReceiver.go
This commit is contained in:
Jérémi N ‘EndMove’ 2022-03-12 19:13:24 +01:00
commit 345e195b81
Signed by: EndMove
GPG Key ID: 65C4A02E1F5371A4
13 changed files with 122 additions and 71 deletions

View File

@ -51,11 +51,11 @@ func main() {
===== Init all Reader here =====
*/
// Creation of the EraseFileRule
eraseFileRule := readers.CreateEraseFileRule("^ERASEFILE ([A-Za-z0-9.]{50,200})\r\n$")
protocolRepository.AddReader(&eraseFileRule)
// eraseFileRule := readers.CreateEraseFileRule("^ERASEFILE ([A-Za-z0-9.]{50,200})\r\n$")
// protocolRepository.AddReader(&eraseFileRule)
// Creation of the SendFileRule // TODO reset to 50,200
sendFileRule := readers.CreateSendFileRule("^SENDFILE ([A-Za-z0-9.]{1,200}) ([0-9]{1,10}) ([A-Za-z0-9.]{50,200})\r\n$")
sendFileRule := readers.CreateSendFileRule("^SENDFILE ([A-Za-z0-9.]{1,200}) ([0-9]{1,10}) ([A-Za-z0-9.]{50,200})\r\n$", protocolRepository)
protocolRepository.AddReader(&sendFileRule)
// Create a Multicast Client & run it

View File

@ -58,14 +58,14 @@ func (client ClientMulticast) Run() {
return
}
cmd, correct := client.repository.ExecuteWriter(writers.HelloRulePrefix, client.domain, fmt.Sprintf("%d", client.port))
if !correct {
println("[ClientMulticast] Hello rule isn't correct (" + cmd + ")")
writerResult := client.repository.ExecuteWriter(writers.HelloRulePrefix, client.domain, fmt.Sprintf("%d", client.port))
if writerResult == nil {
println("[ClientMulticast] Hello rule isn't correct")
return
}
for {
_, _ = con.Write([]byte(cmd))
_, _ = con.Write([]byte(writerResult.Cmd))
time.Sleep(time.Second * client.second)
}
}

View File

@ -36,9 +36,22 @@ func (server ServerUnicast) Run() {
if err != nil {
return
}
result := server.ReqManager.Execute(line, reader)
println("[RESPONSE] : ", result)
_, _ = con.Write(append([]byte(result), '\n')) // TODO : ATTENTION laisser les \n
response := server.ReqManager.Execute(line, reader)
if response == nil {
break
} else {
println("[RESPONSE] : ", response.Cmd)
_, _ = con.Write([]byte(response.Cmd)) // TODO : ATTENTION laisser les \n
if response.Write != nil {
response.Write(bufio.NewWriter(con))
}
}
}
con.Close()
}
listen.Close()
}

View File

@ -10,7 +10,7 @@ type IProtocolReader interface {
GetCmd() string
// Execute Permet d'exécuter l'action implémentée par une règle. Retourne le message (rule) de retour et bool pour savoir si tout s'est bien passé ou non
Execute(data string) (string, bool, func(reader *bufio.Reader) (string, bool))
Execute(data string) (*ProtocolWriterResult, func(reader *bufio.Reader) *ProtocolWriterResult)
// Match Permet de vérifier la validité d'une donnée censée suivre les règles d'un protocol
Match(data string) bool

View File

@ -1,10 +1,20 @@
package protocol
import "bufio"
// IProtocolWriter Représentation abstraite d'un protocol
type IProtocolWriter interface {
// GetCmd Permet de récupérer le nom de la commande
GetCmd() string
// Execute Permet de créer une règle à envoyer
Execute(argsData ...string) (string, bool)
Execute(argsData ...string) *ProtocolWriterResult
}
type ProtocolWriterResult struct {
// Cmd Commande générée par le ProtocolWriter
Cmd string
// Write Fonction appelée
Write func(writer *bufio.Writer)
}

View File

@ -1,6 +1,7 @@
package managers
import (
"StoreBackEnd/pkg/protocol"
"StoreBackEnd/pkg/protocol/repository"
"bufio"
)
@ -9,20 +10,20 @@ type RequestManager struct {
Repository *repository.ProtocolRepository
}
func (receiver RequestManager) Execute(request string, reader *bufio.Reader) string {
func (receiver RequestManager) Execute(request string, reader *bufio.Reader) *protocol.ProtocolWriterResult {
// On lis ce que l'on reçoit
result, executed, readCb := receiver.Repository.ExecuteReader(request)
writeCmd, readCb := receiver.Repository.ExecuteReader(request)
// On renvoie la réponse (Comment pour fichier ?)
if executed {
if writeCmd != nil {
if readCb != nil {
cbResult, _ := readCb(reader)
if cbResult != "" {
result = cbResult
cbResult := readCb(reader)
if cbResult != nil {
writeCmd = cbResult
}
}
return result
return writeCmd
} else {
return "Error occurred while execute command"
return nil
}
}

View File

@ -36,26 +36,25 @@ func (repo ProtocolRepository) AddWriter(writer *protocol.IProtocolWriter) {
/*
ExecuteReader Permet d'exécuter un Reader et de récupérer la commande à renvoyer. La deuxième valeur de retour permet de savoir si une commande a put être exécuté
*/
func (repo ProtocolRepository) ExecuteReader(data string) (string, bool, func(reader *bufio.Reader) (string, bool)) {
func (repo ProtocolRepository) ExecuteReader(data string) (*protocol.ProtocolWriterResult, func(reader *bufio.Reader) *protocol.ProtocolWriterResult) {
for _, reader := range repo.protocolReaders {
if (*reader).Match(data) { // Exécuter si match
// Récupérer résultat à renvoyer (Donc donner ProtocolRepository aux reader ?!)
return (*reader).Execute(data)
}
}
return "", false, nil
return nil, nil
}
/*
ExecuteReader Permet d'exécuter un Wrier et de récupérer la commande construite avec nos argument et un indicateur de réussite.
*/
func (repo ProtocolRepository) ExecuteWriter(ruleName string, data ...string) (string, bool) {
func (repo ProtocolRepository) ExecuteWriter(ruleName string, data ...string) *protocol.ProtocolWriterResult {
protocolWriter, has := repo.protocolWriters[ruleName]
if has {
println("OHOH")
return (*protocolWriter).Execute(data...)
} else {
return "", false
return nil
}
}

View File

@ -1,10 +1,6 @@
package readers
import (
"StoreBackEnd/pkg/protocol"
"bufio"
)
/*
// EraseFileRulePrefix Identifiant de cette règle
const EraseFileRulePrefix = "ERASEFILE"
@ -29,7 +25,7 @@ func (rule EraseFileRule) GetCmd() string {
return rule.Cmd
}
func (rule EraseFileRule) Execute(data string) (string, bool, func(r *bufio.Reader) (string, bool)) {
func (rule EraseFileRule) Execute(data string) (*protocol.ProtocolWriterResult, bool, func(reader *bufio.Reader) (*protocol.ProtocolWriterResult, bool)) {
if rule.Match(data) {
values := rule.matcher.Parse(data)
println(values[1], " est le hash du fichier à supprimer")
@ -42,3 +38,5 @@ func (rule EraseFileRule) Execute(data string) (string, bool, func(r *bufio.Read
func (rule EraseFileRule) Match(data string) bool {
return rule.matcher.Match(data)
}
*/

View File

@ -2,6 +2,8 @@ package readers
import (
"StoreBackEnd/pkg/protocol"
"StoreBackEnd/pkg/protocol/repository"
"StoreBackEnd/pkg/protocol/rules/writers"
"StoreBackEnd/pkg/utils"
"bufio"
"strconv"
@ -16,13 +18,16 @@ type SendFileRule struct {
cmd string
// matcher Allow to make a regex match
matcher *protocol.RegexMatcher
// protocolRepo Instance de ProtocolRepository
protocolRepo *repository.ProtocolRepository
}
// CreateSendFileRule Creating an instance of SendFileRule
func CreateSendFileRule(pattern string) protocol.IProtocolReader {
func CreateSendFileRule(pattern string, protocolRepo *repository.ProtocolRepository) protocol.IProtocolReader {
return &SendFileRule{
cmd: SendFileRulePrefix,
matcher: protocol.CreateRegexMatcher(pattern),
protocolRepo: protocolRepo,
}
}
@ -32,44 +37,36 @@ func (rule SendFileRule) GetCmd() string {
}
// Execute the Rule with a string command.
func (rule SendFileRule) Execute(data string) (string, bool, func(reader *bufio.Reader) (string, bool)) {
func (rule SendFileRule) Execute(data string) (*protocol.ProtocolWriterResult, func(reader *bufio.Reader) *protocol.ProtocolWriterResult) {
println(0)
if rule.Match(data) { // TODO : cloture this command.
println("OK")
values := rule.matcher.Parse(data)
// Values
fileName := values[1]
fileSize, _ := strconv.Atoi(values[2])
// fileContentHash := values[3]
// print received data
println(values[1], " File Name Hash")
println(values[2], " File Size")
println(values[3], " File Content Hash")
println(1)
// function callback
callback := func(reader *bufio.Reader) (string, bool) {
hasReceive := utils.ReceiveFile(fileName, fileSize, reader)
println("HEY1")
/*
file, _ := os.Create(fmt.Sprintf("/home/benjamin/sbe/%s", fileName))
_, err := io.Copy(file, reader)
println("HEY1")
if err != nil {
println("Can't copy file")
return "SEND_ERROR\r", false
callback := rule.onRead(fileName, fileSize)
println(2)
return rule.protocolRepo.ExecuteWriter(writers.SendOkRulePrefix), callback
} else {
return rule.protocolRepo.ExecuteWriter(writers.SendErrorRulePrefix), nil
}
}
*/
func (rule SendFileRule) onRead(fileName string, fileSize int) func(reader *bufio.Reader) *protocol.ProtocolWriterResult {
return func(reader *bufio.Reader) *protocol.ProtocolWriterResult {
hasReceive := utils.ReceiveFile(fileName, fileSize, reader)
println(3)
if !hasReceive {
return "SEND_ERROR\r", false
}
println("HEY2")
return "SEND_OK\r", true
}
return "SEND_OK\r", true, callback
return rule.protocolRepo.ExecuteWriter(writers.SendErrorRulePrefix)
} else {
println("AHAHAHAHAHAHA")
return "SEND_ERROR\r", false, nil
return rule.protocolRepo.ExecuteWriter(writers.SendOkRulePrefix)
}
}
}

View File

@ -27,6 +27,10 @@ func (rule HelloRule) GetCmd() string {
}
// Execute the Rule with a string command.
func (rule HelloRule) Execute(argsData ...string) (string, bool) {
return rule.matcher.Build(HelloRulePrefix, argsData...)
func (rule HelloRule) Execute(argsData ...string) *protocol.ProtocolWriterResult {
cmd, _ := rule.matcher.Build(HelloRulePrefix, argsData...)
return &protocol.ProtocolWriterResult{
Cmd: cmd,
}
}

View File

@ -1,6 +1,8 @@
package writers
import "StoreBackEnd/pkg/protocol"
import (
"StoreBackEnd/pkg/protocol"
)
// SendErrorRulePrefix Rule command prefix
const SendErrorRulePrefix = "SEND_ERROR"
@ -27,6 +29,17 @@ func (rule SendErrorRule) GetCmd() string {
}
// Execute the Rule with a string command.
func (rule SendErrorRule) Execute(argsData ...string) (string, bool) {
return rule.matcher.Build(SendErrorRulePrefix, argsData...)
func (rule SendErrorRule) Execute(argsData ...string) *protocol.ProtocolWriterResult {
buildedCmd, _ := rule.matcher.Build(SendErrorRulePrefix, argsData...)
return &protocol.ProtocolWriterResult{
Cmd: buildedCmd,
}
}
/*
func onWrite(writer *bufio.Writer) {
println("Ecriture du fichier sur le réseau")
}
*/

View File

@ -1,6 +1,8 @@
package writers
import "StoreBackEnd/pkg/protocol"
import (
"StoreBackEnd/pkg/protocol"
)
// SendOkRulePrefix Rule command prefix
const SendOkRulePrefix = "SEND_OK"
@ -27,6 +29,10 @@ func (rule SendOkRule) GetCmd() string {
}
// Execute the Rule with a string command.
func (rule SendOkRule) Execute(argsData ...string) (string, bool) {
return rule.matcher.Build(SendOkRulePrefix, argsData...)
func (rule SendOkRule) Execute(argsData ...string) *protocol.ProtocolWriterResult {
buildedCmd, _ := rule.matcher.Build(SendOkRulePrefix, argsData...)
return &protocol.ProtocolWriterResult{
Cmd: buildedCmd,
}
}

10
pkg/utils/FileSender.go Normal file
View File

@ -0,0 +1,10 @@
package utils
import (
"bufio"
)
func SendFile(fileName string, fileSize int, writer *bufio.Writer) bool {
return false
}