Add loop receive mode

This commit is contained in:
Elara 2021-01-29 20:42:15 -08:00
parent b41dbba7ec
commit a3e365afdd
No known key found for this signature in database
GPG Key ID: A5104935B4D2E704
1 changed files with 57 additions and 1 deletions

58
main.go
View File

@ -59,6 +59,7 @@ func main() {
// Create -r flag for receiving
recvFlag := flag.BoolP("receive", "r", false, "Receive data")
targetFlag := flag.StringP("target", "T", "", "Target as defined in opensend.toml")
loopFlag := flag.BoolP("loop", "L", false, "Continuously wait for connections and handle them concurrently")
// Parse flags
flag.Parse()
@ -198,7 +199,62 @@ func main() {
log.Info().Msg("Server started on port 9898")
// Send all files in opensend directory using an HTTP server on port 9898
SendFiles(*workDir)
// If -r given
} else if *recvFlag && *loopFlag {
// Declare zeroconf shutdown variable
var zeroconfShutdown func()
for {
// Create opensend dir ignoring errors
_ = os.Mkdir(*workDir, 0755)
// If --skip-mdns is not given
if !*skipMdns {
// Register {hostname}._opensend._tcp.local. mDNS service and pass shutdown function
zeroconfShutdown = RegisterService()
}
// Notify user keypair is being generated
log.Info().Msg("Generating RSA keypair")
// Generate keypair
privateKey, publicKey := GenerateRSAKeypair()
// Notify user opensend is waiting for key exchange
log.Info().Msg("Waiting for sender key exchange")
// Exchange keys with sender
senderIP := ReceiverKeyExchange(publicKey)
// If --skip-mdns is not given
if !*skipMdns {
// Shutdown zeroconf service as connection will be unavailable during transfer
zeroconfShutdown()
}
// Sleep 300ms to allow sender time to start HTTP server
time.Sleep(300 * time.Millisecond)
// Notify user files are being received
log.Info().Msg("Receiving files from server (This may take a while)")
// Connect to sender's TCP socket
connection := ConnectToSender(senderIP)
// Get files from sender and place them into the opensend directory
RecvFiles(connection)
// Get encrypted shared key from sender
encryptedKey := GetKey(connection)
// Send stop signal to sender's HTTP server
SendSrvStopSignal(connection)
// Decrypt shared key
sharedKey := DecryptKey(encryptedKey, privateKey)
// Notify user file decryption is beginning
log.Info().Msg("Decrypting files")
// Decrypt all files in opensend directory using shared key
DecryptFiles(*workDir, sharedKey)
// Instantiate Config
parameters := &Parameters{}
// Read config file in opensend directory
parameters.ReadFile(*workDir + "/parameters.json")
// Notify user that action is being executed
log.Info().Msg("Executing JSON action")
// Execute JSON action using files within opensend directory
parameters.ExecuteAction(*workDir, *destDir)
// Remove opensend directory
err := os.RemoveAll(*workDir)
if err != nil {
log.Fatal().Err(err).Msg("Error removing opensend directory")
}
}
} else if *recvFlag {
// If --skip-mdns is not given
if !*skipMdns {