ML
    • Recent
    • Categories
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty

    IT Discussion
    6
    30
    1.3k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • wirestyle22W
      wirestyle22
      last edited by wirestyle22

      I wrote a script that decrypts files in a specific directory with a .pgp file extension and then takes the decrypted file and puts it into a specific directory. It also takes the original file in its encrypted form and moves it into an archive directory. I need to e-mail a group of people when my script runs successfully, unsuccessfully or if there are no files in the directory when the script tries to run. It's a work in progress with some arbitrary numbers, but this is what I have so far:

      #!/usr/bin/env bash
      source "/home/user1/subdirectory1/master.sh"
      fileCheck=$(ls $decryptedFolderPath | wc -l)
      decryptedFolderPath="/home/user2/subdirectory2/"
      archiveFolderPath="/home/user1/subdirectory1/archive/in/"
      arrVar=(${#failArray[@]} ${#successArray[@]})
      extension=${fileName##*\.}
      newFileName=${fileName%.*}
      fileWithoutTimestamp="$newFileName.$extension"
      encryptedItems=$(ls encryptedFolderPath*.pgp)
      failArray=()                                   
      successArray=()
      
      fileCheck=$(ls $decryptedFolderPath | wc -l)
      if [ $fileCheck -eq  0 ]; then
      mail -s 'File Check' [email protected] <<< 'No files detected in x directory'
      exit 0
      fi
      
      for i in $encryptedItems
      do
      gpg --batch --homedir /home/user1/.gnupg/ --passphrase "$PASS" --list-only --list-packets --yes --decrypt "$i" | grep -q "encrypted" > "$decryptedFolderPath"/"$fileWithoutTimestamp"
      outPut=$(gpg --batch --homedir /home/user1/.gnupg/ --passphrase "$PASS" --list-only --list-packets --yes "$i" | grep -q "encrypted")
      
      if [ $? != 0 ]; then
      echo "$i is not a pgp file"
      failArray+=("Failed to decrypt $i, with status code $? output from pgp: $outPut")
      else 
      echo ls -A decryptedFolderPath | mail -s 'File Check' [email protected] <<< 'No new files have been detected'
      fi
      
      if [ $? == 0 ]; then
      successArray+=("Succesfully Decrypted $i")
      echo ${#arrVar[@]} | mail -s 'message subject' [email protected]
      v=${i%.*}
      encryptedFile="$v"
      fileName=${encryptedFile##*/}
      @@ -27,4 +34,4 @@ continue
      fi
      done
      
      mv "$i" "$archiveFolderPath"
      

      One of the things I'm going to include is when there are no files to decrypt. I'd appreciate some advice from some of you that are more experienced with bash. Is there a better way to do this in bash or am I on the right track? @stacksofplates

      1 Reply Last reply Reply Quote 0
      • stacksofplatesS
        stacksofplates
        last edited by

        Is this currently working?

        You're doing a loop over the items in "$encryptedFolderPath"*.pgp and calling failArray=() and successArray() but it seems like you're doing that before you actually run the loop to decrypt them? Maybe I'm looking at this incorrectly.

        wirestyle22W 2 Replies Last reply Reply Quote 0
        • wirestyle22W
          wirestyle22 @stacksofplates
          last edited by

          @stacksofplates No it's not. I'm just figuring out the syntax of it.

          1 Reply Last reply Reply Quote 0
          • wirestyle22W
            wirestyle22 @stacksofplates
            last edited by wirestyle22

            @stacksofplates said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

            Is this currently working?

            You're doing a loop over the items in "$encryptedFolderPath"*.pgp and calling failArray=() and successArray() but it seems like you're doing that before you actually run the loop to decrypt them? Maybe I'm looking at this incorrectly.

            failArray=() and successArray=() are just creating empty arrays I can put data into

            1 Reply Last reply Reply Quote 0
            • ObsolesceO
              Obsolesce
              last edited by

              What do you think @IRJ ?

              1 Reply Last reply Reply Quote -1
              • wirestyle22W
                wirestyle22
                last edited by wirestyle22

                I am breaking this down very slowly for myself. Not a bash master by any measure, but I do want to continue learning it. Arrays seem somewhat annoying in Bash. I will likely learn python to deal with more complex stuff I may need to do with them.

                stacksofplatesS 1 Reply Last reply Reply Quote 0
                • stacksofplatesS
                  stacksofplates @wirestyle22
                  last edited by

                  @wirestyle22 said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                  I am breaking this down very slowly for myself. Not a bash master by any measure, but I do want to continue learning it. Arrays seems somewhat annoying in Bash. I will likely learn python to deal with more complex stuff I may need to do with them.

                  I was going to suggest that. This would likely be easier in Python and more straightforward. If you have to stick to bash, don't declare your arrays in a looplike that, just declare them in the variables at the top

                  wirestyle22W IRJI 2 Replies Last reply Reply Quote 1
                  • wirestyle22W
                    wirestyle22 @stacksofplates
                    last edited by wirestyle22

                    @stacksofplates said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                    @wirestyle22 said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                    I am breaking this down very slowly for myself. Not a bash master by any measure, but I do want to continue learning it. Arrays seems somewhat annoying in Bash. I will likely learn python to deal with more complex stuff I may need to do with them.

                    I was going to suggest that. This would likely be easier in Python and more straightforward. If you have to stick to bash, don't declare your arrays in a looplike that, just declare them in the variables at the top

                    Alright I did that. Is there something better than ShellCheck for bash syntax checking that you know of? Do you just use bash -n script

                    stacksofplatesS 1 Reply Last reply Reply Quote 0
                    • IRJI
                      IRJ @stacksofplates
                      last edited by

                      @stacksofplates said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                      @wirestyle22 said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                      I am breaking this down very slowly for myself. Not a bash master by any measure, but I do want to continue learning it. Arrays seems somewhat annoying in Bash. I will likely learn python to deal with more complex stuff I may need to do with them.

                      This would likely be easier in Python and more straightforward.

                      Yep

                      1 Reply Last reply Reply Quote 0
                      • stacksofplatesS
                        stacksofplates @wirestyle22
                        last edited by

                        @wirestyle22 said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                        @stacksofplates said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                        @wirestyle22 said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                        I am breaking this down very slowly for myself. Not a bash master by any measure, but I do want to continue learning it. Arrays seems somewhat annoying in Bash. I will likely learn python to deal with more complex stuff I may need to do with them.

                        I was going to suggest that. This would likely be easier in Python and more straightforward. If you have to stick to bash, don't declare your arrays in a looplike that, just declare them in the variables at the top

                        Alright I did that. Is there something better than ShellCheck for bash syntax checking that you know of? Do you just use bash -n script

                        I don't know of anything better.

                        1 Reply Last reply Reply Quote 1
                        • stacksofplatesS
                          stacksofplates
                          last edited by stacksofplates

                          Here's a quick setup in Python if you want to try it instead.

                          import os
                          import gnupg
                          
                          
                          encrypted_dir = "/tmp/encrypted_files"
                          archive = "/tmp/archive"
                          password = os.getenv(os.getenv("DECRYPT_PASSWORD"))
                          gpg = gnupg.GPG(gnupghome='/home/user/.gnupg')
                          responses = {}
                          
                          
                          def decrypt_file(file: str, password: str):
                              out_name = f'{encrypted_dir}/{file}.decrypted'
                              stream = open(f'{encrypted_dir}/{file}', "rb")
                              return gpg.decrypt_file(stream, passphrase=password, output=out_name)
                          
                          
                          
                          for file in os.listdir(encrypted_dir):
                              if file.endswith(".gpg"):
                                  stat = decrypt_file(file, password)
                                  responses[file] = stat
                              else:
                                  continue
                          
                          
                          for file in responses:
                              status = responses[file]
                              if status.ok:
                                  os.rename(f'{encrypted_dir}/{file}', f'{archive}/{file}')
                                  print(f'File {file} decrypted and moved')
                              else:
                                  print(f'File {file} had error, {status.stderr}')
                          
                          wirestyle22W 1 Reply Last reply Reply Quote 1
                          • wirestyle22W
                            wirestyle22 @stacksofplates
                            last edited by

                            @stacksofplates Thanks. That will help as a reference for later but I did want to figure out how to do this in bash as well. It's just kind of a challenge I don't want to give up on yet.

                            1 Reply Last reply Reply Quote 0
                            • stacksofplatesS
                              stacksofplates
                              last edited by

                              Rather than mess with multiple arrays, you can just have a single dictionary that holds the file and status. A single function can decrypt the file. Then just save the file name and status of the decryption in that dictionary. Then loop through the dictionary and here I just print the data, but you could email it or send to Slack or whatever.

                              This was a quick pass so probably can be cleaned up a bit.

                              wirestyle22W 1 Reply Last reply Reply Quote 1
                              • wirestyle22W
                                wirestyle22 @stacksofplates
                                last edited by

                                @stacksofplates Thanks for your help

                                stacksofplatesS 1 Reply Last reply Reply Quote 0
                                • stacksofplatesS
                                  stacksofplates @wirestyle22
                                  last edited by

                                  @wirestyle22 said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                                  @stacksofplates Thanks for your help

                                  No prob. I'm not a bash expert (and I find it annoying lol) so once things get past a certain point I give up with it.

                                  wirestyle22W 1 Reply Last reply Reply Quote 0
                                  • wirestyle22W
                                    wirestyle22 @stacksofplates
                                    last edited by wirestyle22

                                    @stacksofplates said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                                    Rather than mess with multiple arrays, you can just have a single dictionary that holds the file and status. A single function can decrypt the file. Then just save the file name and status of the decryption in that dictionary. Then loop through the dictionary and here I just print the data, but you could email it or send to Slack or whatever.

                                    This was a quick pass so probably can be cleaned up a bit.

                                    My reasoning behind two arrays was to keep it organized. If I do all successes in one and then all failures in the other. So I have this now:

                                    #!/usr/bin/env bash
                                    source "/home/user1/subdirectory1/master.sh"
                                    decryptedFolderPath="/home/user2/subdirectory2/"
                                    archiveFolderPath="/home/user1/subdirectory1/archive/in/"
                                    extension=${fileName##*\.}
                                    newFileName=${fileName%.*}
                                    fileWithoutTimestamp="$newFileName.$extension"
                                    encryptedItems=$(ls encryptedFolderPath*.pgp)
                                    statusArray=()                                   
                                    
                                    for i in $encryptedItems
                                    do
                                    gpg --batch --homedir /home/user1/.gnupg/ --passphrase "$PASS" --list-only --list-packets --yes --decrypt "$i" | grep -q "encrypted" > "$decryptedFolderPath"/"$fileWithoutTimestamp"
                                    outPut=$(gpg --batch --homedir /home/user1/.gnupg/ --passphrase "$PASS" --list-only --list-packets --yes "$i" | grep -q "encrypted")
                                    
                                    if [ $? != 0 ]; then
                                    echo "$i is not a pgp file"
                                    statusArray+=("failed to decrypt $i, with status code $? output from pgp: $outPut")
                                    fi
                                    
                                    if [ $? == 0 ]; then
                                    statusArray+=("Succesfully Decrypted $i")
                                    echo ${#statusArray[@]} | mail -s 'report' [email protected]
                                    v=${i%.*}
                                    encryptedFile="$v"
                                    fileName=${encryptedFile##*/}
                                    @@ -27,4 +34,4 @@ continue
                                    fi
                                    done
                                    
                                    mv "$i" "$archiveFolderPath"
                                    

                                    I think this is what you meant, right?

                                    stacksofplatesS 1 Reply Last reply Reply Quote 0
                                    • stacksofplatesS
                                      stacksofplates @wirestyle22
                                      last edited by stacksofplates

                                      @wirestyle22 said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                                      @stacksofplates said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                                      Rather than mess with multiple arrays, you can just have a single dictionary that holds the file and status. A single function can decrypt the file. Then just save the file name and status of the decryption in that dictionary. Then loop through the dictionary and here I just print the data, but you could email it or send to Slack or whatever.

                                      This was a quick pass so probably can be cleaned up a bit.

                                      My reasoning behind two arrays was to keep it organized. If I do all successes in one and then all failures in the other. So I have this now:

                                      #!/usr/bin/env bash
                                      source "/home/user1/subdirectory1/master.sh"
                                      decryptedFolderPath="/home/user2/subdirectory2/"
                                      archiveFolderPath="/home/user1/subdirectory1/archive/in/"
                                      extension=${fileName##*\.}
                                      newFileName=${fileName%.*}
                                      fileWithoutTimestamp="$newFileName.$extension"
                                      encryptedItems=$(ls encryptedFolderPath*.pgp)
                                      statusArray=()                                   
                                      
                                      for i in $encryptedItems
                                      do
                                      gpg --batch --homedir /home/user1/.gnupg/ --passphrase "$PASS" --list-only --list-packets --yes --decrypt "$i" | grep -q "encrypted" > "$decryptedFolderPath"/"$fileWithoutTimestamp"
                                      outPut=$(gpg --batch --homedir /home/user1/.gnupg/ --passphrase "$PASS" --list-only --list-packets --yes "$i" | grep -q "encrypted")
                                      
                                      if [ $? != 0 ]; then
                                      echo "$i is not a pgp file"
                                      statusArray+=("failed to decrypt $i, with status code $? output from pgp: $outPut")
                                      fi
                                      
                                      if [ $? == 0 ]; then
                                      statusArray+=("Succesfully Decrypted $i")
                                      echo ${#statusArray[@]} | mail -s 'report' [email protected]
                                      v=${i%.*}
                                      encryptedFile="$v"
                                      fileName=${encryptedFile##*/}
                                      @@ -27,4 +34,4 @@ continue
                                      fi
                                      done
                                      
                                      mv "$i" "$archiveFolderPath"
                                      

                                      I think this is what you meant, right?

                                      Well no. I meant Python can easily work with dictionaries (hash maps) vs doing multiple arrays. You'd have to switch to a hash map in Bash vs the multiple arrays.

                                      wirestyle22W 1 Reply Last reply Reply Quote 0
                                      • wirestyle22W
                                        wirestyle22 @stacksofplates
                                        last edited by wirestyle22

                                        @stacksofplates said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                                        @wirestyle22 said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                                        @stacksofplates said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                                        Rather than mess with multiple arrays, you can just have a single dictionary that holds the file and status. A single function can decrypt the file. Then just save the file name and status of the decryption in that dictionary. Then loop through the dictionary and here I just print the data, but you could email it or send to Slack or whatever.

                                        This was a quick pass so probably can be cleaned up a bit.

                                        My reasoning behind two arrays was to keep it organized. If I do all successes in one and then all failures in the other. So I have this now:

                                        #!/usr/bin/env bash
                                        source "/home/user1/subdirectory1/master.sh"
                                        decryptedFolderPath="/home/user2/subdirectory2/"
                                        archiveFolderPath="/home/user1/subdirectory1/archive/in/"
                                        extension=${fileName##*\.}
                                        newFileName=${fileName%.*}
                                        fileWithoutTimestamp="$newFileName.$extension"
                                        encryptedItems=$(ls encryptedFolderPath*.pgp)
                                        statusArray=()                                   
                                        
                                        for i in $encryptedItems
                                        do
                                        gpg --batch --homedir /home/user1/.gnupg/ --passphrase "$PASS" --list-only --list-packets --yes --decrypt "$i" | grep -q "encrypted" > "$decryptedFolderPath"/"$fileWithoutTimestamp"
                                        outPut=$(gpg --batch --homedir /home/user1/.gnupg/ --passphrase "$PASS" --list-only --list-packets --yes "$i" | grep -q "encrypted")
                                        
                                        if [ $? != 0 ]; then
                                        echo "$i is not a pgp file"
                                        statusArray+=("failed to decrypt $i, with status code $? output from pgp: $outPut")
                                        fi
                                        
                                        if [ $? == 0 ]; then
                                        statusArray+=("Succesfully Decrypted $i")
                                        echo ${#statusArray[@]} | mail -s 'report' [email protected]
                                        v=${i%.*}
                                        encryptedFile="$v"
                                        fileName=${encryptedFile##*/}
                                        @@ -27,4 +34,4 @@ continue
                                        fi
                                        done
                                        
                                        mv "$i" "$archiveFolderPath"
                                        

                                        I think this is what you meant, right?

                                        Well no. I meant Python can easily work with dictionaries (hash maps) vs doing multiple arrays. You'd have to switch to a hash map in Bash vs the multiple arrays.

                                        Gotcha. Yeah it sounds more convenient it just going to take me more time to learn than I have with this current script

                                        ObsolesceO 1 Reply Last reply Reply Quote 0
                                        • wirestyle22W
                                          wirestyle22
                                          last edited by wirestyle22

                                          https://twitter.com/YellsOld/status/1370004797798092804?s=07&fbclid=IwAR2IVL6gcZT7MS7xnjEQODIY6HUuSeKTlbf2OMFp0pYU3euVHFRqu6cFHT8

                                          Relevant

                                          1 Reply Last reply Reply Quote 0
                                          • ObsolesceO
                                            Obsolesce @wirestyle22
                                            last edited by

                                            @wirestyle22 said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                                            @stacksofplates said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                                            @wirestyle22 said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                                            @stacksofplates said in Return Values in Bash Script and generate e-mail which shows successes, errors and if the directory is empty:

                                            Rather than mess with multiple arrays, you can just have a single dictionary that holds the file and status. A single function can decrypt the file. Then just save the file name and status of the decryption in that dictionary. Then loop through the dictionary and here I just print the data, but you could email it or send to Slack or whatever.

                                            This was a quick pass so probably can be cleaned up a bit.

                                            My reasoning behind two arrays was to keep it organized. If I do all successes in one and then all failures in the other. So I have this now:

                                            #!/usr/bin/env bash
                                            source "/home/user1/subdirectory1/master.sh"
                                            decryptedFolderPath="/home/user2/subdirectory2/"
                                            archiveFolderPath="/home/user1/subdirectory1/archive/in/"
                                            extension=${fileName##*\.}
                                            newFileName=${fileName%.*}
                                            fileWithoutTimestamp="$newFileName.$extension"
                                            encryptedItems=$(ls encryptedFolderPath*.pgp)
                                            statusArray=()                                   
                                            
                                            for i in $encryptedItems
                                            do
                                            gpg --batch --homedir /home/user1/.gnupg/ --passphrase "$PASS" --list-only --list-packets --yes --decrypt "$i" | grep -q "encrypted" > "$decryptedFolderPath"/"$fileWithoutTimestamp"
                                            outPut=$(gpg --batch --homedir /home/user1/.gnupg/ --passphrase "$PASS" --list-only --list-packets --yes "$i" | grep -q "encrypted")
                                            
                                            if [ $? != 0 ]; then
                                            echo "$i is not a pgp file"
                                            statusArray+=("failed to decrypt $i, with status code $? output from pgp: $outPut")
                                            fi
                                            
                                            if [ $? == 0 ]; then
                                            statusArray+=("Succesfully Decrypted $i")
                                            echo ${#statusArray[@]} | mail -s 'report' [email protected]
                                            v=${i%.*}
                                            encryptedFile="$v"
                                            fileName=${encryptedFile##*/}
                                            @@ -27,4 +34,4 @@ continue
                                            fi
                                            done
                                            
                                            mv "$i" "$archiveFolderPath"
                                            

                                            I think this is what you meant, right?

                                            Well no. I meant Python can easily work with dictionaries (hash maps) vs doing multiple arrays. You'd have to switch to a hash map in Bash vs the multiple arrays.

                                            Gotcha. Yeah it sounds more convenient it just going to take me more time to learn than I have with this current script

                                            Isn't this the one you've been working on for like a year now? I'd say that's enough time to learn a little about scripting.

                                            wirestyle22W 1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • First post
                                              Last post