Skip to content

Commit f09f03c

Browse files
bites 257
1 parent a9fbe49 commit f09f03c

File tree

3 files changed

+102
-0
lines changed

3 files changed

+102
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,4 @@
5858
/258/README.md
5959
/258-pandas/README.md
6060
/132/README.md
61+
/257/README.md

257/test_users.py

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import pytest
2+
3+
from users import get_users
4+
5+
6+
pw1 = """
7+
root:x:0:0:root:/root:/bin/bash
8+
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
9+
bin:x:2:2:bin:/bin:/bin/sh
10+
sys:x:3:3:sys:/dev:/bin/sh
11+
sync:x:4:65534:sync:/bin:/bin/sync
12+
games:x:5:60:games:/usr/games:/bin/sh
13+
man:x:6:12:man:/var/cache/man:/bin/sh
14+
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
15+
"""
16+
pw2 = """
17+
mail:x:8:8:mail:/var/mail:/bin/sh
18+
news:x:9:9:news:/var/spool/news:/bin/sh
19+
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
20+
proxy:x:13:13:proxy:/bin:/bin/sh
21+
www-data:x:33:33:www-data:/var/www:/bin/sh
22+
backup:x:34:34:backup:/var/backups:/bin/sh
23+
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
24+
"""
25+
pw3 = """
26+
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
27+
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
28+
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
29+
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
30+
Debian-exim:x:101:103::/var/spool/exim4:/bin/false
31+
statd:x:102:65534::/var/lib/nfs:/bin/false
32+
sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
33+
ftp:x:104:65534::/home/ftp:/bin/false
34+
messagebus:x:105:106::/var/run/dbus:/bin/false
35+
"""
36+
pw4 = """
37+
mysql:x:106:107:MySQL Server,,,:/var/lib/mysql:/bin/false
38+
avar:x:1000:1000::/home/avar:/bin/bash
39+
chad:x:1001:1001::/home/chad:/bin/bash
40+
git-svn-mirror:x:1002:1002:Git mirror,,,:/home/git-svn-mirror:/bin/bash
41+
gerrit2:x:1003:1003:Gerrit User,,,:/home/gerrit2:/bin/bash
42+
avahi:x:107:108:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
43+
postfix:x:108:112::/var/spool/postfix:/bin/false
44+
ssh-rsa:x:1004:1004::/home/ssh-rsa:/bin/bash
45+
artagnon:x:1005:1005:Ramkumar R,,,,Git GSOC:/home/artagnon:/bin/bash
46+
"""
47+
48+
49+
@pytest.mark.parametrize("input_, expected", [
50+
(pw1, {'root': 'root', 'daemon': 'daemon', 'bin': 'bin',
51+
'sys': 'sys', 'sync': 'sync', 'games': 'games',
52+
'man': 'man', 'lp': 'lp'}),
53+
(pw2, {'mail': 'mail', 'news': 'news', 'uucp': 'uucp',
54+
'proxy': 'proxy', 'www-data': 'www-data',
55+
'backup': 'backup', 'list': 'Mailing List Manager'}),
56+
(pw3, {'irc': 'ircd', 'gnats': 'Gnats Bug-Reporting System (admin)',
57+
'nobody': 'nobody', 'libuuid': 'unknown', 'Debian-exim': 'unknown',
58+
'statd': 'unknown', 'sshd': 'unknown', 'ftp': 'unknown',
59+
'messagebus': 'unknown'}),
60+
(pw4, {'mysql': 'MySQL Server', 'avar': 'unknown', 'chad': 'unknown',
61+
'git-svn-mirror': 'Git mirror', 'gerrit2': 'Gerrit User',
62+
'avahi': 'Avahi mDNS daemon', 'postfix': 'unknown',
63+
'ssh-rsa': 'unknown', 'artagnon': 'Ramkumar R Git GSOC'}),
64+
])
65+
def test_users(input_, expected):
66+
assert get_users(input_) == expected

257/users.py

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
pw4 = """
2+
mysql:x:106:107:MySQL Server,,,:/var/lib/mysql:/bin/false
3+
avar:x:1000:1000::/home/avar:/bin/bash
4+
chad:x:1001:1001::/home/chad:/bin/bash
5+
git-svn-mirror:x:1002:1002:Git mirror,,,:/home/git-svn-mirror:/bin/bash
6+
gerrit2:x:1003:1003:Gerrit User,,,:/home/gerrit2:/bin/bash
7+
avahi:x:107:108:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
8+
postfix:x:108:112::/var/spool/postfix:/bin/false
9+
ssh-rsa:x:1004:1004::/home/ssh-rsa:/bin/bash
10+
artagnon:x:1005:1005:Ramkumar R,,,,Git GSOC:/home/artagnon:/bin/bash
11+
"""
12+
13+
14+
def get_users(passwd: str) -> dict:
15+
"""Split password output by newline,
16+
extract user and name (1st and 5th columns),
17+
strip trailing commas from name,
18+
replace multiple commas in name with a single space
19+
return dict of keys = user, values = name.
20+
"""
21+
username = dict()
22+
passwd = passwd.splitlines()
23+
for entry in passwd:
24+
if len(entry) > 1:
25+
en = entry.split(':')
26+
if len(en[4]) != 0:
27+
name = en[4].replace(',', ' ').split()
28+
name = " ".join(name)
29+
username[en[0]] = name
30+
else:
31+
username[en[0]] = 'unknown'
32+
return username
33+
34+
35+
print(get_users(pw4))

0 commit comments

Comments
 (0)