summaryrefslogtreecommitdiff
path: root/scripts/xusers.awk
blob: ac818b4fa29b0c2eb68968f9147f4dac0d2dbfc4 (plain)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/awk -f
################################################################
#  
#  Program Name  :  xusers
#  Date Created  :  02-27-97
#  Author        :  Dan A. Mercer
#  Email         :  damercer@mmm.com
#                :
#  Description   : Print list of users and applications signed on
#                : X workstations
################################################################
# standard help message
function help(hlpmsg) {
basename = ARGV[0]
sub(/.*\//,"",basename)
printf "Format:  %s [o=[hi]] [s=cdlp] [pattern]\n", basename
print  "Print list of users and applications signed on X workstations"
print  "NOTE: applicationname is truncated to 9 chars"
print  "Arguments:"
print  "           o=[h|i]      - Options"
print  "              h         - help - print this message"
print  "              i         - case insensitive pattern search"
print  "           s=[c|d|l|p]  - Sort Options"
print  "              c         - sort by command"
print  "              d         - sort by display name"
print  "              l         - sort by login name"
print  "              p         - sort by pid"
print  "           pattern      - regex pattern to search commands against"

if (length(hlpmsg)) print hlpmsg
exit
}
BEGIN {
# process command line
for (i=1;i<ARGC;i++) {
   if (ARGV[i] ~ /^o=/) {
      if (options)
         help("duplicate option string")
      options = ARGV[i]
      sub(/^o=/,"",options)
      if (options !~ /^[hi]$/)
         help("Invalid options " options)
      if ("h" == options)
         help("")
      else
         igncase = 1
      }
   else if (ARGV[i] ~ /^s=/) {
      if (sortorder)
         help("duplicate sort order string")
      sortorder = ARGV[i]
      sub(/^s=/,"",sortorder)
      if (sortorder !~ /^[cdlp]$/)
         help("Invalid sort order: '" sortorder "'")
      if ("p" == sortorder) {
         sort = "sort -kn2"
         }
      else if ("c" == sortorder) {
         # the 'b' option means ignore leading blanks
         sort = "sort -kb3"
         }
      else if ("l" == sortorder) {
         sort = "sort -kb1"
         }
      else {
         sort = "sort -kb4"
         }
      }
   else {
      if (pattern)
         help("duplicate pattern string")
      pattern = ARGV[i]
      }
   }

# default is to sort by pid
sort = (sort) ? sort : "sort -kn2"

# check for igncase
if (pattern && igncase)
   pattern = tolower(pattern)

# set default pattern
pattern = (pattern) ? pattern : ".*"

cmd = "lsof -FpLcn  -awP -iTCP:6000"
#            ||||| ||||  |
#            ||||| ||||  X servers use port 6000
#            ||||| |||don't list port names
#            ||||| ||suppress warning messages
#            ||||| |and all conditions
#            ||||| |options
#            |||||
#            ||||Internet addresses
#            |||command name
#            ||login name
#            |process id
#            Format string
# Output consists of one record per pid,  followed by newline
# delimited fields for command, Login name, and network address
# The pid is preceded by a 'p',  command by a 'c',
# Login name by an L, and network connection by an 'n'.  There may
# be multiple 'n' entries (for instance for vuewm)

while ((cmd | getline field) > 0) {
   type = substr(field,1,1)
   sub("^.","",field)
   if ("p" == type) {
      # always output first
      pid = field
      PID[pid] = ++ct
      }
   else if ("c" == type) {
      # always output second
      XAPPL[pid] = field
      }
   else if ("L" == type) {
      # always output fourth
      USER[pid] = field
      }
   else if ("n" == type) {
      # may be multiple instances - we just use the last
      gsub(".*->|:6000","",field)
      DPY[pid] = field
      }
   }
close(cmd)

printf "%8s  %5s  %-9s  %s\n","USER","PID","COMMAND","DISPLAY"
for (pid in PID) {
   if (((igncase) ? tolower(XAPPL[pid]) : XAPPL[pid]) ~ pattern)
      printf "%8s  %5d  %-9s  %s\n", USER[pid],pid,XAPPL[pid],DPY[pid] | sort
   }

close(sort)
exit
}