Commit a1fc3148 authored by 's avatar
Browse files

Traffic from interfaces within [scope] is added together


git-svn-id: file:///home/svn/mapi/trunk@1250 8d5bb341-7cf1-0310-8cf6-ba355fef3186
parent c9862c84
......@@ -48,7 +48,7 @@ III. INSTALL DiMAPI
[ --enable-reconnect ] \
[ --with-libpcap=/usr/local/src/libpcap ] \
[ --enable-dag --with-libdag=/usr/local/dag ]
[ --enable-anonlib --enable-ipfixflib --enable-extraflib ] \
[ --enable-anonflib --enable-ipfixflib --enable-extraflib ] \
It is recommended that you use all the options in the above example.
......
......@@ -42,29 +42,29 @@ RRD_DIR=${ABW_VAR_DIR}/rrd
GRAPH_DIR=${ABW_VAR_DIR}/graph
usage() {
echo "Usage: $0 [ -r ] [ -m ]"
echo " --graph_type={l4|apps|cpu}"
echo " --subject_id=<subject_id>"
echo "Usage: $0 [ -r ]"
echo " --graph_type={l4|apps}"
echo " --label=<label>"
echo " --session=<session>"
echo " --parameters_id=<parameters_id>"
echo " --maxline={y|n|a} - draw maximum line yes/no/auto (default a)"
echo " --time=\"resolution1 resolution2 length hhmm YYYYMMDD\""
echo " -r - remove old graphs before generating new graphs"
echo " [ --parameters_id=<parameters_id> ]" (default 1)
echo " [ --maxline={y|n|a} ]" (default a)
echo ""
echo " r - remove old graphs before generating new graphs"
echo " l4 - generate graphs for L4 protocols"
echo " apps - generate graphs for application protocols"
echo " cpu - generate graphs for CPU load"
echo " subject_id - id in [subject] section in abw configuration file"
echo " label - label in [subject] secion in abw configuration file"
echo " label - label in [scope] section in abw configuration file"
echo " session - arbitrary string that identifies graphs for one request"
echo " parameters_id - id in [parameters] section in abw configuration file"
echo " resolution1 resolution2 - plot averages over these periods"
echo " length - start time is end time minus this length"
echo " hh:mm YYYYMMDD - end time"
echo ""
echo "label, time and parameters_id can be specified multiple times"
echo ""
echo "Example: $0 -r \\"
echo " --graph_type=l4 \\"
echo " --subject_id=1 --label=PoP_Prague --parameters_id=1 --parameters_id=2\\"
echo " --label=Prague_PoP --label=Brno_Pop --parameters_id=1 \\"
echo " --time=\"1 60 10min 14:20 20060617\" --time=\"10 600 5h 09:20 20060617\""
}
# end of usage()
......@@ -91,7 +91,7 @@ MAXLINE="a"
### Read arguments ###
######################
SUBJECT_LABEL_NO=0
LABEL_NO=0
PARAMETERS_NO=0
TIME_NO=0
unset SESSION
......@@ -109,15 +109,9 @@ while [ $# -gt 0 ]; do
fi
GRAPH_TYPE=${1:13}
elif [ "${1:0:13}" = "--subject_id=" ]; then
SUBJECT_ID[$SUBJECT_LABEL]=${1:13}
LABEL[$SUBJECT_LABEL]=""
SUBJECT_LABEL_NO=`expr $SUBJECT_LABEL_NO + 1`
elif [ "${1:0:8}" = "--label=" ]; then
SUBJECT_ID[$SUBJECT_LABEL]=0
LABEL[$SUBJECT_LABEL]=${1:8}
SUBJECT_LABEL_NO=`expr $SUBJECT_LABEL_NO + 1`
LABEL[$LABEL_NO]=${1:8}
LABEL_NO=`expr $LABEL_NO + 1`
elif [ "${1:0:10}" = "--session=" ]; then
SESSION=${1:10}
......@@ -142,11 +136,6 @@ done
### Check arguments ###
#######################
if [ x${MAXLINE} != "xy" -a x${MAXLINE} != "xn" -a x${MAXLINE} != "xa" ]; then
echo "--maxline argument must be equal to \"y\", \"n\" or \"a\""
exit -1
fi
if [ "x$GRAPH_TYPE" = "x" ]; then
echo "You must specify --graph_type argument"
exit -1
......@@ -158,16 +147,8 @@ if [ $GRAPH_TYPE != "l4" -a $GRAPH_TYPE != "apps" -a $GRAPH_TYPE != "cpu" ]; the
exit -1
fi
if [ $PARAMETERS_NO -gt 0 ]; then
if [ $SUBJECT_LABEL_NO -ne $PARAMETERS_NO ]; then
echo "The number of --subject_id and --label arguments must be the same as the number of --parameters_id arguments"
exit -1
fi
fi
if [ $SUBJECT_LABEL_NO -eq 0 ]; then
echo "You must specify at least one --subject or label argument and one --parameters argument"
if [ $LABEL_NO -eq 0 ]; then
echo "You must specify at least one --label argument"
exit -1
fi
......@@ -176,6 +157,11 @@ if [ $TIME_NO -eq 0 ]; then
exit -1
fi
if [ x${MAXLINE} != "xy" -a x${MAXLINE} != "xn" -a x${MAXLINE} != "xa" ]; then
echo "--maxline argument must be equal to \"y\", \"n\" or \"a\""
exit -1
fi
#############################################################
### Determine what script will be used to generate graphs ###
#############################################################
......@@ -192,9 +178,11 @@ echo "GRAPH_SCRIPT: $GRAPH_SCRIPT"
### Print arguments just for check ###
######################################
for (( I=0 ; $I<$SUBJECT_LABEL_NO ; I++ )) ; do
echo "SUBJECT_ID[$I]: ${SUBJECT_ID[$I]}"
for (( I=0 ; $I<$LABEL_NO ; I++ )) ; do
echo "LABEL[$I]: ${LABEL[$I]}"
done
for (( I=0 ; $I<$PARAMETERS_NO ; I++ )) ; do
echo "PARAMETERS_ID[$I]: ${PARAMETERS_ID[$I]}"
done
......@@ -214,152 +202,83 @@ if [ -n $SESSION ]; then
mkdir -p ${GRAPH_DIR}/${SESSION}
fi
#####################################################
### Go over all --subject_id or --label arguments ###
#####################################################
for (( I=0 ; $I<$SUBJECT_LABEL_NO ; I++ )) ; do
echo -n "Generating graphs for subject_id/label"
echo " ${SUBJECT_ID[$I]}/${LABEL[$I]} and parameters_id ${PARAMETERS_ID[$I]}"
############################################################################
### If --subject_id was specified (not --label), then a single graph for ###
### one direction of traffic will be generated ###
############################################################################
if [ ${SUBJECT_ID[$I]} -gt 0 ]; then
COMMAND="${ABW_INFO_COMMAND} -f $ABW_CONF --subject_id ${SUBJECT_ID[$I]}"
if [ ${PARAMETERS_NO} -gt 0 ]; then
COMMAND="$COMMAND --parameters_id=${PARAMETERS_ID[$I]}"
fi
MEASUREMENT_ARRAY=(`$COMMAND`)
if [ ${MEASUREMENT_ARRAY[0]} = "unknown" ]; then
echo "Unknown subject_id or parameters_id"
exit -1
fi
if [ ${MEASUREMENT_ARRAY[0]} != "subject:" ]; then
echo "Error in configuration file"
exit -1
fi
HOSTNAME=${MEASUREMENT_ARRAY[1]}
INTERFACE=${MEASUREMENT_ARRAY[2]}
PREFIX=${MEASUREMENT_ARRAY[3]}
LABEL=${MEASUREMENT_ARRAY[4]}
DESCRIPTION=${MEASUREMENT_ARRAY[5]}
if [ "${DESCRIPTION: -1}" != "\"" ]; then
J=6
END=0
while [ $J -lt ${#MEASUREMENT_ARRAY[*]} -a $END -eq 0 ]; do
DESCRIPTION="$DESCRIPTION ${MEASUREMENT_ARRAY[$J]}"
if [ "${MEASUREMENT_ARRAY[$J]: -1}" = "\"" ]; then
END=1
fi
J=`expr $J + 1`
done
fi
DESCRIPTION=${DESCRIPTION:1:${#DESCRIPTION}-2}
echo "HOSTNAME: $HOSTNAME"
echo "INTERFACE: $INTERFACE"
echo "PREFIX: $PREFIX"
echo "LABEL: $LABEL"
echo "DESCRIPTION: $DESCRIPTION"
#####################################
### Go over all --label arguments ###
#####################################
##########################################################################
### If --label was specified (not --subject_id), then a dual graph for ###
### both directions of traffic will be generated ###
##########################################################################
else
COMMAND="${ABW_INFO_COMMAND} -f $ABW_CONF --label ${LABEL[$I]} --direction in"
if [ ${PARAMETERS_NO} -gt 0 ]; then
COMMAND="$COMMAND --parameters_id=${PARAMETERS_ID[$I]}"
fi
echo "command: $COMMAND"
MEASUREMENT_ARRAY_IN=(`$COMMAND`)
for (( I=0 ; $I<$LABEL_NO ; I++ )) ; do
echo -n "Finding information about label"
echo " ${LABEL[$I]} and parameters_id ${PARAMETERS_ID[$I]}"
if [ ${MEASUREMENT_ARRAY_IN[0]} != "unknown" -a ${MEASUREMENT_ARRAY_IN[0]} != "subject:" ]; then
echo "Error in configuration file"
exit -1
fi
COMMAND="${ABW_INFO_COMMAND} -f $ABW_CONF --label ${LABEL[$I]} --direction out"
if [ ${PARAMETERS_NO} -gt 0 ]; then
COMMAND="$COMMAND --parameters_id=${PARAMETERS_ID[$I]}"
fi
echo "command: $COMMAND"
MEASUREMENT_ARRAY_OUT=(`$COMMAND`)
if [ ${MEASUREMENT_ARRAY_OUT[0]} != "unknown" -a ${MEASUREMENT_ARRAY_OUT[0]} != "subject:" ]; then
echo "Error in configuration file"
exit -1
fi
COMMAND="${ABW_INFO_COMMAND} -f $ABW_CONF --label ${LABEL[$I]} --direction in"
if [ ${PARAMETERS_NO} -gt 0 ]; then
COMMAND="$COMMAND --parameters_id=${PARAMETERS_ID[$I]}"
fi
echo "command: $COMMAND"
MEASUREMENT_ARRAY_IN=(`$COMMAND`)
if [ ${MEASUREMENT_ARRAY_IN[0]} = "unknown" -a ${MEASUREMENT_ARRAY_OUT[0]} = "unknown" ]; then
echo "Unknown label or parameters_id"
exit -1
fi
if [ -n "${MEASUREMENT_ARRAY_IN[0]}" ]; then
if [ ${MEASUREMENT_ARRAY_IN[0]} == "scope:" ]; then
if [ x${MEASUREMENT_ARRAY_IN[0]} != "xunknown" ]; then
HOSTNAME_IN=${MEASUREMENT_ARRAY_IN[1]}
INTERFACE_IN=${MEASUREMENT_ARRAY_IN[2]}
PREFIX_IN=${MEASUREMENT_ARRAY_IN[3]}
LABEL_IN=${MEASUREMENT_ARRAY_IN[4]}
PREFIX_IN[$I]=${MEASUREMENT_ARRAY_IN[2]}
DESCRIPTION_IN=${MEASUREMENT_ARRAY_IN[5]}
if [ "${DESCRIPTION_IN: -1}" != "\"" ]; then
J=6
DESCRIPTION_IN[$I]=${MEASUREMENT_ARRAY_IN[3]}
if [ "${DESCRIPTION_IN[$I]: -1}" != "\"" ]; then
J=4
END=0
while [ $J -lt ${#MEASUREMENT_ARRAY_IN[*]} -a $END -eq 0 ]; do
DESCRIPTION_IN="$DESCRIPTION_IN ${MEASUREMENT_ARRAY_IN[$J]}"
DESCRIPTION_IN[$I]="$DESCRIPTION_IN[$I] ${MEASUREMENT_ARRAY_IN[$J]}"
if [ "${MEASUREMENT_ARRAY_IN[$J]: -1}" = "\"" ]; then
END=1
fi
END=1
fi
J=`expr $J + 1`
done
fi
DESCRIPTION_IN=${DESCRIPTION_IN:1:${#DESCRIPTION_IN}-2}
DESCRIPTION_IN[$I]=${DESCRIPTION_IN[$I]:1:${#DESCRIPTION_IN[$I]}-2}
echo "HOSTNAME_IN: $HOSTNAME_IN"
echo "INTERFACE_IN: $INTERFACE_IN"
echo "PREFIX_IN: $PREFIX_IN"
echo "LABEL_IN: $LABEL_IN"
echo "DESCRIPTION_IN: $DESCRIPTION_IN"
echo "LABEL_IN[$I]: $LABEL_IN[$I]"
echo "PREFIX_IN[$I]: $PREFIX_IN[$I]"
echo "DESCRIPTION_IN[$I]: $DESCRIPTION_IN[$I]"
fi
fi
COMMAND="${ABW_INFO_COMMAND} -f $ABW_CONF --label ${LABEL[$I]} --direction out"
if [ ${PARAMETERS_NO} -gt 0 ]; then
COMMAND="$COMMAND --parameters_id=${PARAMETERS_ID[$I]}"
fi
echo "command: $COMMAND"
MEASUREMENT_ARRAY_OUT=(`$COMMAND`)
if [ -n "${MEASUREMENT_ARRAY_OUT[0]}" ]; then
if [ ${MEASUREMENT_ARRAY_OUT[0]} == "scope:" ]; then
if [ x${MEASUREMENT_ARRAY_OUT[0]} != "xunknown" ]; then
HOSTNAME_OUT=${MEASUREMENT_ARRAY_OUT[1]}
INTERFACE_OUT=${MEASUREMENT_ARRAY_OUT[2]}
PREFIX_OUT=${MEASUREMENT_ARRAY_OUT[3]}
LABEL_OUT=${MEASUREMENT_ARRAY_OUT[4]}
PREFIX_OUT[$I]=${MEASUREMENT_ARRAY_IN[2]}
DESCRIPTION_OUT=${MEASUREMENT_ARRAY_OUT[5]}
if [ "${DESCRIPTION_OUT: -1}" != "\"" ]; then
J=6
DESCRIPTION_OUT[$I]=${MEASUREMENT_ARRAY_IN[3]}
if [ "${DESCRIPTION_OUT[$I]: -1}" != "\"" ]; then
J=4
END=0
while [ $J -lt ${#MEASUREMENT_ARRAY_OUT[*]} -a $END -eq 0 ]; do
DESCRIPTION_OUT="$DESCRIPTION_OUT ${MEASUREMENT_ARRAY_OUT[$J]}"
DESCRIPTION_OUT[$I]="$DESCRIPTION_OUT[$I] ${MEASUREMENT_ARRAY_OUT[$J]}"
if [ "${MEASUREMENT_ARRAY_OUT[$J]: -1}" = "\"" ]; then
END=1
fi
END=1
fi
J=`expr $J + 1`
done
fi
DESCRIPTION_OUT=${DESCRIPTION_OUT:1:${#DESCRIPTION_OUT}-2}
DESCRIPTION_OUT[$I]=${DESCRIPTION_OUT[$I]:1:${#DESCRIPTION_OUT[$I]}-2}
echo "HOSTNAME_OUT: $HOSTNAME_OUT"
echo "INTERFACE_OUT: $INTERFACE_OUT"
echo "PREFIX_OUT: $PREFIX_OUT"
echo "LABEL_OUT: $LABEL_OUT"
echo "DESCRIPTION_OUT: $DESCRIPTION_OUT"
echo "LABEL_OUT[$I]: $LABEL_OUT[$I]"
echo "PREFIX_OUT[$I]: $PREFIX_OUT[$I]"
echo "DESCRIPTION_OUT[$I]: $DESCRIPTION_OUT[$I]"
fi
fi
done
# Go to next --label
for (( I=0 ; $I<$LABEL_NO ; I++ )) ; do
echo -n "Generating graphs for label"
echo " ${LABEL[$I]} and parameters_id ${PARAMETERS_ID[$I]}"
####################################
### Go over all --time arguments ###
......@@ -393,36 +312,10 @@ for (( I=0 ; $I<$SUBJECT_LABEL_NO ; I++ )) ; do
fi
COMMAND="${COMMAND}.sh"
# Add prefixes when line graphs are requested (l4 or apps),
# but not when CPU load graphs are requested
if [ ${GRAPH_TYPE} != "cpu" ]; then
if [ ${SUBJECT_ID[$I]} -gt 0 ]; then
COMMAND="$COMMAND ${PREFIX[$I]} \"\""
else
if [ x${MEASUREMENT_ARRAY_IN[0]} != "xunknown" ]; then
COMMAND="$COMMAND ${PREFIX_IN[$I]}"
else
COMMAND="$COMMAND \"\""
fi
if [ x${MEASUREMENT_ARRAY_OUT[0]} != "xunknown" ]; then
COMMAND="$COMMAND ${PREFIX_OUT[$I]}"
else
COMMAND="$COMMAND \"\""
fi
fi
fi
COMMAND="$COMMAND \"${PREFIX_IN[$I]}\" \"${PREFIX_OUT[$I]}\""
COMMAND="$COMMAND ${GRAPH_DIR}/${SESSION}/graph_${LABEL[$I]}_${GRAPH_TYPE}_${R1}s_${R2}s_${TIME_LENGTH}.png end-${TIME_LENGTH} \"${END_TIME}\" ${R1} ${R2}"
if [ ${SUBJECT_ID[$I]} -gt 0 ]; then
COMMAND="$COMMAND \"${DESCRIPTION}\""
else
if [ x${MEASUREMENT_ARRAY_IN[0]} != "xunknown" ]; then
COMMAND="$COMMAND \"${DESCRIPTION_IN}\""
else
COMMAND="$COMMAND \"${DESCRIPTION_OUT}\""
fi
fi
COMMAND="$COMMAND \"${DESCRIPTION_IN[$I]}\""
echo "COMMAND: $COMMAND"
......@@ -436,4 +329,4 @@ for (( I=0 ; $I<$SUBJECT_LABEL_NO ; I++ )) ; do
# Go to next --time
done
# Go to next --subject_id or --label
# Go to next or --label
......@@ -57,7 +57,7 @@ double round(double x);
flow_t *flow[MAX_FLOWS];
int debug=0;
extern int daemonize=0;
extern int daemonize;
extern tracked_protocol_t tracked_protocols[];
extern protocol_t protocols[];
......@@ -106,7 +106,7 @@ int main(int argc, char *argv[])
/* Create first subject, scope, parameters and measurement so that they
can be filled-in by command-line options */
if ((configuration.subject=new_subject())==NULL) {
/* if ((configuration.subject=new_subject())==NULL) {
fprintf(stderr, "%s: new_subject() failed\n", __func__);
return -1;
}
......@@ -122,7 +122,7 @@ int main(int argc, char *argv[])
if ((configuration.measurement=new_measurement())==NULL) {
fprintf(stderr, "%s: new_measurement() failed\n", __func__);
return -1;
}
} */
/* Read command line */
......@@ -138,20 +138,6 @@ int main(int argc, char *argv[])
fprintf(stderr, "%s: read_conf_file() failed\n", __func__);
return -1;
}
if (read_const_conf_file(&configuration)<0) {
fprintf(stderr, "%s: read-const_conf_file() failed\n", __func__);
return -1;
}
}
/* Remaining command-line arguments should form a header filter string */
if (!configuration.global->conf_filename) {
if (read_header_filter(argc, argv,
&(configuration.parameters->header_filter))<0) {
fprintf(stderr, "%s: read_header_filter() failed\n", __func__);
return -1;
}
}
/* Fill-in local hostname */
......@@ -179,8 +165,8 @@ int main(int argc, char *argv[])
fprintf(stderr, "%s: continue_as_daemon() failed\n", __func__);
return -1;
}
printf("Continuing as daemon\n");
}
printf("Continuing as daemon\n");
/*
* Create RRD files
......@@ -191,68 +177,41 @@ int main(int argc, char *argv[])
measurement=configuration.measurement;
while (measurement) {
/* Go over all subjects */
i=0;
while (measurement->scope->subject[i] && i<MAX_SUBJECTS) {
char *hostname, *interface;
int port, parameters_id;
char *filename;
hostname = measurement->scope->subject[i]->hostname;
interface = measurement->scope->subject[i]->interface;
port = (measurement->scope->subject[i]->port)>=0?
measurement->scope->subject[i]->port:0;
parameters_id = measurement->parameters_id;
/* Go over all protocols */
int parameters_id;
char *filename;
j=0;
while (protocols[j].protocol) {
if ((filename=
abw_rrd_create_filename(hostname, interface, port,
parameters_id, protocols[j].protocol))==NULL) {
fprintf(stderr, "%s: rrd_create_filename() failed\n",
__func__);
return -1;
}
if (abw_rrd_create_file(filename)<0) {
fprintf(stderr, "%s: abw_rrd_create_file() failed\n", __func__);
return -1;
}
parameters_id = measurement->parameters_id;
j++;
} /* Go over all protocols */
/* Go over all protocols */
/* Go over all tracked protocols */
j=0;
while (tracked_protocols[j].protocol) {
if ((filename=
abw_rrd_create_filename(hostname, interface, port,
parameters_id, tracked_protocols[j].protocol))==NULL) {
fprintf(stderr, "%s: rrd_create_filename() failed\n",
__func__);
return -1;
}
j=0;
while (protocols[j].protocol) {
if ((filename=
abw_rrd_create_filename(measurement->scope,
parameters_id, protocols[j].protocol))==NULL) {
fprintf(stderr, "%s: rrd_create_filename() failed\n",
__func__);
return -1;
}
if (abw_rrd_create_file(filename)<0) {
fprintf(stderr, "%s: abw_rrd_create_file() failed\n", __func__);
return -1;
}
if (abw_rrd_create_file(filename)<0) {
fprintf(stderr, "%s: abw_rrd_create_file() failed\n", __func__);
return -1;
}
j++;
} /* Go over all tracked protocols */
j++;
} /* Go over all protocols */
/* Create RRD file for "all" protocol (all traffic together) */
/* Go over all tracked protocols */
j=0;
while (tracked_protocols[j].protocol) {
if ((filename=
abw_rrd_create_filename(hostname, interface, port,
parameters_id, "all"))==NULL) {
fprintf(stderr, "%s: rrd_create_filename() failed\n",
__func__);
return -1;
abw_rrd_create_filename(measurement->scope,
parameters_id, tracked_protocols[j].protocol))==NULL) {
fprintf(stderr, "%s: rrd_create_filename() failed\n",
__func__);
return -1;
}
if (abw_rrd_create_file(filename)<0) {
......@@ -260,8 +219,23 @@ int main(int argc, char *argv[])
return -1;
}
i++;
} /* Go over all subjects */
j++;
} /* Go over all tracked protocols */
/* Create RRD file for "all" protocol (all traffic together) */
if ((filename=
abw_rrd_create_filename(measurement->scope,
parameters_id, "all"))==NULL) {
fprintf(stderr, "%s: rrd_create_filename() failed\n",
__func__);
return -1;
}
if (abw_rrd_create_file(filename)<0) {
fprintf(stderr, "%s: abw_rrd_create_file() failed\n", __func__);
return -1;
}
measurement=measurement->next;
......@@ -283,6 +257,9 @@ int main(int argc, char *argv[])
i=0;
while (measurement->protocols_array[i] && i<MAX_PROTOCOLS) {
int parameters_id;
char *protocol;
/* Create data structure to maintain MAPI information */
if (flow_id>=MAX_FLOWS) {
......@@ -298,32 +275,16 @@ int main(int argc, char *argv[])
flow[flow_id]->measurement=measurement;
flow[flow_id]->protocol=measurement->protocols_array[i];
/* Go over all subjects */
j=0;
while (measurement->scope->subject[j] && j<MAX_SUBJECTS) {
char *hostname, *interface, *protocol;
int port, parameters_id;
hostname = measurement->scope->subject[j]->hostname;
interface = measurement->scope->subject[j]->interface;
port = (measurement->scope->subject[j]->port)>=0?
measurement->scope->subject[j]->port:0;
parameters_id = measurement->parameters_id;
protocol = measurement->protocols_array[i];
parameters_id = measurement->parameters_id;
protocol = measurement->protocols_array[i];
/* Create filename */
if ((flow[flow_id]->rrd_filename[j]=
abw_rrd_create_filename(hostname, interface, port,
parameters_id, protocol))==NULL) {
fprintf(stderr, "%s: rrd_create_filename() failed\n",
__func__);
return -1;
}
j++;
} /* Go over all subjects */
if ((flow[flow_id]->rrd_filename=
abw_rrd_create_filename(measurement->scope,
parameters_id, protocol))==NULL) {
fprintf(stderr, "%s: rrd_create_filename() failed\n",
__func__);