]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Add 'description' field for CLI and Manager output
authorLeif Madsen <leif@leifmadsen.com>
Wed, 13 Apr 2011 15:49:33 +0000 (15:49 +0000)
committerLeif Madsen <leif@leifmadsen.com>
Wed, 13 Apr 2011 15:49:33 +0000 (15:49 +0000)
(closes issue #19076)
Reported by: lmadsen
Patches:
      __20110408-channel-description.txt uploaded by lmadsen (license 10)
Tested by: lmadsen

Review: https://reviewboard.asterisk.org/r/1163/

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@313528 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CHANGES
channels/chan_dahdi.c
channels/chan_iax2.c
channels/chan_sip.c
channels/sip/include/sip.h
configs/chan_dahdi.conf.sample
configs/iax.conf.sample
configs/sip.conf.sample
configs/users.conf.sample

diff --git a/CHANGES b/CHANGES
index 1d0e7827d59d3695d632d3272980dfc4c5af3d4b..1a511502aafe659097e89cf257833112d0ca5935 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -23,6 +23,9 @@ Asterisk Manager Interface
    for chan_dahdi ISDN channels.
  * Added new action MeetmeListRooms to list active conferences (shows same
    data as "meetme list" at the CLI).
+ * DAHDIShowChannels, SIPshowpeer, SIPpeers, and IAXpeers now contains a
+   Description field that is set by 'description' in the channel configuration
+   file.
 
 Asterisk HTTP Server
 --------------------------
@@ -41,6 +44,9 @@ CLI Changes
    alternate configuration file to use.
  * 'dialplan add extension' command will now automatically create a context if
    the specified context does not exist with a message indicated it did so.
+ * 'sip show peers', 'iax show peers', and 'dahdi show peers' now contains a
+   Description field which can be populated with 'description' in the channel
+   configuration files (sip.conf, iax2.conf, and chan_dahdi.conf).
 
 CDR
 --------------------------
index 79257b0acff43452b5fd09f694ed7f1ac051b0c9..bbb5c1ac58d7792f3b4d46b93eb2234204654070 100644 (file)
@@ -979,6 +979,11 @@ struct dahdi_pvt {
         * \note The "context" string read in from chan_dahdi.conf
         */
        char context[AST_MAX_CONTEXT];
+       /*! 
+        * \brief A description for the channel configuration
+        * \note The "description" string read in from chan_dahdi.conf
+        */
+       char description[32];
        /*!
         * \brief Saved context string.
         */
@@ -1276,6 +1281,7 @@ struct dahdi_pvt {
        MEMBER(dahdi_pvt, use_smdi, AST_DATA_BOOLEAN)                           \
        MEMBER(dahdi_pvt, context, AST_DATA_STRING)                             \
        MEMBER(dahdi_pvt, defcontext, AST_DATA_STRING)                          \
+       MEMBER(dahdi_pvt, description, AST_DATA_STRING)                         \
        MEMBER(dahdi_pvt, exten, AST_DATA_STRING)                               \
        MEMBER(dahdi_pvt, language, AST_DATA_STRING)                            \
        MEMBER(dahdi_pvt, mohinterpret, AST_DATA_STRING)                        \
@@ -12682,6 +12688,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
                ast_copy_string(tmp->mohinterpret, conf->chan.mohinterpret, sizeof(tmp->mohinterpret));
                ast_copy_string(tmp->mohsuggest, conf->chan.mohsuggest, sizeof(tmp->mohsuggest));
                ast_copy_string(tmp->context, conf->chan.context, sizeof(tmp->context));
+               ast_copy_string(tmp->description, conf->chan.description, sizeof(tmp->description));
                ast_copy_string(tmp->parkinglot, conf->chan.parkinglot, sizeof(tmp->parkinglot));
                tmp->cid_ton = 0;
                if (analog_lib_handles(tmp->sig, tmp->radio, tmp->oprmode)) {
@@ -14995,8 +15002,8 @@ static int action_dahdirestart(struct mansession *s, const struct message *m)
 
 static char *dahdi_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
-#define FORMAT "%7s %-10.10s %-15.15s %-10.10s %-20.20s %-10.10s %-10.10s\n"
-#define FORMAT2 "%7s %-10.10s %-15.15s %-10.10s %-20.20s %-10.10s %-10.10s\n"
+#define FORMAT "%7s %-10.10s %-15.15s %-10.10s %-20.20s %-10.10s %-10.10s %-32.32s\n"
+#define FORMAT2 "%7s %-10.10s %-15.15s %-10.10s %-20.20s %-10.10s %-10.10s %-32.32s\n"
        unsigned int targetnum = 0;
        int filtertype = 0;
        struct dahdi_pvt *tmp = NULL;
@@ -15033,7 +15040,7 @@ static char *dahdi_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cl
                }
        }
 
-       ast_cli(a->fd, FORMAT2, "Chan", "Extension", "Context", "Language", "MOH Interpret", "Blocked", "State");
+       ast_cli(a->fd, FORMAT2, "Chan", "Extension", "Context", "Language", "MOH Interpret", "Blocked", "State", "Description");
        ast_mutex_lock(&iflock);
        for (tmp = iflist; tmp; tmp = tmp->next) {
                if (filtertype) {
@@ -15071,7 +15078,7 @@ static char *dahdi_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cl
 
                snprintf(statestr, sizeof(statestr), "%s", "In Service");
 
-               ast_cli(a->fd, FORMAT, tmps, tmp->exten, tmp->context, tmp->language, tmp->mohinterpret, blockstr, statestr);
+               ast_cli(a->fd, FORMAT, tmps, tmp->exten, tmp->context, tmp->language, tmp->mohinterpret, blockstr, statestr, tmp->description);
        }
        ast_mutex_unlock(&iflock);
        return CLI_SUCCESS;
@@ -15107,6 +15114,7 @@ static char *dahdi_show_channel(struct ast_cli_entry *e, int cmd, struct ast_cli
        for (tmp = iflist; tmp; tmp = tmp->next) {
                if (tmp->channel == channel) {
                        ast_cli(a->fd, "Channel: %d\n", tmp->channel);
+                       ast_cli(a->fd, "Description: %s\n", tmp->description);
                        ast_cli(a->fd, "File Descriptor: %d\n", tmp->subs[SUB_REAL].dfd);
                        ast_cli(a->fd, "Span: %d\n", tmp->span);
                        ast_cli(a->fd, "Extension: %s\n", tmp->exten);
@@ -15812,6 +15820,7 @@ static int action_dahdishowchannels(struct mansession *s, const struct message *
                                        "Context: %s\r\n"
                                        "DND: %s\r\n"
                                        "Alarm: %s\r\n"
+                                       "Description: %s\r\n"
                                        "%s"
                                        "\r\n",
                                        tmp->channel,
@@ -15822,7 +15831,8 @@ static int action_dahdishowchannels(struct mansession *s, const struct message *
                                        tmp->sig,
                                        tmp->context,
                                        dahdi_dnd(tmp, -1) ? "Enabled" : "Disabled",
-                                       alarm2str(alm), idText);
+                                       alarm2str(alm),
+                                       tmp->description, idText);
                        } else {
                                astman_append(s,
                                        "Event: DAHDIShowChannels\r\n"
@@ -15832,12 +15842,14 @@ static int action_dahdishowchannels(struct mansession *s, const struct message *
                                        "Context: %s\r\n"
                                        "DND: %s\r\n"
                                        "Alarm: %s\r\n"
+                                       "Description: %s\r\n"
                                        "%s"
                                        "\r\n",
                                        tmp->channel, sig2str(tmp->sig), tmp->sig,
                                        tmp->context,
                                        dahdi_dnd(tmp, -1) ? "Enabled" : "Disabled",
-                                       alarm2str(alm), idText);
+                                       alarm2str(alm),
+                                       tmp->description, idText);
                        }
                }
        }
@@ -16836,6 +16848,8 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
                                confp->chan.dtmfrelax = 0;
                } else if (!strcasecmp(v->name, "mailbox")) {
                        ast_copy_string(confp->chan.mailbox, v->value, sizeof(confp->chan.mailbox));
+               } else if (!strcasecmp(v->name, "description")) {
+                       ast_copy_string(confp->chan.description, v->value, sizeof(confp->chan.description));
                } else if (!strcasecmp(v->name, "hasvoicemail")) {
                        if (ast_true(v->value) && ast_strlen_zero(confp->chan.mailbox)) {
                                ast_copy_string(confp->chan.mailbox, cat, sizeof(confp->chan.mailbox));
index ab28ec6dc57bf8432a8bfda6fdf1c5a63b3817e3..0db1f22995f8c9f0b37950ff895140afa5e8328c 100644 (file)
@@ -484,6 +484,7 @@ struct iax2_peer {
        AST_DECLARE_STRING_FIELDS(
                AST_STRING_FIELD(name);
                AST_STRING_FIELD(username);
+               AST_STRING_FIELD(description);          /*!< Description of the peer */
                AST_STRING_FIELD(secret);
                AST_STRING_FIELD(dbsecret);
                AST_STRING_FIELD(outkey);           /*!< What key we use to talk to this peer */
@@ -3837,6 +3838,7 @@ static char *handle_cli_iax2_show_peer(struct ast_cli_entry *e, int cmd, struct
                encmethods_to_str(peer->encmethods, encmethods);
                ast_cli(a->fd, "\n\n");
                ast_cli(a->fd, "  * Name       : %s\n", peer->name);
+               ast_cli(a->fd, "  Description  : %s\n", peer->description);
                ast_cli(a->fd, "  Secret       : %s\n", ast_strlen_zero(peer->secret) ? "<Not set>" : "<Set>");
                ast_cli(a->fd, "  Context      : %s\n", peer->context);
                ast_cli(a->fd, "  Parking lot  : %s\n", peer->parkinglot);
@@ -6712,8 +6714,8 @@ static int __iax2_show_peers(int fd, int *total, struct mansession *s, const int
        int unmonitored_peers = 0;
        struct ao2_iterator i;
 
-#define FORMAT2 "%-15.15s  %-15.15s %s  %-15.15s  %-8s  %s %-10s\n"
-#define FORMAT "%-15.15s  %-15.15s %s  %-15.15s  %-5d%s  %s %-10s\n"
+#define FORMAT2 "%-15.15s  %-15.15s %s  %-15.15s  %-8s  %s %-11s %-32.32s\n"
+#define FORMAT "%-15.15s  %-15.15s %s  %-15.15s  %-5d%s  %s %-11s %-32.32s\n"
 
        struct iax2_peer *peer = NULL;
        char name[256];
@@ -6755,7 +6757,7 @@ static int __iax2_show_peers(int fd, int *total, struct mansession *s, const int
 
 
        if (!s)
-               ast_cli(fd, FORMAT2, "Name/Username", "Host", "   ", "Mask", "Port", "   ", "Status");
+               ast_cli(fd, FORMAT2, "Name/Username", "Host", "   ", "Mask", "Port", "   ", "Status", "Description");
 
        i = ao2_iterator_init(peers, 0);
        for (peer = ao2_iterator_next(&i); peer;
@@ -6801,7 +6803,8 @@ static int __iax2_show_peers(int fd, int *total, struct mansession *s, const int
                                "Dynamic: %s\r\n"
                                "Trunk: %s\r\n"
                                "Encryption: %s\r\n"
-                               "Status: %s\r\n\r\n",
+                               "Status: %s\r\n"
+                               "Description: %s\r\n\r\n",
                                idtext,
                                name,
                                ast_sockaddr_stringify_addr(&peer->addr),
@@ -6809,7 +6812,8 @@ static int __iax2_show_peers(int fd, int *total, struct mansession *s, const int
                                ast_test_flag64(peer, IAX_DYNAMIC) ? "yes" : "no",
                                ast_test_flag64(peer, IAX_TRUNK) ? "yes" : "no",
                                peer->encmethods ? ast_str_buffer(encmethods) : "no",
-                               status);
+                               status,
+                               peer->description);
                } else {
                        ast_cli(fd, FORMAT, name,
                                ast_sockaddr_stringify_addr(&peer->addr),
@@ -6818,7 +6822,8 @@ static int __iax2_show_peers(int fd, int *total, struct mansession *s, const int
                                ast_sockaddr_port(&peer->addr),
                                ast_test_flag64(peer, IAX_TRUNK) ? "(T)" : "   ",
                                peer->encmethods ? "(E)" : "   ",
-                               status);
+                               status,
+                               peer->description);
                }
                total_peers++;
        }
@@ -12459,6 +12464,8 @@ static struct iax2_peer *build_peer(const char *name, struct ast_variable *v, st
                                ast_string_field_set(peer, mohsuggest, v->value);
                        } else if (!strcasecmp(v->name, "dbsecret")) {
                                ast_string_field_set(peer, dbsecret, v->value);
+                       } else if (!strcasecmp(v->name, "description")) {
+                               ast_string_field_set(peer, description, v->value);
                        } else if (!strcasecmp(v->name, "trunk")) {
                                ast_set2_flag64(peer, ast_true(v->value), IAX_TRUNK);   
                                if (ast_test_flag64(peer, IAX_TRUNK) && !timer) {
index 23566a023be668b2f23a75df5be0a3c90cc2c5a1..b1f32c06b3a08c613bd1c9c52a32e11bbcd9a5a4 100644 (file)
@@ -15997,8 +15997,8 @@ static char *_sip_show_peers(int fd, int *total, struct mansession *s, const str
        struct ao2_iterator i;
        
 /* the last argument is left-aligned, so we don't need a size anyways */
-#define FORMAT2 "%-25.25s  %-39.39s %-3.3s %-10.10s %-3.3s %-8s %-10s %s\n"
-#define FORMAT  "%-25.25s  %-39.39s %-3.3s %-3.3s %-3.3s %-8d %-10s %s\n"
+#define FORMAT2 "%-25.25s %-39.39s %-3.3s %-10.10s %-3.3s %-8s %-11s %-32.32s %s\n"
+#define FORMAT  "%-25.25s %-39.39s %-3.3s %-10.10s %-3.3s %-8d %-11s %-32.32s %s\n"
 
        char name[256];
        int total_peers = 0;
@@ -16038,7 +16038,7 @@ static char *_sip_show_peers(int fd, int *total, struct mansession *s, const str
        }
 
        if (!s) /* Normal list */
-               ast_cli(fd, FORMAT2, "Name/username", "Host", "Dyn", "Forcerport", "ACL", "Port", "Status", (realtimepeers ? "Realtime" : ""));
+               ast_cli(fd, FORMAT2, "Name/username", "Host", "Dyn", "Forcerport", "ACL", "Port", "Status", "Description", (realtimepeers ? "Realtime" : ""));
        
 
        i = ao2_iterator_init(peers, 0);
@@ -16103,6 +16103,7 @@ static char *_sip_show_peers(int fd, int *total, struct mansession *s, const str
                        ast_test_flag(&peer->flags[0], SIP_NAT_FORCE_RPORT) ? " N " : "   ",    /* NAT=yes? */
                        peer->ha ? " A " : "   ",       /* permit/deny */
                        ast_sockaddr_isnull(&peer->addr) ? 0 : ast_sockaddr_port(&peer->addr), status,
+                       peer->description ? peer->description : "",
                        realtimepeers ? (peer->is_realtime ? "Cached RT":"") : "");
 
                if (!s)  {/* Normal CLI list */
@@ -16112,6 +16113,7 @@ static char *_sip_show_peers(int fd, int *total, struct mansession *s, const str
                        ast_test_flag(&peer->flags[0], SIP_NAT_FORCE_RPORT) ? " N " : "   ",    /* NAT=yes? */
                        peer->ha ? " A " : "   ",       /* permit/deny */
                        ast_sockaddr_isnull(&peer->addr) ? 0 : ast_sockaddr_port(&peer->addr), status,
+                       peer->description ? peer->description : "",
                        realtimepeers ? (peer->is_realtime ? "Cached RT":"") : "");
                } else {        /* Manager format */
                        /* The names here need to be the same as other channels */
@@ -16128,7 +16130,8 @@ static char *_sip_show_peers(int fd, int *total, struct mansession *s, const str
                        "TextSupport: %s\r\n"
                        "ACL: %s\r\n"
                        "Status: %s\r\n"
-                       "RealtimeDevice: %s\r\n\r\n",
+                       "RealtimeDevice: %s\r\n"
+                       "Description: %s\r\n\r\n",
                        idtext,
                        peer->name,
                        ast_sockaddr_isnull(&peer->addr) ? "-none-" : ast_sockaddr_stringify_fmt(&peer->addr, AST_SOCKADDR_STR_HOST),
@@ -16139,7 +16142,8 @@ static char *_sip_show_peers(int fd, int *total, struct mansession *s, const str
                        ast_test_flag(&peer->flags[1], SIP_PAGE2_TEXTSUPPORT) ? "yes" : "no",   /* TEXTSUPPORT=yes? */
                        peer->ha ? "yes" : "no",       /* permit/deny */
                        status,
-                       realtimepeers ? (peer->is_realtime ? "yes":"no") : "no");
+                       realtimepeers ? (peer->is_realtime ? "yes":"no") : "no",
+                       peer->description);
                }
                ao2_unlock(peer);
                unref_peer(peer, "toss iterator peer ptr");
@@ -16717,6 +16721,7 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
                struct ast_str *mailbox_str = ast_str_alloca(512);
                ast_cli(fd, "\n\n");
                ast_cli(fd, "  * Name       : %s\n", peer->name);
+               ast_cli(fd, "  Description  : %s\n", peer->description);
                if (realtimepeers) {    /* Realtime is enabled */
                        ast_cli(fd, "  Realtime peer: %s\n", peer->is_realtime ? "Yes, cached" : "No");
                }
@@ -16924,7 +16929,8 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
                                astman_append(s, "ChanVariable: %s=%s\r\n", v->name, v->value);
                        }
                }
-               astman_append(s, "SIP-Use-Reason-Header : %s\n", (ast_test_flag(&peer->flags[1], SIP_PAGE2_Q850_REASON)) ? "Y" : "N");
+               astman_append(s, "SIP-Use-Reason-Header : %s\r\n", (ast_test_flag(&peer->flags[1], SIP_PAGE2_Q850_REASON)) ? "Y" : "N");
+               astman_append(s, "Description : %s\r\n", peer->description);
 
                peer = unref_peer(peer, "sip_show_peer: unref_peer: done with peer");
 
@@ -26105,6 +26111,7 @@ static void set_peer_defaults(struct sip_peer *peer)
                peer->call_limit=INT_MAX;
        ast_string_field_set(peer, vmexten, default_vmexten);
        ast_string_field_set(peer, secret, "");
+       ast_string_field_set(peer, description, "");
        ast_string_field_set(peer, remotesecret, "");
        ast_string_field_set(peer, md5secret, "");
        ast_string_field_set(peer, cid_num, "");
@@ -26347,6 +26354,8 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
                                ast_string_field_set(peer, remotesecret, v->value);
                        } else if (!strcasecmp(v->name, "secret")) {
                                ast_string_field_set(peer, secret, v->value);
+                       } else if (!strcasecmp(v->name, "description")) {
+                               ast_string_field_set(peer, description, v->value);
                        } else if (!strcasecmp(v->name, "md5secret")) {
                                ast_string_field_set(peer, md5secret, v->value);
                        } else if (!strcasecmp(v->name, "auth")) {
@@ -29090,7 +29099,8 @@ AST_TEST_DEFINE(test_sip_peers_get)
        MEMBER(sip_peer, maxms, AST_DATA_MILLISECONDS)          \
        MEMBER(sip_peer, qualifyfreq, AST_DATA_MILLISECONDS)    \
        MEMBER(sip_peer, timer_t1, AST_DATA_MILLISECONDS)       \
-       MEMBER(sip_peer, timer_b, AST_DATA_MILLISECONDS)
+       MEMBER(sip_peer, timer_b, AST_DATA_MILLISECONDS)        \
+       MEMBER(sip_peer, description, AST_DATA_STRING)
 
 AST_DATA_STRUCTURE(sip_peer, DATA_EXPORT_SIP_PEER);
 
index e5d8205e58644228638476c89b92865e4d154649..f3c27ad649ca25a01150c30e3836537596e35da8 100644 (file)
@@ -1157,6 +1157,7 @@ struct sip_peer {
        AST_DECLARE_STRING_FIELDS(
                AST_STRING_FIELD(secret);       /*!< Password for inbound auth */
                AST_STRING_FIELD(md5secret);    /*!< Password in MD5 */
+               AST_STRING_FIELD(description);  /*!< Description of this peer */
                AST_STRING_FIELD(remotesecret); /*!< Remote secret (trunks, remote devices) */
                AST_STRING_FIELD(context);      /*!< Default context for incoming calls */
                AST_STRING_FIELD(subscribecontext); /*!< Default context for subscriptions */
index 761c5760bb580497224b74eb303782026e896b95..dca09cb56720cf5a7aa4b009aa016710bd33c0fb 100644 (file)
@@ -820,6 +820,11 @@ pickupgroup=1
 ;
 ;useincomingcalleridondahditransfer = yes
 ;
+; Add a description for the channel which can be shown through the Asterisk
+; console  when executing the 'dahdi show channels' command is run.
+;
+;description=Phone located in lobby
+;
 ; AMA flags affects the recording of Call Detail Records.  If specified
 ; it may be 'default', 'omit', 'billing', or 'documentation'.
 ;
@@ -1068,10 +1073,13 @@ pickupgroup=1
 ;
 ;
 ;callerid="Green Phone"<(256) 428-6121>
+;description=Reception Phone                   ; add a description for 'dahdi show channels'
 ;channel => 1
 ;callerid="Black Phone"<(256) 428-6122>
+;description=Courtesy Phone
 ;channel => 2
 ;callerid="CallerID Phone" <(630) 372-1564>
+;description=                                  ; reset the description for following channels
 ;channel => 3
 ;callerid="Pac Tel Phone" <(256) 428-6124>
 ;channel => 4
index a3d0fea12799e4e2f74e7105fceb1d9aa3dc4a18..d08aa31dce59fc339cb848dcb1d1ec2bd9cea576 100644 (file)
@@ -504,6 +504,7 @@ type=peer
 username=asterisk
 secret=supersecret
 host=216.207.245.47
+description=Demo System At Digium      ; Description of this peer, as listed by 'iax2 show peers'
 ;sendani=no
 ;host=asterisk.linux-support.net
 ;port=5036
@@ -544,6 +545,7 @@ host=216.207.245.47
 ;[biggateway]
 ;type=peer
 ;host=192.168.0.1
+;description=Gateway to PSTN
 ;context=*
 ;secret=myscret
 ;trunk=yes                     ; Use IAX2 trunking with this host
index a60ea347dae32b29faebbc653f57476696c0a894..5c8fa4de9c049aaeee403956bfae1870668e99a0 100644 (file)
@@ -1100,6 +1100,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ; use_q850_reason
 ; maxforwards
 ; encryption
+; description          ; Used to provide a description of the peer in console output
 
 ;[sip_proxy]
 ; For incoming calls only. Example: FWD (Free World Dialup)
@@ -1195,6 +1196,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ;context=from-sip                ; Where to start in the dialplan when this phone calls
 ;callerid=John Doe <1234>        ; Full caller ID, to override the phones config
                                  ; on incoming calls to Asterisk
+;description=Courtesy Phone      ; Description of the peer. Shown when doing 'sip show peers'.
 ;host=192.168.0.23               ; we have a static but private IP address
                                  ; No registration allowed
 ;nat=no                          ; there is not NAT between phone and Asterisk
index 7612546b3ac30140ebd1b7e2e5ab0573f2d4db25..50b80a1c53ac223a31d2e57ad6cd398073d3db6d 100644 (file)
@@ -87,6 +87,8 @@ pickupgroup = 1
 
 ;[6000]
 ;fullname = Joe User
+;description = Courtesy Phone In Lobby    ; Used to provide a description of the
+                                          ; peer in console output
 ;email = joe@foo.bar
 ;secret = 1234
 ;dahdichan = 1