384
edits
Changes
→Weekly Usage Report by Remote Host
== Tasks for this assignment ==
In this assignment, your you will create a script that can generate usage reports based off of output from the last command or from a file in a similar format. You will use usage_data_file for testing but the script should preform the following activities:also be tested on some other Linux machines and on Matrix.
Depending on the options selected, your script should list users or remote IP addresses, either overall or limited by a specific date. It should also generate daily usage reports for specific users/remote hosts, or weekly usage reports as well.
== Allowed Python Modules ==
* the <b>os, sys</b> modules
* the <b>argparse</b> module
* The <b>datetime</b> module
* The <b>subprocess</b> module
== Instructions ==
<pre>
[eric@centos7 a1]$ python3 ./assignment2.py -h
usage: new_templateassignment2.py [-h] [-l {user,host}] [-r RHOST] [-t {daily,monthlyweekly}] [-u USERd DATE] [-su USER] [-v] F [F ...files]
Usage Report based on the last command
positional arguments:
optional arguments:
-r RHOST, --rhost RHOST
usage report for the given remote host IP
-t {daily,monthlyweekly}, --type time {daily,monthlyweekly} type of report: daily day or monthlyweek -d DATE, --date DATE specify date for report
-u USER, --user USER usage report for the given user name
-v, --verbose turn on output verbosity
Copyright 2021 - Eric Brauer
</pre>
You will that there is an 'args' object in assignment2.py. Once the <code>parse_command_args()</code> function is called, it will return an args object. The command line arguments will be stored as attributes of that object. <b>Do not use sys.argv to parse arguments.</b>
If there is only one a file name provided at the command line, read the login/logout records from the contents of the given file. If the there is not file name is "online", get the record on the system your script is being execute using the Linux command "last -iwF". The format of each line in the file should be the same as the output of 'last -Fiw'. Filter out incomplete login/logout record (hints: check for the number of fields in each record). If there is more than one file name provided, merge all the files together with the first one at the top and the last one at the bottom. Read and process the file contents in that order in your program.
=== Header ===
You will once again be graded partly on <b>correct use of version control</b>, that is use of numerous commits with sensible commit messages. In professional practice, this is critically important for the timely delivery of code. You will be expected to use:
<ol>
<li><code>git add *assignment2.py</code>
<li><code>git commit -m "a message that describes the change"</code>
<li><code>git push</code>
<li> Run the script itself. Investigate argparse. <b>In the main block, print(args).</b> Experiment with the various options.
<li> Read the usage output in the docs, what option must you implement? Go ahead and implement it. <b>Commit the change.</b>
<li> Use the check script to check your work: <code>./checkA2.py -f -v TestHelp</code>. It should succeed.<li> Investigate the <code>parse_for_user()</code> function, with the <code>usage_data_file</code>. <b>In main, call `parse_for_user()` with `output` as the argument. Investigate what's returned.</b>
<li> <code>parse_for_user()</code> should take the list of lines from the file, and instead return a list of usernames. <b>In main, print the title header and the output. Commit the change.</b>
<li> <b>Once you have `output` --> `parse_for_user()` --> correct output being printed, use if conditions to print only when `-l user` is in the command line arguments.</b>
<li> Test using <bcode>Continue committing these changes as your proceed./checkA2.py -f -v TestList</bcode><li> Implement . You should see some tests succeeding, but some failing. Use the check script to start implementing the same things as parse_for_user but functions needed for <codeb>parse_for_hosts-l host</codeb>. Use the user function to guide you. <li> Compare <b>Continue committing these changes as your output with proceed.</b> Your script should now be passing the output belowTestList tests.<li> Write Now implement the `parse_for_daily()` function using the pseudocode given-d <date> option. This should be taking the will filter your user list of lines from your file, and output a dictionary with start dates in DD/MM/YYYY format as based on the key and usage in seconds as date provided by the valueuser.<li> Use <code> {'01./01/1980': 1200, '02/01/1980': 2400, '03/01/1980': 2200} checkA2.py -f -v TestDate</code>to check your work. <lib> Once your `parse_for_daily()` function works, call it with You have completed the argparse options, and display the contents.first milestone!</b><li> Write (or modify) a function The next stage will be to do implement the same for remote hostsdaily/weekly reports.Use <code>TestDaily<li/code> Implement the outputting of the duration in HH:MM:SS instead of seconds. It's recommended you write a function to take in seconds and return a string. Call this when the `-s` option is absent. Make sure this is working with remote hosts as well. You should now have x of y tests passing.<licode>TestWeekly</code> Finally, implement with the `--monthly` option. Create a new function and get it working. start with seconds, then duration and make sure it works with remote as wellcheck script.
<li> Perform last checks and document your code. Write **why** your code is doing what it does, rather than **what** it's doing. You should have 100% of tests succeeding.
</ol>
List tables should need no extra formatting.
For daily/montly tables with two columns, The first column should be 10 characters long and be left-aligned.
The second column should be 15 characters long and be right-aligned. <pre>Daily Usage Report for rchan < same number of characters============================ <Date Usage < right justified13/02/2018 0:26:00 <15/02/2018 0:33:00Total 0:59:20llllllllllrrrrrrrrrrrrrrr < left column is 10 chars, right column is 15^left just.</pre>
=== Sample Outputs ===
The following are the reports generated by the usage report script (ur.py) with the "usage_data_file" mentioned in the overview section. You can download the file [https://scs.senecac.on.ca/~raymond.chan/ops435/a2/usage_data_file here] to test your ur.py script.
==== User List ====
The following is the user list extracted from the usage_data_file created by the command:
<pre>
[eric@centos7 a2]$ ./a2assignment2.py -l user usage_data_file
</pre>
The following is the remote host list extracted from the usage_file_file created by the command:
<pre>
[eric@centos7 a2]$ ./a2assignment2.py -l host usage_data_file
</pre>
</pre>
==== Daily Usage Report by User The Verbose Option ====The Either of the following are Daily Usage Reports created for user rchan. The output two tests can be displayed either in secondsmodified with the <code>--verbose</code> option. You shouldn't have to do anything to get this working:
<pre>
[eric@centos7 a2]$ ./a2assignment2.py -u rchan l host -t daily v usage_data_file --seconds
</pre>
<pre>
</pre>
<pre>
[eric@centos centos7 a2]$ ./a2assignment2.py -u rchan l user -d 2018-02-t daily 14 usage_data_file
</pre>
<pre>
</pre>
<pre>
[eric@centos7 a2]$ ./a2assignment2.py -r 10.40.105.130 l host -d 2018-02-t daily 14 usage_data_file -s
</pre>
<pre>
</pre>
<pre>
[eric@centos7 a2]$ ./a2assignment2.py -u rchan l host -t monthly d 2018-02-xx usage_data_file -s
</pre>
<pre>
</pre>
==== Daily Usage Report by User ====
The following are Daily Usage Report is created for user rchan.
<pre>
[eric@centos7 centos a2]$ ./a2assignment2.py -u cwsmith rchan -t monthly daily usage_data_file
</pre>
<pre>
Date Usage
13/02/2018 03 0:0226:11000315/02/2018 00 0:3833:00Total 03 0:4059:1120
</pre>
Be also sure to test with the <code>--verbose</code> ==== Monthly Daily Usage Report by Remote Host ====The following is a Monthly Daily Usage Report created for the remote host Remote Host 10.40.105.130 103 by the command:
<pre>
[eric@centos7 a2]$ ./a2assignment2.py -r 10.40.105.130 -t monthly daily usage_data_file
</pre>
<pre>
Date Usage
14/02/2018 3:02:1113/02/2018 05 2:1512:0049Total 05 5:15:00
</pre>
<pre>
[eric@centos7 a2]$ ./a2assignment2.py -l user u cwsmith -t weekly usage_data_file -v
</pre>
<pre>
</pre>
==== Weekly Usage Report by Remote Host ====
The following is a Weekly Usage Report created for the remote host 10.40.105.130 by the command:
<pre>
[eric@centos7 a2]$ ./a2assignment2.py -r 10.40.105.130 -t monthly weekly usage_data_file -v
</pre>
<pre>
Date Usage
</pre>
==== Daily Report From Online ====
Running the script with "online" <B>no filename</b> as a file argument should call a subprocess.Popen object and run the command <code>last -Fiw</code>.
<pre>
[eric@mtrx-node06pd ~]$ ./a2assignment2.py -l user online
</pre>
<pre>
[eric@mtrx-node06pd ~]$ ./a2assignment2.py -u adas20 -t daily online
</pre>
</pre>
=== Python script coding and debugging ===
! Task !! Maximum mark !! Actual mark
|-
| Algorithm Submission First Milestone || 10 ||
|-
| Check Script Results || 30 ||
| List Functions || 5 ||
|-
| Daily/Monthly Weekly Functions || 10 ||
|-
| Output Date Functions || 5 ||
|-
| Other Output/other Functions || 5 ||
|-
| Overall Design/Coherence || 10 ||
== Submission ==
* Stage 1: Submit your algorithm document file to Blackboard Complete the first milestone on GitHub by November 27April 4, 20202021.* Stage 2: Use commits to push your python script for this assignment to Github.com. The final state of your repository will be looked at on December 11April 18, 2020 2021 at 11:59 PM.* Stage 3: Copy your python script into a Word document and submit to Blackboard by December 11April 18, 2020 2021 at 11:59 PM.