xref: /openbmc/openbmc-test-automation/templates/python_pgm_template (revision 7d68d00be16c25a925711c8f75f12f1415bc1708)
1*7d68d00bSMichael Walsh#!/usr/bin/env python
2*7d68d00bSMichael Walsh
3*7d68d00bSMichael Walshr"""
4*7d68d00bSMichael Walshpython_pgm_template: Copy this template as a base to get a start on a python
5*7d68d00bSMichael Walshprogram.  You may remove any generic comments (like this one).
6*7d68d00bSMichael Walsh"""
7*7d68d00bSMichael Walsh
8*7d68d00bSMichael Walshimport sys
9*7d68d00bSMichael Walsh
10*7d68d00bSMichael Walsh# python puts the program's directory path in sys.path[0].  In other words,
11*7d68d00bSMichael Walsh# the user ordinarily has no way to override python's choice of a module from
12*7d68d00bSMichael Walsh# its own dir.  We want to have that ability in our environment.  However, we
13*7d68d00bSMichael Walsh# don't want to break any established python modules that depend on this
14*7d68d00bSMichael Walsh# behavior.  So, we'll save the value from sys.path[0], delete it, import our
15*7d68d00bSMichael Walsh# modules and then restore sys.path to its original value.
16*7d68d00bSMichael Walsh
17*7d68d00bSMichael Walshsave_path_0 = sys.path[0]
18*7d68d00bSMichael Walshdel sys.path[0]
19*7d68d00bSMichael Walsh
20*7d68d00bSMichael Walshfrom gen_arg import *
21*7d68d00bSMichael Walshfrom gen_print import *
22*7d68d00bSMichael Walshfrom gen_valid import *
23*7d68d00bSMichael Walsh
24*7d68d00bSMichael Walsh# Restore sys.path[0].
25*7d68d00bSMichael Walshsys.path.insert(0, save_path_0)
26*7d68d00bSMichael Walsh
27*7d68d00bSMichael Walsh###############################################################################
28*7d68d00bSMichael Walsh# Create parser object to process command line parameters and args.
29*7d68d00bSMichael Walsh
30*7d68d00bSMichael Walsh# Create parser object.
31*7d68d00bSMichael Walshparser = argparse.ArgumentParser(
32*7d68d00bSMichael Walsh    usage='%(prog)s [OPTIONS]',
33*7d68d00bSMichael Walsh    description="%(prog)s will...",
34*7d68d00bSMichael Walsh    formatter_class=argparse.RawTextHelpFormatter,
35*7d68d00bSMichael Walsh    prefix_chars='-+')
36*7d68d00bSMichael Walsh
37*7d68d00bSMichael Walsh# Create arguments.
38*7d68d00bSMichael Walshparser.add_argument(
39*7d68d00bSMichael Walsh    '--whatever',
40*7d68d00bSMichael Walsh    help='bla, bla.')
41*7d68d00bSMichael Walsh
42*7d68d00bSMichael Walsh# The stock_list will be passed to gen_get_options.  We populate it with the
43*7d68d00bSMichael Walsh# names of stock parm options we want.  These stock parms are pre-defined by
44*7d68d00bSMichael Walsh# gen_get_options.
45*7d68d00bSMichael Walshstock_list = [("test_mode", 0), ("quiet", 0), ("debug", 0)]
46*7d68d00bSMichael Walsh###############################################################################
47*7d68d00bSMichael Walsh
48*7d68d00bSMichael Walsh
49*7d68d00bSMichael Walsh###############################################################################
50*7d68d00bSMichael Walshdef exit_function(signal_number=0,
51*7d68d00bSMichael Walsh                  frame=None):
52*7d68d00bSMichael Walsh
53*7d68d00bSMichael Walsh    r"""
54*7d68d00bSMichael Walsh    Execute whenever the program ends normally or with the signals that we
55*7d68d00bSMichael Walsh    catch (i.e. TERM, INT).
56*7d68d00bSMichael Walsh    """
57*7d68d00bSMichael Walsh
58*7d68d00bSMichael Walsh    dprint_executing()
59*7d68d00bSMichael Walsh    dprint_var(signal_number)
60*7d68d00bSMichael Walsh
61*7d68d00bSMichael Walsh    # Your cleanup code here.
62*7d68d00bSMichael Walsh
63*7d68d00bSMichael Walsh    qprint_pgm_footer()
64*7d68d00bSMichael Walsh
65*7d68d00bSMichael Walsh###############################################################################
66*7d68d00bSMichael Walsh
67*7d68d00bSMichael Walsh
68*7d68d00bSMichael Walsh###############################################################################
69*7d68d00bSMichael Walshdef signal_handler(signal_number,
70*7d68d00bSMichael Walsh                   frame):
71*7d68d00bSMichael Walsh
72*7d68d00bSMichael Walsh    r"""
73*7d68d00bSMichael Walsh    Handle signals.  Without a function to catch a SIGTERM or SIGINT, our
74*7d68d00bSMichael Walsh    program would terminate immediately with return code 143 and without
75*7d68d00bSMichael Walsh    calling our exit_function.
76*7d68d00bSMichael Walsh    """
77*7d68d00bSMichael Walsh
78*7d68d00bSMichael Walsh    # Our convention is to set up exit_function with atexit.register() so
79*7d68d00bSMichael Walsh    # there is no need to explicitly call exit_function from here.
80*7d68d00bSMichael Walsh
81*7d68d00bSMichael Walsh    dprint_executing()
82*7d68d00bSMichael Walsh
83*7d68d00bSMichael Walsh    # Calling exit prevents us from returning to the code that was running
84*7d68d00bSMichael Walsh    # when we received the signal.
85*7d68d00bSMichael Walsh    exit(0)
86*7d68d00bSMichael Walsh
87*7d68d00bSMichael Walsh###############################################################################
88*7d68d00bSMichael Walsh
89*7d68d00bSMichael Walsh
90*7d68d00bSMichael Walsh###############################################################################
91*7d68d00bSMichael Walshdef validate_parms():
92*7d68d00bSMichael Walsh
93*7d68d00bSMichael Walsh    r"""
94*7d68d00bSMichael Walsh    Validate program parameters, etc.  Return True or False (i.e. pass/fail)
95*7d68d00bSMichael Walsh    accordingly.
96*7d68d00bSMichael Walsh    """
97*7d68d00bSMichael Walsh
98*7d68d00bSMichael Walsh    # Your validation code here.
99*7d68d00bSMichael Walsh
100*7d68d00bSMichael Walsh    gen_post_validation(exit_function, signal_handler)
101*7d68d00bSMichael Walsh
102*7d68d00bSMichael Walsh    return True
103*7d68d00bSMichael Walsh
104*7d68d00bSMichael Walsh###############################################################################
105*7d68d00bSMichael Walsh
106*7d68d00bSMichael Walsh
107*7d68d00bSMichael Walsh###############################################################################
108*7d68d00bSMichael Walshdef main():
109*7d68d00bSMichael Walsh
110*7d68d00bSMichael Walsh    r"""
111*7d68d00bSMichael Walsh    This is the "main" function.  The advantage of having this function vs
112*7d68d00bSMichael Walsh    just doing this in the true mainline is that you can:
113*7d68d00bSMichael Walsh    - Declare local variables
114*7d68d00bSMichael Walsh    - Use "return" instead of "exit".
115*7d68d00bSMichael Walsh    - Indent 4 chars like you would in any function.
116*7d68d00bSMichael Walsh    This makes coding more consistent, i.e. it's easy to move code from here
117*7d68d00bSMichael Walsh    into a function and vice versa.
118*7d68d00bSMichael Walsh    """
119*7d68d00bSMichael Walsh
120*7d68d00bSMichael Walsh    if not gen_get_options(parser, stock_list):
121*7d68d00bSMichael Walsh        return False
122*7d68d00bSMichael Walsh
123*7d68d00bSMichael Walsh    if not validate_parms():
124*7d68d00bSMichael Walsh        return False
125*7d68d00bSMichael Walsh
126*7d68d00bSMichael Walsh    qprint_pgm_header()
127*7d68d00bSMichael Walsh
128*7d68d00bSMichael Walsh    # Your code here.
129*7d68d00bSMichael Walsh
130*7d68d00bSMichael Walsh    return True
131*7d68d00bSMichael Walsh
132*7d68d00bSMichael Walsh###############################################################################
133*7d68d00bSMichael Walsh
134*7d68d00bSMichael Walsh
135*7d68d00bSMichael Walsh###############################################################################
136*7d68d00bSMichael Walsh# Main
137*7d68d00bSMichael Walsh
138*7d68d00bSMichael Walshif not main():
139*7d68d00bSMichael Walsh    exit(1)
140*7d68d00bSMichael Walsh
141*7d68d00bSMichael Walsh###############################################################################
142