384
edits
Changes
→Weekly Usage Report by Remote Host
=Assignment 2 - Usage Report=
'''Weight:''' 1015% of the overall grade
'''Due Date:''' Please follow the three stages of submission schedule:
* Complete the algorithm document requirements for this assignment script the first milestone and push to GitHub by November 27April 4, 2020 and submit on Blackboard 2021 by 11:59 PM,* Complete the your Python script and push to Github GitHub by December 11April 18, 2020 2021 at 11:59 PM, and* Copy your Python script into a Word document and submit to Blackboard by December 11April 18, 2020 2021 at 11:59 PM.
==Overview==
== Tasks for this assignment ==
In this assignment, your should preform the following activities:# Complete you will create a detail algorithm for producing monthly script that can generate usage reports by user or by remote host based on the information stored in any given files generated off of output from the 'last' commandor from a file in a similar format. # Once you have complete You will use usage_data_file for testing but the detail algorithm, you script should then <b>design the structure of your python script</b> by identifying the appropriate python objects, functions and modules to also be used for each task in your algorithm tested on some other Linux machines and the main control logicon Matrix. Make sure to identify the followings:## input data, ## computation tasksDepending on the options selected, and ## outputs.# implement your computational solution using a single python script. You can use any built-in functions and functions from the python modules should list in the "Allowed Python Modules" section below to implement your solutionusers or remote IP addresses, either overall or limited by a specific date. # Test and review your working python code to see whether you can improve the interface of each function to facilitate better code re-use (this process is called <b>refactoring<It should also generate daily usage reports for specific users/b>)remote hosts, or weekly usage reports as well.
== Allowed Python Modules ==
* the <b>os, sys</b> modules
* the <b>argparse</b> module
* The <b>timedatetime</b> module
* The <b>subprocess</b> module
== Instructions ==
Accept the Assignment #2 via the link on Blackboard, and clone the Github repository on a Linux machine of your choosing. Rename Your code should only be located in the file "a2_templateassignment2.py" to "a2_<your myseneca username>.py, just as we did in Assignment 1. You may also want to create a symbolic link using <code>ln -s a2_<myseneca_id>.py a2.py</code> to save time.
=== Program Name and valid command line arguments ===
<pre>
[eric@centos7 a1]$ python3 ./a2assignment2.py -husage: 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 2020 2021 - Eric Brauer
</pre>
Compare the usage output you have now with the one above. There is one option missing, you will need to change the <code>argparse</code> function to implement it.
You will that there is an 'args' object in a2_templateassignment2.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 file name provided at the command line, read the login/logout records from the contents of the given file. If the 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 a file name providedat the command line, merge all read the login/logout records from the contents of the files together with given file. If there is not file name, get the first one at record on the top and system your script is being execute using the Linux command "last one at -iwF". The format of each line in the file should be the same as the bottomoutput of 'last -Fiw'. Read and process Filter out incomplete login/logout record (hints: check for the file contents number of fields in that order in your programeach record).
=== Header ===
All your Python codes for this assignment must be placed in a <font color='red'><b><u>single source file</u></b></font>. Please include the following declaration by <b><u>you</u></b> as the <font color='blue'><b>script level docstring</b></font> in your Python source code file (replace [Student_id] with your Seneca email user name, and "Student Name" with your own name):
<source>OPS435 Assignment 2 - Fall 2020Winter 2021
Program: assignment2.py
Author: "Student Name"
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> Read the rest of this document, try and understand what is expected.
<li> Use the invite link posted to Blackboard to accept the assignment, and clone the repo to a Linux machine.
<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>. **In main, call `parse_for_user()` with `output` as the argument. Investigate what's returned.**<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.** <b>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 <code>./checkA2.py -f -v TestList</code>. You should see some tests succeeding, but some failing. Use the check script to start implementing the functions needed for <b>-l host</b>.<li> <b>Continue committing these changes as your proceed.</b><li> Implement the same things as parse_for_user but for `parse_for_hosts`. Output Your script should now be sortedpassing the TestList tests. <li> Compare your output with Now implement the output below.-d <lidate> Write the `parse_for_daily()` function using the pseudocode givenoption. 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.