logo Use CA10RAM to get 10%* Discount.
Order Nowlogo
(5/5)

Imagine you are a Linux system administrator who is tasked with user account management and who must keep persistent records of the user ID for the account

INSTRUCTIONS TO CANDIDATES
ANSWER ALL QUESTIONS

Summary

Imagine you are a Linux system administrator who is tasked with user account management and who must keep persistent records of the user ID for the account, their name, their employment status, personal contact information, and other details, including some that are unknown today, but that may need to be added as the company evolves.  In this program, we will set up some of the groundwork using Ruby classes and modules.

There will be two classes, one module, and a main program that tests the classes and their methods.    

UserAccount Class

Let's start by thinking of UserAccount as a class.  The UserAccount class should be primarily concerned with the fields that are commonly used as arguments to the useradd command and its related commands in the Linux system (usermod, for instance).   At the very least, it should have the account user ID in an easy-to-maintain format, the group(s) to which it belongs, the GECOS field, the home directory (usually needed but not always), and the initial password. 

The attributes of the UserAccount class are as follows.  The RO (read-only) and RW (read-write) designations indicate whether you need a getter and a setter, or just a getter method. 

Attribute Name

Attribute Type (Comments)

Access

user_id

String

RW

gecos

String

RW

groups

Array of Strings

RW

home_dir

String (empty String indicates no home directory)

RW

password

String (in plain text for now)

RW

account_owners

Array of Person (see Person Class below)

RW

access_granted_date

Time

RW

access_suspended_date

Time

RW

initialize method

Since all attributes are RW, it is possible to construct objects of the class without defining an initialize method, but we will provide our own initialize method that sets groups and account_owners to an empty array.   It should not accept any parameters at this point.

Person Class

User accounts are generally associated with people, so it would seem we need a class called Person as well.  The first design problem we face is how to model the relationship of owner(s) to accounts.  For instance, John Adams may be the single person associated with a Linux account jadams, in which case it might make sense to create a base class called Person and make UserAccount a derived class.  But, the root account on a given host may be managed by a team of Admins.    In that case, the relationship of UserAccount to Person is a one-to-many relationship.    

So, we will create the Person class as a standalone class that captures personal information and associate it to the UserAccount as an array of Persons.   [Since we initialized account_owners to an empty Array, there is no problem with filling these in after building the UserAccount class.] 

The Person class must have the following attributes:

Attribute Name

Attribute Type (Comments)

Access

id

Fixnum

RO

first_name

String

RW

middle_initial

String (may be full middle name as well, optional)

RW

last_name

String

RW

suffix

String (Jr., Sr., III, etc., may be blank)

RW

department_id

Fixnum

RW

role

String (E, C, G, or O  for employee, contractor, guest, or other)

RW

phone_number

String (formatted 111-222-3333, with optional ext)

RW

email_address

String (formatted person@acme.com)

RW

initialize method

Since we have at least one RO attribute, it is necessary to initialize the class with that attribute.     Provide an initialize method that takes one argument, which can be any Fixnum you like for testing.   Make sure you can display that attribute, but not alter it in your test code. 

GeneratePassword Module

The third component of this program is a module that we will call GeneratePassword that will create a plain-text password conforming to our in-house password complexity rules.  Eventually, that module will also be capable of generating an encrypted string suitable for use with the useradd command, but not for this version. 

It will contain one method called generate_plain_text that takes no parameters and returns an eight-character random String consisting of lower-case letters and at least one each of upper-case letters, digits, and special symbols.     For example, careL3&s would be a valid password String.  You may choose to treat all letters as one big group by making an Array out of two Ranges, a-z, and A-Z.  It doesn't matter in what order the special characters or digits are included, so you may wish to hard-code the order. 

For special characters, use this group:

special = ['−', '%', '&', '@', '#', '!' ]

HINT:  An easy way to generate 1 or more random characters from an Array such as the one shown is the sample method of Arrays.  Given the array above,  ['−', '%', '&', '@', '#', '!' ].sample  would pick one of the characters while sample(2) would pick two, and so on. 

As to how we use the method generate_plain_text, the typical way is to include that module in the class definition where it's to be used.  Use the include directive to make generate_plain_text available in the UserAccount class. 

For this project, though, we also want to make this module potentially independent of any object.  When you define the module, add a line module_function :generate_plain_text after defining the actual method generate_plain_text.    This will allow you to test the method by calling it directly on the module, as in GeneratePassword.generate_plain_text in your test driver code if you wish. 

Test Driver

As you create the classes and modules above, add code that tests the creation and modification of the classes and all methods.

(5/5)
Attachments:

Related Questions

. Introgramming & Unix Fall 2018, CRN 44882, Oakland University Homework Assignment 6 - Using Arrays and Functions in C

DescriptionIn this final assignment, the students will demonstrate their ability to apply two ma

. The standard path finding involves finding the (shortest) path from an origin to a destination, typically on a map. This is an

Path finding involves finding a path from A to B. Typically we want the path to have certain properties,such as being the shortest or to avoid going t

. Develop a program to emulate a purchase transaction at a retail store. This program will have two classes, a LineItem class and a Transaction class. The LineItem class will represent an individual

Develop a program to emulate a purchase transaction at a retail store. Thisprogram will have two classes, a LineItem class and a Transaction class. Th

. SeaPort Project series For this set of projects for the course, we wish to simulate some of the aspects of a number of Sea Ports. Here are the classes and their instance variables we wish to define:

1 Project 1 Introduction - the SeaPort Project series For this set of projects for the course, we wish to simulate some of the aspects of a number of

. Project 2 Introduction - the SeaPort Project series For this set of projects for the course, we wish to simulate some of the aspects of a number of Sea Ports. Here are the classes and their instance variables we wish to define:

1 Project 2 Introduction - the SeaPort Project series For this set of projects for the course, we wish to simulate some of the aspects of a number of

Ask This Question To Be Solved By Our ExpertsGet A+ Grade Solution Guaranteed

expert
Um e HaniScience

949 Answers

Hire Me
expert
Muhammad Ali HaiderFinance

756 Answers

Hire Me
expert
Husnain SaeedComputer science

946 Answers

Hire Me
expert
Atharva PatilComputer science

726 Answers

Hire Me
July
January
February
March
April
May
June
July
August
September
October
November
December
2025
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
SunMonTueWedThuFriSat
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
00:00
00:30
01:00
01:30
02:00
02:30
03:00
03:30
04:00
04:30
05:00
05:30
06:00
06:30
07:00
07:30
08:00
08:30
09:00
09:30
10:00
10:30
11:00
11:30
12:00
12:30
13:00
13:30
14:00
14:30
15:00
15:30
16:00
16:30
17:00
17:30
18:00
18:30
19:00
19:30
20:00
20:30
21:00
21:30
22:00
22:30
23:00
23:30