netdata_tsrelay.nim
author Mahlon E. Smith <mahlon@martini.nu>
Tue, 26 Jun 2018 09:47:23 -0700
changeset 15 ed87882bb7f0
parent 13 e1777929ba15
child 16 fce5b4150c09
permissions -rw-r--r--
Lowercase all hostnames before sending to the database.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
     1
# vim: set et nosta sw=4 ts=4 :
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
     2
#
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
     3
# Copyright (c) 2018, Mahlon E. Smith <mahlon@martini.nu>
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
     4
# All rights reserved.
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
     5
# Redistribution and use in source and binary forms, with or without
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
     6
# modification, are permitted provided that the following conditions are met:
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
     7
#
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
     8
#     * Redistributions of source code must retain the above copyright
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
     9
#       notice, this list of conditions and the following disclaimer.
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    10
#
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    11
#     * Redistributions in binary form must reproduce the above copyright
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    12
#       notice, this list of conditions and the following disclaimer in the
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    13
#       documentation and/or other materials provided with the distribution.
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    14
#
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    15
#     * Neither the name of Mahlon E. Smith nor the names of his
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    16
#       contributors may be used to endorse or promote products derived
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    17
#       from this software without specific prior written permission.
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    18
#
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    19
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    20
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    21
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    22
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    23
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    24
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    25
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    26
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    27
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    28
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    29
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    30
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    31
import
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    32
    db_postgres,
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    33
    json,
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    34
    math,
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    35
    nativesockets,
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    36
    net,
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    37
    os,
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    38
    parseopt2,
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
    39
    posix,
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    40
    strutils,
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    41
    tables,
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    42
    terminal,
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
    43
    times
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    44
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    45
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    46
const
15
ed87882bb7f0 Lowercase all hostnames before sending to the database.
Mahlon E. Smith <mahlon@martini.nu>
parents: 13
diff changeset
    47
    VERSION = "v0.1.1"
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    48
    USAGE = """
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    49
./netdata_tsrelay [-q][-v][-h] --dbopts="[PostgreSQL connection string]" --listen-port=14866 --listen-addr=0.0.0.0
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    50
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    51
  -q: Quiet mode.  No output at all.  Ignored if -d is supplied.
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    52
  -d: Debug: Show incoming and parsed data.
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    53
  -v: Display version number.
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
    54
  -T: Change the destination table name from the default 'netdata'.
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
    55
  -t: Alter the maximum time (in ms) an open socket waits for data.  Default: 500ms.
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    56
  -h: Help.  You're lookin' at it.
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    57
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    58
The default connection string is:
13
e1777929ba15 Remove port and user from the default dbopts, so they instead use the postgresql behavioral default.
Mahlon E. Smith <mahlon@laika.com>
parents: 11
diff changeset
    59
  "host=localhost dbname=netdata application_name=netdata-tsrelay"
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    60
    """
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    61
    INSERT_SQL = """
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
    62
    INSERT INTO $1
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    63
        ( time, host, metrics )
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    64
    VALUES
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    65
        ( 'epoch'::timestamptz + ? * '1 second'::interval, ?, ? )
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    66
    """
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    67
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    68
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    69
type
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    70
    Config = object of RootObj
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    71
        dbopts:      string  # The postgresql connection parameters.  (See https://www.postgresql.org/docs/current/static/libpq-connect.html)
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
    72
        dbtable:     string  # The name of the table to write to.
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
    73
        listen_port: int     # The port to listen for incoming connections.
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    74
        listen_addr: string  # The IP address listen for incoming connections.  Defaults to inaddr_any.
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    75
        verbose:     bool    # Be informative
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    76
        debug:       bool    # Spew out raw data
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
    77
        insertsql:   string  # The SQL insert string after interpolating the table name.
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
    78
        timeout:     int     # How long to block, waiting on connection data.
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    79
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
    80
# Global configuration
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
    81
var conf: Config
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    82
9
aa9d537f7067 Properly reap child processes.
Mahlon E. Smith <mahlon@laika.com>
parents: 8
diff changeset
    83
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    84
proc hl( msg: string, fg: ForegroundColor, bright=false ): string =
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    85
    ## Quick wrapper for color formatting a string, since the 'terminal'
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    86
    ## module only deals with stdout directly.
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
    87
    if not isatty(stdout): return msg
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    88
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    89
    var color: BiggestInt = ord( fg )
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    90
    if bright: inc( color, 60 )
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    91
    result = "\e[" & $color & 'm' & msg & "\e[0m"
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    92
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
    93
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    94
proc fetch_data( client: Socket ): string =
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    95
    ## Netdata JSON backend doesn't send a length, so we read line by
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    96
    ## line and wait for stream timeout to determine a "sample".
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
    97
    var buf: string = nil
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
    98
    try:
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
    99
        result = client.recv_line( timeout=conf.timeout )
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   100
        if result != "" and not result.is_nil: result = result & "\n"
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   101
        while buf != "":
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   102
            buf = client.recv_line( timeout=conf.timeout )
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   103
            if buf != "" and not buf.is_nil: result = result & buf & "\n"
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   104
    except TimeoutError:
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   105
        discard
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   106
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   107
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   108
proc parse_data( data: string ): seq[ JsonNode ] =
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   109
    ## Given a raw +data+ string, parse JSON and return a sequence
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   110
    ## of JSON samples. Netdata can buffer multiple samples in one batch.
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   111
    result = @[]
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   112
    if data == "" or data.is_nil: return
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   113
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   114
    # Hash of sample timeperiods to pivoted json data
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   115
    var pivoted_data = init_table[ BiggestInt, JsonNode ]()
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   116
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   117
    for sample in split_lines( data ):
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   118
        if sample == "" or sample.is_nil: continue
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   119
        if conf.debug: echo sample.hl( fgBlack, bright=true )
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   120
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   121
        var parsed: JsonNode
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   122
        try:
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   123
            parsed = sample.parse_json
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   124
        except JsonParsingError:
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   125
            if conf.debug: echo hl( "Unable to parse sample line: " & sample.hl(fgRed, bright=true), fgRed )
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   126
            continue
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   127
        if parsed.kind != JObject: return
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   128
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   129
        # Create or use existing Json object for modded data.
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   130
        #
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   131
        var pivot: JsonNode
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   132
        try:
15
ed87882bb7f0 Lowercase all hostnames before sending to the database.
Mahlon E. Smith <mahlon@martini.nu>
parents: 13
diff changeset
   133
            let key = parsed[ "timestamp" ].get_num
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   134
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   135
            if pivoted_data.has_key( key ):
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   136
                pivot = pivoted_data[ key ]
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   137
            else:
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   138
                pivot = newJObject()
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   139
                pivoted_data[ key ] = pivot
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   140
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   141
            var name = parsed[ "chart_id" ].get_str & "." & parsed[ "id" ].get_str
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   142
            pivot[ "hostname" ] = parsed[ "hostname" ]
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   143
            pivot[ "timestamp" ] = parsed[ "timestamp" ]
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   144
            pivot[ name ] = parsed[ "value" ]
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   145
        except:
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   146
            continue
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   147
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   148
    for timestamp, sample in pivoted_data:
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   149
        result.add( sample )
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   150
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   151
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   152
proc write_to_database( samples: seq[ JsonNode ] ): void =
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   153
    ## Given a sequence of json samples, write them to database.
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   154
    if samples.len == 0: return
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   155
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   156
    let db = open( "", "", "", conf.dbopts )
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   157
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   158
    try:
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   159
        db.exec sql( "BEGIN" )
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   160
        for sample in samples:
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   161
            var
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   162
                timestamp = sample[ "timestamp" ].get_num
15
ed87882bb7f0 Lowercase all hostnames before sending to the database.
Mahlon E. Smith <mahlon@martini.nu>
parents: 13
diff changeset
   163
                host = sample[ "hostname" ].get_str.to_lowerascii
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   164
            sample.delete( "timestamp" )
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   165
            sample.delete( "hostname" )
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   166
            db.exec sql( conf.insertsql ), timestamp, host, sample
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   167
        db.exec sql( "COMMIT" )
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   168
    except:
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   169
        let
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   170
            e = getCurrentException()
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   171
            msg = getCurrentExceptionMsg()
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   172
        echo "Got exception ", repr(e), " while writing to DB: ", msg
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   173
        discard
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   174
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   175
    db.close
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   176
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   177
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   178
proc process( client: Socket, address: string ): void =
9
aa9d537f7067 Properly reap child processes.
Mahlon E. Smith <mahlon@laika.com>
parents: 8
diff changeset
   179
    ## Do the work for a connected client within child process.
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   180
    let t0 = cpu_time()
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   181
    var raw_data = client.fetch_data
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   182
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   183
    # Done with the socket, netdata will automatically
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   184
    # reconnect.  Save local resources/file descriptors
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   185
    # by closing after the send is considered complete.
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   186
    #
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   187
    try:
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   188
        client.close
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   189
    except OSError:
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   190
        return
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   191
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   192
    # Pivot the parsed data to a single JSON blob per sample time.
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   193
    var samples = parse_data( raw_data )
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   194
    write_to_database( samples )
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   195
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   196
    if conf.verbose:
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   197
        echo(
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   198
            hl( $(epochTime().to_int), fgMagenta, bright=true ),
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   199
            " ",
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   200
            hl( $(samples.len), fgWhite, bright=true ),
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   201
            " sample(s) parsed from ",
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   202
            address.hl( fgYellow, bright=true ),
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   203
            " in ", hl($( round(cpu_time() - t0, 3) ), fgWhite, bright=true), " seconds."
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   204
            # " ", hl($(round((get_occupied_mem()/1024/1024),1)), fgWhite, bright=true), "MB memory used."
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   205
        )
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   206
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   207
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   208
proc serverloop( conf: Config ): void =
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   209
    ## Open a database connection, bind to the listening socket,
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   210
    ## and start serving incoming netdata streams.
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   211
    let db = open( "", "", "", conf.dbopts )
9
aa9d537f7067 Properly reap child processes.
Mahlon E. Smith <mahlon@laika.com>
parents: 8
diff changeset
   212
    db.close
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   213
    if conf.verbose: echo( "Successfully tested connection to the backend database.".hl( fgGreen ) )
9
aa9d537f7067 Properly reap child processes.
Mahlon E. Smith <mahlon@laika.com>
parents: 8
diff changeset
   214
aa9d537f7067 Properly reap child processes.
Mahlon E. Smith <mahlon@laika.com>
parents: 8
diff changeset
   215
    # Ensure children are properly reaped.
aa9d537f7067 Properly reap child processes.
Mahlon E. Smith <mahlon@laika.com>
parents: 8
diff changeset
   216
    #
aa9d537f7067 Properly reap child processes.
Mahlon E. Smith <mahlon@laika.com>
parents: 8
diff changeset
   217
    var sa: Sigaction
aa9d537f7067 Properly reap child processes.
Mahlon E. Smith <mahlon@laika.com>
parents: 8
diff changeset
   218
    sa.sa_handler = SIG_IGN
aa9d537f7067 Properly reap child processes.
Mahlon E. Smith <mahlon@laika.com>
parents: 8
diff changeset
   219
    discard sigaction( SIGCHLD, sa )
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   220
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   221
    # Setup listening socket.
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   222
    #
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   223
    var server = newSocket()
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   224
    server.set_sock_opt( OptReuseAddr, true )
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   225
    server.bind_addr( Port(conf.listen_port), conf.listen_addr )
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   226
    server.listen()
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   227
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   228
    if conf.verbose:
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   229
        echo(
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   230
            "Listening for incoming connections on ".hl( fgGreen, bright=true ),
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   231
            hl( (if conf.listen_addr == "0.0.0.0": "*" else: conf.listen_addr) , fgBlue, bright=true ),
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   232
            ":",
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   233
            hl( $conf.listen_port, fgBlue, bright=true ),
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   234
        )
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   235
        echo ""
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   236
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   237
    # Wait for incoming connections, fork for each client.
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   238
    #
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   239
    while true:
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   240
        var
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   241
            client  = new Socket
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   242
            address = ""
6
1f366fc61592 Each incoming connection requires its own client socket.
Mahlon E. Smith <mahlon@laika.com>
parents: 5
diff changeset
   243
9
aa9d537f7067 Properly reap child processes.
Mahlon E. Smith <mahlon@laika.com>
parents: 8
diff changeset
   244
        # Block, waiting for new connections.
aa9d537f7067 Properly reap child processes.
Mahlon E. Smith <mahlon@laika.com>
parents: 8
diff changeset
   245
        server.acceptAddr( client, address )
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   246
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   247
        if fork() == 0:
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   248
            server.close
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   249
            client.process( address )
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   250
            quit( 0 )
7
c0bcf3bea772 Force a GC pass after 25 cycles. Don't bother with sync() at exit, unnecessary.
Mahlon E. Smith <mahlon@laika.com>
parents: 6
diff changeset
   251
6
1f366fc61592 Each incoming connection requires its own client socket.
Mahlon E. Smith <mahlon@laika.com>
parents: 5
diff changeset
   252
        client.close
7
c0bcf3bea772 Force a GC pass after 25 cycles. Don't bother with sync() at exit, unnecessary.
Mahlon E. Smith <mahlon@laika.com>
parents: 6
diff changeset
   253
        when defined( testing ): dumpNumberOfInstances()
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   254
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   255
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   256
proc parse_cmdline: Config =
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   257
    ## Populate the config object with the user's preferences.
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   258
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   259
    # Config object defaults.
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   260
    #
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   261
    result = Config(
13
e1777929ba15 Remove port and user from the default dbopts, so they instead use the postgresql behavioral default.
Mahlon E. Smith <mahlon@laika.com>
parents: 11
diff changeset
   262
        dbopts: "host=localhost dbname=netdata application_name=netdata-tsrelay",
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   263
        dbtable: "netdata",
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   264
        listen_port: 14866,
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   265
        listen_addr: "0.0.0.0",
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   266
        verbose: true,
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   267
        debug: false,
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   268
        timeout: 500,
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   269
        insertsql: INSERT_SQL % [ "netdata" ]
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   270
    )
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   271
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   272
    # always set debug mode if development build.
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   273
    result.debug = defined( testing )
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   274
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   275
    for kind, key, val in getopt():
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   276
        case kind
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   277
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   278
        of cmdArgument:
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   279
            discard
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   280
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   281
        of cmdLongOption, cmdShortOption:
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   282
            case key
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   283
                of "debug", "d":
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   284
                    result.debug = true
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   285
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   286
                of "help", "h":
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   287
                    echo USAGE
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   288
                    quit( 0 )
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   289
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   290
                of "quiet", "q":
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   291
                    result.verbose = false
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   292
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   293
                of "version", "v":
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   294
                    echo hl( "netdata_tsrelay " & VERSION, fgWhite, bright=true )
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   295
                    quit( 0 )
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   296
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   297
                of "timeout", "t": result.timeout = val.parse_int
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   298
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   299
                of "dbtable", "T":
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   300
                    result.insertsql = INSERT_SQL % [ val ]
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   301
                of "dbopts": result.dbopts = val
11
475c9942eb15 Multiple changes:
Mahlon E. Smith <mahlon@laika.com>
parents: 9
diff changeset
   302
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   303
                of "listen-addr", "a": result.listen_addr = val
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   304
                of "listen-port", "p": result.listen_port = val.parse_int
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   305
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   306
                else: discard
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   307
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   308
        of cmdEnd: assert( false ) # shouldn't reach here ever
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   309
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   310
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   311
when isMainModule:
5
a1276c3d39eb Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 4
diff changeset
   312
    system.addQuitProc( resetAttributes )
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   313
    conf = parse_cmdline()
7
c0bcf3bea772 Force a GC pass after 25 cycles. Don't bother with sync() at exit, unnecessary.
Mahlon E. Smith <mahlon@laika.com>
parents: 6
diff changeset
   314
    if conf.debug: echo hl( $conf, fgYellow )
8
1ef3f2d6d10e Multiple changes.
Mahlon E. Smith <mahlon@laika.com>
parents: 7
diff changeset
   315
    serverloop( conf )
0
72c9c6f0b713 Initial commit.
Mahlon E. Smith <mahlon@laika.com>
parents:
diff changeset
   316