FSM-Basic

 view release on metacpan or  search on metacpan

examples/FSM_fake_bash.json  view on Meta::CPAN

                            "cat": "test.txt"
                        },
                        "test1": {
                            "catRAND": "test.txt test.txt test1.txt"
                        },
                        "test2": {
                            "catSEQ": "test.txt test1.txt test2.txt",
                            "catSEQ_idxf": "test_state"
                        },
			"mem": {
				"do": "my ( $tot,$avail) = (split /\n/ ,do { local( @ARGV, $/ ) = \"/proc/meminfo\" ; <> })[0,2];$tot =~ s/\\D*//g; $avail =~ s/\\D*//g; sprintf \"%0.2f%%\\n\",(100*($tot-$avail)/$tot);"
			},
			"mem1": {
				"exec": "/usr/bin/perl -E 'my ( $tot,$avail) = (split /\\n/ ,do { local( @ARGV, $/ ) = \"/proc/meminfo\" ; <> })[0,2];$tot =~ s/\\D*//g; $avail =~ s/\\D*//g; printf \"%0.2f%%\\n\",(100*($tot-$avail)/$tot);'"
			},
			"df": {
				"exec": "/bin/df"
			},
			"exit": {
				"final": 0,
				"matching": "close"
			},
			"h(elp)?|\\?": {
				"output": "enable\nexit\nmeminfo\ndf\n__PROMPT__"
			},
			"meminfo": {
				"do": "do { local( @ARGV, $/ ) = \"/proc/meminfo\" ; <> }"
			}
		},
		"not_matching": "prompt",
		"not_matching_info": "% Unknown command or computer name, or unable to find computer address",
		"output": "__PROMPT__"
	},
	"prompt_enable": {
		"expect": {
			"default": {
				"final": 0,

examples/FSM_telnet_cisco_switch.json  view on Meta::CPAN

        "shutdown": {
                "final": 2
        },
	"prompt": {
		"expect": {
			"(?^:(?^:^en((a)|(ab)|(abl)|(able))?$))": {
				"final": 0,
				"matching": "prompt_enable"
			},
			"df": {
				"do": "my ( $tot,$avail) = (split /\\n/ ,do { local( @ARGV, $/ ) = \"/proc/meminfo\" ; <> })[0,2];$tot =~ s/\\D*//g; $avail =~ s/\\D*//g; sprintf \"%0.2f%%\\n\",(100*($tot-$avail)/$tot); "
			},
			"exit": {
				"final": 0,
				"matching": "close"
			},
			"h(elp)?|\\?": {
				"output": "enable\nexit\nmeminfo\ndf\n__PROMPT__"
			},
			"meminfo": {
				"do": "do { local( @ARGV, $/ ) = \"/proc/meminfo\" ; <> }"
			}
		},
		"not_matching": "prompt",
		"not_matching_info": "% Unknown command or computer name, or unable to find computer address",
		"output": "__PROMPT__"
	},
	"prompt_enable": {
		"expect": {
			"default": {
				"final": 0,

examples/fake_bash.pl  view on Meta::CPAN

        $prompt = $1;
    }
    $out = subst($out);
    print $out;
    $term->write_history($history_file);
    last if $final;
}

sub slurp_file {
    my ( $file, $chomp ) = @_;
    my $data = do { local ( @ARGV, $/ ) = $file; <> };
    chomp $data if $chomp;
    return wantarray ? split /\n/, $data : $data;
}

sub subst {
    my ($data) = @_;
    print $log_fd "DATA=$data\n" if $log_level > 0;
    while ( $data =~ /(__DATE(\((.*)\))?([+-]?\d+)?__)/mg ) {
        #__DATE5__
        #__DATE+5__

lib/FSM/Basic.pm  view on Meta::CPAN

    },

    'close'  => {'final' => 1},
    'prompt' => {
        'expect' => {
            'not_matching' => 'prompt',
            'exit'         => {
                'matching'    => 'close',
                'final' => 0
            },
            'meminfo'     => {'do' => 'do { local( @ARGV, $/ ) = "/proc/meminfo" ; <> }'},
            'h(elp)?|\\?' => {
                'output' => 'exit
meminfo
mem_usage
User> '
            },
            'mem_usage' => {'do' => 'my ( $tot,$avail) = (split /\\n/ ,do { local( @ARGV, $/ ) = "/proc/meminfo" ; <> })[0,2];$tot =~ s/\\D*//g; $avail =~ s/\\D*//g; sprintf "%0.2f%%\\n",(100*($tot-$avail)/$tot); '},
        },
        'not_matching_info' => '% Unknown command or computer name, or unable to find computer address',
        'output'            => 'User> '
    }
);



The keys are the states name.
"expect" contain a sub HASH where the keys are word or REGEX expected as input

lib/FSM/Basic.pm  view on Meta::CPAN

        'prompt' => {
            'expect' => {
                'not_matching' => 'prompt',
                'exit'         => {
                    'matching' => 'close',
                    'final'    => 0
                },
                "read"         => {'cat' => 'file.txt'},
                "read_random"  => {'catRAND' => 'file1.txt file2.txt file3.txt'},
                "read_seq"     => {'catSEQ' => 'file1.txt file2.txt file3.txt', 'catSEQ_idx' => 'catSEQ_status'},
                'meminfo'      => {'do' => 'do { local( @ARGV, $/ ) = "/proc/meminfo" ; <> }'},
                'mem'          => {
				   'do' => "my ( $tot,$avail) = (split /\n/ ,do { local( @ARGV, $/ ) = \"/proc/meminfo\" ; <> })[0,2];$tot =~ s/\\D*//g; $avail =~ s/\\D*//g; sprintf \"%0.2f%%\\n\",(100*($tot-$avail)/$tot);"
			          },
                'h(elp)?|\\?'  => {
                    'output' => 'exit
    read
    read_random
    read_seq
    meminfo
    mem_usage
    mem
    User> '
                },
                'mem_usage' => {'do' => 'my ( $tot,$avail) = (split /\\n/ ,do { local( @ARGV, $/ ) = "/proc/meminfo" ; <> })[0,2];$tot =~ s/\\D*//g; $avail =~ s/\\D*//g; sprintf "%0.2f%%\\n",(100*($tot-$avail)/$tot); '},
            },
            'not_matching_info' => '% Unknown command or computer name, or unable to find computer address',
            'output'            => 'User> '
        }
    );
    my $history_file = glob( '/tmp/fsm.history' );
    my $prompt       = '> ';
    my $line;
    my $final   = 0;
    my $term    = new Term::ReadLine 'bash';

t/01-cat.t  view on Meta::CPAN

            },
            'cat' => { 'cat' => './t/test_cat.txt',
            'final'    => 0
            },
            'help' => {
                'output' => 'enable
exit
mem_usage
Switch> '
            },
            'mem_usage' => {'do' => 'my ( $tot,$avail) = (split /\\n/ ,do { local( @ARGV, $/ ) = "/proc/meminfo" ; <> })[0,2];$tot =~ s/\\D*//g; $avail =~ s/\\D*//g; sprintf "%0.2f %%\\n",(100*($tot-$avail)/$tot); '},
        },
            'read'      => {'cat' => 'test_cat.txt'},
        
        'not_matching_info' => '% Unknown command or computer name, or unable to find computer address',
        'output'            => 'Switch> '
    },
    'close' => {'final' => 1},
);

my $fsm   = FSM::Basic->new( \%states, 'accept' );

t/01-final.t  view on Meta::CPAN

            'exit'         => {
                'matching' => 'close',
                'final'    => 0
            },
            'help'    => {
                'output' => 'enable
exit
mem_usage
Switch> '
            },
            'mem_usage'     => {'do' => 'my ( $tot,$avail) = (split /\\n/ ,do { local( @ARGV, $/ ) = "/proc/meminfo" ; <> })[0,2];$tot =~ s/\\D*//g; $avail =~ s/\\D*//g; sprintf "%0.2f %%\\n",(100*($tot-$avail)/$tot); '},
        },
        'not_matching_info' => '% Unknown command or computer name, or unable to find computer address',
        'output'            => 'Switch> '
    },
    'close' => {
                       'final' => 1
                     },
);

my @ins   = qw( default exit);

t/01-matching.t  view on Meta::CPAN

            'exit'         => {
                'matching' => 'close',
                'final'    => 0
            },
            'help' => {
                'output' => 'enable
exit
mem_usage
Switch> '
            },
            'mem_usage' => {'do' => 'my ( $tot,$avail) = (split /\\n/ ,do { local( @ARGV, $/ ) = "/proc/meminfo" ; <> })[0,2];$tot =~ s/\\D*//g; $avail =~ s/\\D*//g; sprintf "%0.2f %%\\n",(100*($tot-$avail)/$tot); '},
        },
        'not_matching_info' => '% Unknown command or computer name, or unable to find computer address',
        'output'            => 'Switch> '
    },
    'close' => {'final' => 1},
);

my @ins   = qw( default);
my $fsm   = FSM::Basic->new( \%states, 'accept' );
my $final = 0;

t/01-notmatching.t  view on Meta::CPAN

            'exit'         => {
                'matching' => 'close',
                'final'    => 0
            },
            'help' => {
                'output' => 'enable
exit
mem_usage
Switch> '
            },
            'mem_usage' => {'do' => 'my ( $tot,$avail) = (split /\\n/ ,do { local( @ARGV, $/ ) = "/proc/meminfo" ; <> })[0,2];$tot =~ s/\\D*//g; $avail =~ s/\\D*//g; sprintf "%0.2f %%\\n",(100*($tot-$avail)/$tot); '},
        },
        'not_matching_info' => '% Unknown command or computer name, or unable to find computer address',
        'output'            => 'Switch> '
    },
    'close' => {'final' => 1},
);

my @ins   = qw( defaul);
my $fsm   = FSM::Basic->new( \%states, 'accept' );
my $final = 0;

t/01-toomuch_notmatching.t  view on Meta::CPAN

            'exit'         => {
                'matching' => 'close',
                'final'    => 0
            },
            'help' => {
                'output' => 'enable
exit
mem_usage
Switch> '
            },
            'mem_usage' => {'do' => 'my ( $tot,$avail) = (split /\\n/ ,do { local( @ARGV, $/ ) = "/proc/meminfo" ; <> })[0,2];$tot =~ s/\\D*//g; $avail =~ s/\\D*//g; sprintf "%0.2f %%\\n",(100*($tot-$avail)/$tot); '},
        },
        'not_matching_info' => '% Unknown command or computer name, or unable to find computer address',
        'output'            => 'Switch> '
    },
    'close' => {'final' => 1},
);

my @ins   = qw( defaul defau def);
my $fsm   = FSM::Basic->new( \%states, 'accept' );
my $final = 0;



( run in 0.722 second using v1.01-cache-2.11-cpan-49f99fa48dc )