aboutsummaryrefslogtreecommitdiffstats
path: root/uristart
blob: 1c3e382e3659d765392305e96f8dc947ba7ab0e6 (plain) (blame)
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
#!/bin/bash 
### arguments:
# $1: the URI we're starting
# $2: the "referer" of the URI we're starting.
### requirements:
# getsrv, urimatch, urijoin, uricut, some-way-to-ask-the-user-for-a-line (dmenu by default)
# getsrv tries dig and host, you only need one or the other.
##might have to configure me.
ASKUSER="choose"

check=dont

eval "$(printf "%s\n" "$1" | uricut | sed 's/^/export URI/;s/'\''/'\''\\'\'''\''/;s/: /='\''/g;s/$/'\''/')"

uristart_config="auto"

usage() {
    printf "usage: uristart [-v|--verbose|-h|--help|-c|--check] [-f|--config file] URI\n"
}

while case "$1" in
  --help|-h)
    usage
    exit 0
    ;;
  --verbose|-v)
    verbose=verbose
    ;;
  --config|-f)
    shift
    export uristart_config="$1"
    ;;
  --check|-c)
    check=check
    ;;
  *)
    break
    ;;
esac;do shift;done

if [ "$verbose" ];then
  echo "uristart: verbose:" "$verbose"
  echo "uristart: config:" "$uristart_config" >&2
  echo "uristart: check:" "$check" >&2
  echo "uristart: other:" "$@" >&2
fi

if [ ! "$*" ];then
  usage >&2 #to stderr because it is an error to not have any extra args to process
  exit 1
fi

#if [ ! -e "$uristart_config" ];then
#  printf "uristart: missing config file: %s\n" "$uristart_config" >&2
#  exit 1
#fi

uri="${1}"
scheme="$(printf "%s\n" "$uri" | uricut -s)"

### TODO: make this respect the --config|-f flag
### original: line="$(urigetline "$uri" < ~/.config/uristart.conf)"
if [ "$uristart_config" = "auto" ];then
  line="$(urigetline "$uri" < <(uristart.conf))"
  allline="$(urigetline -a "$uri" < <(uristart.conf))"
else
  line="$(urigetline "$uri" < "$uristart_config")"
  allline="$(urigetline -a "$uri" < "$uristart_config")"
fi
if [ "$allline" != "$line" ];then
  line="$(printf "%s\n" "$allline" | choose 'which handler')"
fi
if [ ! "$line" ];then
  exit 0
fi

### if we do not have a port, we are going to try to get it from their srv records.
if printf "%s\n" "$uri" | urimatch nP >/dev/null;then
  proto="$(grep ^"$scheme"'\s' /etc/services | tr ' ' '\t' | tr -s '\t ' | cut -f2 | cut -d/ -f2 | head -n1)"
  if [ ! "$proto" ]; then
    proto=tcp
  fi
  uri="$(cat <(printf "%s\n" "$uri" | uricut) \
             <(getsrv $(printf "%s\n" "$uri" | uriprintf '%s '"$proto"' %d' | cut -d+ -f2-) 2>&- | tr ':' ' ' | sed 's/ /_port: /' | sed 's/^/domain: /' | tr _ '\n') \
          | urijoin 2>/dev/null)"
  [ "$verbose" ] && printf "uristart: srv (%s) modified uri: %s\n" "$proto" "$uri" >&2
fi

### if they do not have srv records, fall-back to /etc/services
if printf "%s\n" "$uri" | urimatch nP >/dev/null;then #if we *still* don't have a port
  uri="$(cat <(printf "%s\n" "$uri" | uricut) \
             <(grep ^"$scheme"'\s' /etc/services | tr ' ' '\t' | tr -s '\t' | cut -f2 | cut -d/ -f1 | head -n1 | sed 's/^/port: /') \
          | urijoin 2>/dev/null)"
  [ "$verbose" ] && printf "uristart: getent modified uri: %s\n" "$uri" >&2
fi

### ask the user for a pipeline for starting these URIs if there isn't a pipeline already in the config.
[ "$verbose" ] && echo "uristart: the uri we're using: $uri" >&2
if [ "$line" = "" ];then
  line="$(printf "" | $ASKUSER "protocol scheme (${scheme}) not configured yet. enter new pipeline to use:")"
  if [ "$line" = "" ];then
    echo "uristart: user noped on entering new pipeline" >&2
    exit 1
  fi
  printf '%s:\t%s\n' "${scheme}" "${line}" >> ~/.config/uristart.conf
fi

### log the uri if it isn't logged already.
### and don't log search: URIs because... why not?
if [ -w ~/.cache/uristart.log ];then #only log if it is writable
  if ! cut '-d ' -f1 ~/.cache/uristart.log | grep -Fx "$uri" 2>&1 >/dev/null;then #only log URIs that aren't already listed
    if printf "%s\n" "$uri" | urimatch rs search >/dev/null;then
      if [ "$2" ];then
        printf "%s %s\n" "$uri" "$2" >> ~/.cache/uristart.log
      else
        printf "%s\n" "$uri" >> ~/.cache/uristart.log
      fi
    fi
  fi
else
  [ "$verbose" ] && printf "uristart: ~/.cacche/uristart.log is not writable. not logging.\n" >&2
fi

### do the magic
if [ "$check" = "check" ];then
  ## might put an extra check in here to output to not-terminal if no terminal exists
  printf "%s\n" "$(sqesc "$uri" | uriprintf "$line")"
else
  eval "$(sqesc "$uri" | uriprintf "$line")"
fi