> (you don't have to strictly follow this form)

**Use case**

Support manually snapshot for Keeper.

**Describe the solution you'd like**

Throught 4lw commands, such as `csnp`.


using Commands = std::unordered_map<int32_t, FourLetterCommandPtr>;
    using AllowList = std::vector<int32_t>;
    
    static constexpr int32_t ALLOW_LIST_ALL = 0;
    bool isKnown(int32_t code);
    bool isEnabled(int32_t code);
    FourLetterCommandPtr get(int32_t code);
    
    void registerCommand(FourLetterCommandPtr & command);
    void initializeAllowList(KeeperDispatcher & keeper_dispatcher);
    void checkInitialization() const;
    bool isInitialized() const { return initialized; }
    void setInitialize(bool flag) { initialized = flag; }
    static FourLetterCommandFactory & instance();
    static void registerCommands(KeeperDispatcher & keeper_dispatcher);
private:
    std::atomic<bool> initialized = false;
    Commands commands;
    AllowList allow_list;
};
/**Tests if server is running in a non-error state. The server will respond with imok if it is running.
 * Otherwise it will not respond at all.
 *
 * A response of "imok" does not necessarily indicate that the server has joined the quorum,
 * just that the server process is active and bound to the specified client port.
 * Use "stat" for details on state wrt quorum and client connection information.
 */
struct RuokCommand : public IFourLetterCommand
{
    explicit RuokCommand(KeeperDispatcher & keeper_dispatcher_) : IFourLetterCommand(keeper_dispatcher_) { }