This program is designed to perform various file operations such as saving, restoring, and deleting files on a server. It is implemented using C++ and Python and utilizes the Boost.Asio library for asynchronous I/O operations. The program features dynamic parsing utilities to support very large files.
Message.hpp
andMessage.cpp
: Define theMessage
class, representing messages sent between client and server.Session.hpp
andSession.cpp
: Handle a single client connection.Server.hpp
andServer.cpp
: Create a TCP server and listen for connections.FileHandler.hpp
andFileHandler.cpp
: Handle file operations like save, restore, and delete.main.cpp
: Contains the main function that starts the server.Makefile
: Build instructions for the program..gitignore
: Specifies which files and directories should be ignored by Git.
-
Dependencies: Before building and running this project, make sure you have the following dependencies installed on your system:
- C++ Compiler: You'll need a C++ compiler. This project was developed using
g++
, but other C++ compilers should work as well. - Boost Libraries: This project uses the Boost C++ Libraries for networking and filesystem operations. You can download and install Boost from the official website.
- FMT Library (Optional): If you need the FMT library, you can download it from the FMT GitHub repository or use your package manager if available.
- C++ Compiler: You'll need a C++ compiler. This project was developed using
-
Compilation: Compile the server program using the
Makefile
:make
This will generate an executable named
server_app
. -
Configuration: Provide a
server.info
file with the server IP address and port:<IP address>:<port number>
For example:
127.0.0.1:8080
-
Execution: Run the server using:
./server_app
client.py
: A Python client to test the server's functionality. The client has been refactored for improved object-oriented design, streamlined flow of operations, and enhanced error handling.
-
Packages Preparation: Before running this script, ensure you have the following package installed:
- Python
termcolor
package (version 1.1.0)
You can install the required package using
pip
:pip install termcolor==1.1.0
- Python
-
Files Preparation: Ensure both
server.info
andbackup.info
are in the same directory as the server and client.server.info
contains the server IP and port, whilebackup.info
lists filenames for the client to process. -
Running the Client: Test the server's functionality with:
python3 tester.py
The project includes a "Cool Logger" module for efficient and colorful logging. Here are the key features of the logger:
-
Log Location Information: Each log entry includes the file and line number where the log message was generated. This provides valuable context for debugging.
[CoolLogger.cpp:10] [info] This is an info message [CoolLogger.cpp:11] [error] This is an error message [CoolLogger.cpp:12] [critical] This is a critical message [CoolLogger.cpp:13] [warning] This is a warning message [CoolLogger.cpp:14] [debug] This is a debug message
-
Hexadecimal Dump: The logger supports hexadecimal dumps for binary data, making it easier to inspect binary content in log messages.
LOG("This is a message with a hexdump:", data);
Output:
[CoolLogger.cpp:17] [info] This is a message with a hexdump: 48 65 6c 6c
-
Colored Log Levels: Log levels (e.g., info, error, critical, warn, debug) are displayed in color for easy identification.
Example: [INFO], [ERROR], [CRITICAL]
-
Dynamic Log Level Detection: The logger automatically detects the log level based on the log method used, simplifying log message creation.
Integrating the Cool Logger into your code is a breeze:
- Include the
LoggerModule.hpp
header. - Initialize the logger using
LoggerModule::init()
. - Employ the provided macros like
LOG
,ERROR_LOG
,CRITICAL_LOG
,WARN_LOG
, andDEBUG_LOG
, and employ{}
for string formatting.
The Cool Logger streamlines the process, handling log level detection, file and line number tracking, and even hexadecimal dumps. Logging is now effortless and stylish!
For a complete example, refer to CoolLogger.cpp
:
int main()
{
// Initialize the logger
LoggerModule::init();
// Log messages with different log levels
LOG("This is an info message");
ERROR_LOG("This is an error message");
CRITICAL_LOG("This is a critical message");
WARN_LOG("This is a warning message");
DEBUG_LOG("This is a debug message");
// Log a message with a hexadecimal dump
std::vector<unsigned char> data = {0x48, 0x65, 0x6C, 0x6C};
LOG("This is a message with a hexdump:", data);
return 0;
}
The logger supports modulating the log level based on the compilation mode. This is done by defining a specific macro in the Makefile
. To change the log level, simply compile the program in the desired mode:
-
Debug Mode: When the program is compiled in debug mode, the logger will display all log levels.
make debug ./logger_app
Output:
[CoolLogger.cpp:10] [info] This is an info message [CoolLogger.cpp:11] [error] This is an error message [CoolLogger.cpp:12] [critical] This is a critical message
-
Release Mode: When the program is compiled in release mode, the logger will only display error, critical, and warning messages.
make ./logger_app
Output:
[CoolLogger.cpp:11] [error] This is an error message [CoolLogger.cpp:12] [critical] This is a critical message [CoolLogger.cpp:13] [warning] This is a warning message
With these features, the "Cool Logger" module simplifies logging and debugging while adding a touch of style.
- The client transitioned from procedural design to object-oriented programming for improved maintainability.
- Enhanced clarity with the segregation of the send_and_receive method into specific sub-methods.
- Included dynamic handling of server responses and error validations.
- Ensure the server is running before executing the client.
- Files in
backup.info
should be in the client script's directory. server.info
should have valid IP and port data.
This project is licensed under the MIT License.
This project was completed as part of the Open University of Israel course Defensive System-Programming (20937), taken in 2023c. Earned 100 points.