• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

cisagov / gophish-tools / 4759283117

pending completion
4759283117

push

github

GitHub
Merge pull request #123 from cisagov/lineage/skeleton

141 of 473 branches covered (29.81%)

Branch coverage included in aggregate %.

9 of 24 new or added lines in 10 files covered. (37.5%)

223 existing lines in 5 files now uncovered.

298 of 1270 relevant lines covered (23.46%)

1.41 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/assessment/reschedule.py
1
"""Modify campaign start/end dates in an assessment JSON file.
2

3
Usage:
4
  pca-assessment-reschedule [--log-level=LEVEL] ASSESSMENT_FILE
5
  pca-assessment-reschedule (-h | --help)
6
  pca-assessment-reschedule --version
7

8
Options:
9
  ASSESSMENT_FILE           JSON file containing the assessment information.
10
  -h --help                 Show this screen.
11
  --version                 Show version.
12
  -l --log-level=LEVEL      If specified, then the log level will be set to
13
                            the specified value.  Valid values are "debug", "info",
14
                            "warning", "error", and "critical". [default: info]
15
"""
16
# Standard Python Libraries
17
import json
×
18
import logging
×
19
import sys
×
20
from typing import Dict
×
21

22
# Third-Party Libraries
23
from docopt import docopt
×
24

25
# cisagov Libraries
26
from models import Assessment
×
27
from util.input import get_number, get_time_input
×
28
from util.set_date import set_date
×
29

30
from ._version import __version__
×
31

32

33
def display_assessment_dates(assessment):
×
34
    """Display all campaigns in an assessment in a table."""
35
    print(f"Assessment ID: {assessment.id}")
×
36
    print(f"Start Date: {assessment.start_date}    End Date: {assessment.end_date}\n")
×
37
    print("Campaign    Launch              End")
×
38
    print("--------    ------              ---")
×
39
    for campaign in assessment.campaigns:
×
40
        print(
×
41
            f"  {campaign.name[len(campaign.name) -1 ]}        {campaign.launch_date}    {campaign.complete_date}"
42
        )
43

44
    print()
×
45

46

47
def change_dates(campaign, timezone):
×
48
    """Change dates for a campaign."""
49
    logging.info(f"Changing Dates for {campaign.name}")
×
50
    logging.debug(f"Pre-Change Launch Date: {campaign.launch_date}")
×
51
    logging.debug(f"Pre-Change Complete Date: {campaign.complete_date}")
×
52

53
    campaign.launch_date = get_time_input("start", timezone, campaign.launch_date)
×
54

55
    while True:
56
        campaign.complete_date = get_time_input("end", timezone, campaign.complete_date)
×
57

58
        if campaign.complete_date > campaign.launch_date:
×
59
            break
×
60
        else:
61
            logging.error("Complete Date is not after Launch Date.")
×
62

63
    logging.debug(f"Post-Change Launch Date: {campaign.launch_date}")
×
64
    logging.debug(f"Post-Change Complete Date: {campaign.complete_date}")
×
65

66
    return campaign
×
67

68

69
def reschedule(assessment):
×
70
    """Reschedule assessment dates."""
71
    logging.info("Determining where to start rescheduling...")
×
72
    assessment.reschedule = True
×
73
    display_assessment_dates(assessment)
×
74
    assessment.start_campaign = get_number(
×
75
        "Select a Campaign to start rescheduling at:"
76
    )
77

78
    for campaign in assessment.campaigns:
×
79
        if int(campaign.name[len(campaign.name) - 1]) >= assessment.start_campaign:
×
80
            campaign = change_dates(campaign, assessment.timezone)
×
81
            assessment.campaigns[assessment.start_campaign - 1] = campaign
×
82
            set_date("start_date", assessment, campaign.launch_date)
×
83
            set_date("end_date", assessment, campaign.complete_date)
×
84

85
    logging.info("Dates have been changed...")
×
86
    display_assessment_dates(assessment)
×
87

88
    return assessment
×
89

90

91
def main() -> None:
×
92
    """Set up logging and call the reschedule function."""
93
    args: Dict[str, str] = docopt(__doc__, version=__version__)
×
94

95
    # Set up logging
96
    log_level = args["--log-level"]
×
97
    try:
×
98
        logging.basicConfig(
×
99
            format="\n%(levelname)s: %(message)s", level=log_level.upper()
100
        )
101
    except ValueError:
×
102
        logging.critical(
×
103
            '"{}"is not a valid logging level.  Possible values are debug, info, warning, and error.'.format(
104
                log_level
105
            )
106
        )
107
        sys.exit(1)
×
108

109
    try:
×
110
        with open(args["ASSESSMENT_FILE"]) as json_file:
×
111
            json_data = json.load(json_file)
×
112

NEW
113
    except OSError:
×
114
        logging.critical(f"JSON file not found: {args['ASSESSMENT_FILE']}")
×
115
        logging.critical("Please run command from the location with the file.")
×
116
        # Bandit complains about the input() function, but it is safe to
117
        # use in Python 3, which is required by this project.
118
        input("Press any key to close...")  # nosec
×
119

120
    assessment = Assessment.parse(json_data)
×
121

122
    assessment = reschedule(assessment)
×
123

124
    with open(f"{assessment.id}-reschedule.json", "w") as fp:
×
125
        json.dump(assessment.as_dict(), fp, indent=4)
×
126

127
    logging.info(f"Assessment JSON ready: {assessment.id}-reschedule.json")
×
128
    # Stop logging and clean up
129
    logging.shutdown()
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc