Newer
Older
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
return 0;
}
static int ast_el_add_history(char *buf)
{
HistEvent ev;
if (el_hist == NULL || el == NULL)
ast_el_initialize();
return (history(el_hist, &ev, H_ENTER, buf));
}
static int ast_el_write_history(char *filename)
{
HistEvent ev;
if (el_hist == NULL || el == NULL)
ast_el_initialize();
return (history(el_hist, &ev, H_SAVE, filename));
}
static int ast_el_read_history(char *filename)
{
char buf[256];
FILE *f;
int ret = -1;
if (el_hist == NULL || el == NULL)
ast_el_initialize();
if ((f = fopen(filename, "r")) == NULL)
return ret;
while (!feof(f)) {
fgets(buf, sizeof(buf), f);
if (!strcmp(buf, "_HiStOrY_V2_\n"))
continue;
if ((ret = ast_el_add_history(buf)) == -1)
break;
}
fclose(f);
return ret;
}
static void ast_remotecontrol(char * data)
{
char buf[80];
int res;
char filename[80] = "";
char *hostname;
char *cpid;
char *version;
int pid;
char tmp[80];
char *stringp=NULL;
char *ebuf;
int num = 0;
if (data)
write(ast_consock, data, strlen(data) + 1);
stringp=buf;
hostname = strsep(&stringp, "/");
cpid = strsep(&stringp, "/");
if (!version)
version = "<Version Unknown>";
if (cpid)
pid = atoi(cpid);
else
pid = -1;
snprintf(tmp, sizeof(tmp), "set verbose atleast %d", option_verbose);
fdprint(ast_consock, tmp);
ast_verbose("Connected to Asterisk %s currently running on %s (pid = %d)\n", version, hostname, pid);
if (getenv("HOME"))
snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME"));
if (el_hist == NULL || el == NULL)
ast_el_initialize();
el_set(el, EL_GETCFN, ast_el_read_char);
#if 0
ast_cli_register(&astshutdown);
#endif
if (option_exec && data) { /* hack to print output then exit if asterisk -rx is used */
char tempchar;
ast_el_read_char(el, &tempchar);
return;
}
ebuf = (char *)el_gets(el, &num);
if (ebuf && strlen(ebuf)) {
if (ebuf[strlen(ebuf)-1] == '\n')
ebuf[strlen(ebuf)-1] = '\0';
if (!remoteconsolehandler(ebuf)) {
res = write(ast_consock, ebuf, strlen(ebuf) + 1);
if (res < 1) {
ast_log(LOG_WARNING, "Unable to write: %s\n", strerror(errno));
break;
}
}
}
}
printf("\nDisconnected from Asterisk server\n");
}
printf("Asterisk " ASTERISK_VERSION ", Copyright (C) 2000-2002, Digium.\n");
printf("Usage: asterisk [OPTIONS]\n");
printf("Valid Options:\n");
printf(" -h This help screen\n");
printf(" -r Connect to Asterisk on this machine\n");
printf(" -f Do not fork\n");
printf(" -n Disable console colorization\n");
printf(" -p Run as pseudo-realtime thread\n");
printf(" -v Increase verbosity (multiple v's = more verbose)\n");
printf(" -q Quiet mode (supress output)\n");
printf(" -x <cmd> Execute command <cmd> (only valid with -r)\n");
printf(" -i Initializie crypto keys at startup\n");
printf(" -c Provide console CLI\n");
printf(" -d Enable extra debugging\n");
printf("\n");
return 0;
}
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
struct ast_config *cfg;
struct ast_variable *v;
char *config = ASTCONFPATH;
if (option_overrideconfig == 1) {
cfg = ast_load((char *)ast_config_AST_CONFIG_FILE);
} else {
cfg = ast_load(config);
}
/* init with buildtime config */
strncpy((char *)ast_config_AST_CONFIG_DIR,AST_CONFIG_DIR,sizeof(ast_config_AST_CONFIG_DIR)-1);
strncpy((char *)ast_config_AST_SPOOL_DIR,AST_SPOOL_DIR,sizeof(ast_config_AST_SPOOL_DIR)-1);
strncpy((char *)ast_config_AST_MODULE_DIR,AST_MODULE_DIR,sizeof(ast_config_AST_VAR_DIR)-1);
strncpy((char *)ast_config_AST_VAR_DIR,AST_VAR_DIR,sizeof(ast_config_AST_VAR_DIR)-1);
strncpy((char *)ast_config_AST_LOG_DIR,AST_LOG_DIR,sizeof(ast_config_AST_LOG_DIR)-1);
strncpy((char *)ast_config_AST_AGI_DIR,AST_AGI_DIR,sizeof(ast_config_AST_AGI_DIR)-1);
strncpy((char *)ast_config_AST_DB,AST_DB,sizeof(ast_config_AST_DB)-1);
strncpy((char *)ast_config_AST_KEY_DIR,AST_KEY_DIR,sizeof(ast_config_AST_KEY_DIR)-1);
strncpy((char *)ast_config_AST_PID,AST_PID,sizeof(ast_config_AST_PID)-1);
strncpy((char *)ast_config_AST_SOCKET,AST_SOCKET,sizeof(ast_config_AST_SOCKET)-1);
strncpy((char *)ast_config_AST_RUN_DIR,AST_RUN_DIR,sizeof(ast_config_AST_RUN_DIR)-1);
/* no asterisk.conf? no problem, use buildtime config! */
if (!cfg) {
return;
}
v = ast_variable_browse(cfg, "directories");
while(v) {
if (!strcasecmp(v->name, "astetcdir")) {
strncpy((char *)ast_config_AST_CONFIG_DIR,v->value,sizeof(ast_config_AST_CONFIG_DIR)-1);
} else if (!strcasecmp(v->name, "astspooldir")) {
strncpy((char *)ast_config_AST_SPOOL_DIR,v->value,sizeof(ast_config_AST_SPOOL_DIR)-1);
} else if (!strcasecmp(v->name, "astvarlibdir")) {
strncpy((char *)ast_config_AST_VAR_DIR,v->value,sizeof(ast_config_AST_VAR_DIR)-1);
snprintf((char *)ast_config_AST_DB,sizeof(ast_config_AST_DB)-1,"%s/%s",v->value,"astdb");
} else if (!strcasecmp(v->name, "astlogdir")) {
strncpy((char *)ast_config_AST_LOG_DIR,v->value,sizeof(ast_config_AST_LOG_DIR)-1);
} else if (!strcasecmp(v->name, "astagidir")) {
strncpy((char *)ast_config_AST_AGI_DIR,v->value,sizeof(ast_config_AST_AGI_DIR)-1);
} else if (!strcasecmp(v->name, "astrundir")) {
snprintf((char *)ast_config_AST_PID,sizeof(ast_config_AST_PID)-1,"%s/%s",v->value,"asterisk.pid");
snprintf((char *)ast_config_AST_SOCKET,sizeof(ast_config_AST_SOCKET)-1,"%s/%s",v->value,"asterisk.ctl");
strncpy((char *)ast_config_AST_RUN_DIR,v->value,sizeof(ast_config_AST_RUN_DIR)-1);
} else if (!strcasecmp(v->name, "astmoddir")) {
strncpy((char *)ast_config_AST_MODULE_DIR,v->value,sizeof(ast_config_AST_MODULE_DIR)-1);
}
v = v->next;
}
ast_destroy(cfg);
}
int main(int argc, char *argv[])
{
char c;
/* Remember original args for restart */
if (argc > sizeof(_argv) / sizeof(_argv[0]) - 1) {
fprintf(stderr, "Truncating argument size to %d\n", sizeof(_argv) / sizeof(_argv[0]) - 1);
argc = sizeof(_argv) / sizeof(_argv[0]) - 1;
}
for (x=0;x<argc;x++)
_argv[x] = argv[x];
_argv[x] = NULL;
strncpy(hostname, "<Unknown>", sizeof(hostname)-1);
if (getenv("HOME"))
snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME"));
if (geteuid()) {
ast_log(LOG_ERROR, "Must be run as root\n");
exit(1);
}
while((c=getopt(argc, argv, "hfdvqprgcinx:C:")) != EOF) {
switch(c) {
case 'd':
option_debug++;
option_nofork++;
case 'c':
option_console++;
option_nofork++;
case 'r':
option_remote++;
option_nofork++;
break;
break;
case 'q':
option_quiet++;
break;
case 'x':
option_exec++;
xarg = optarg;
break;
case 'C':
strncpy((char *)ast_config_AST_CONFIG_FILE,optarg,sizeof(ast_config_AST_CONFIG_FILE));
option_overrideconfig++;
break;
if (option_dumpcore) {
struct rlimit l;
memset(&l, 0, sizeof(l));
l.rlim_cur = RLIM_INFINITY;
l.rlim_max = RLIM_INFINITY;
if (setrlimit(RLIMIT_CORE, &l)) {
ast_log(LOG_WARNING, "Unable to disable core size resource limit: %s\n", strerror(errno));
}
}
term_init();
printf(term_end());
fflush(stdout);
if (option_console && !option_verbose)
ast_verbose("[ Reading Master Configuration ]");
ast_readconfig();
if (option_console) {
if (el_hist == NULL || el == NULL)
ast_el_initialize();
if (strlen(filename))
ast_el_read_history(filename);
}
if (ast_tryconnect()) {
/* One is already running */
if (option_remote) {
if (option_exec) {
ast_remotecontrol(xarg);
ast_register_verbose(console_verboser);
ast_verbose( "Asterisk " ASTERISK_VERSION ", Copyright (C) 1999-2001 Linux Support Services, Inc.\n");
ast_verbose( "Written by Mark Spencer <markster@linux-support.net>\n");
ast_verbose( "=========================================================================\n");
ast_remotecontrol(NULL);
ast_log(LOG_ERROR, "Asterisk already running on %s. Use 'asterisk -r' to connect.\n", (char *)ast_config_AST_SOCKET);
exit(1);
}
} else if (option_remote || option_exec) {
ast_log(LOG_ERROR, "Unable to connect to remote asterisk\n");
/* Blindly write pid file since we couldn't connect */
unlink((char *)ast_config_AST_PID);
f = fopen((char *)ast_config_AST_PID, "w");
if (f) {
fprintf(f, "%d\n", getpid());
fclose(f);
} else
ast_log(LOG_WARNING, "Unable to open pid file '%s': %s\n", (char *)ast_config_AST_PID, strerror(errno));
if (!option_verbose && !option_debug && !option_nofork && !option_console) {
pid = fork();
if (pid < 0) {
ast_log(LOG_ERROR, "Unable to fork(): %s\n", strerror(errno));
ast_makesocket();
sigemptyset(&sigs);
sigaddset(&sigs, SIGHUP);
sigaddset(&sigs, SIGTERM);
sigaddset(&sigs, SIGINT);
sigaddset(&sigs, SIGPIPE);
sigaddset(&sigs, SIGWINCH);
pthread_sigmask(SIG_BLOCK, &sigs, NULL);
if (option_console || option_verbose || option_remote)
ast_register_verbose(console_verboser);
ast_verbose( "Asterisk " ASTERISK_VERSION ", Copyright (C) 1999-2001 Linux Support Services, Inc.\n");
ast_verbose( "Written by Mark Spencer <markster@linux-support.net>\n");
ast_verbose( "=========================================================================\n");
}
if (option_console && !option_verbose)
ast_verbose("[ Booting...");
signal(SIGINT, __quit_handler);
signal(SIGTERM, __quit_handler);
signal(SIGCHLD, child_handler);
signal(SIGPIPE, SIG_IGN);
if (set_priority(option_highpriority)) {
printf(term_quit());
}
if (init_logger()) {
printf(term_quit());
if (init_manager()) {
printf(term_quit());
exit(1);
}
if (ast_image_init()) {
printf(term_quit());
}
if (load_pbx()) {
printf(term_quit());
}
if (load_modules()) {
printf(term_quit());
}
if (init_framer()) {
printf(term_quit());
if (astdb_init()) {
printf(term_quit());
exit(1);
}
if (ast_enum_init()) {
printf(term_quit());
exit(1);
}
/* We might have the option of showing a console, but for now just
do nothing... */
if (option_console && !option_verbose)
ast_verbose(" ]\n");
if (option_verbose || option_console)
ast_verbose(term_color(tmp, "Asterisk Ready.\n", COLOR_BRWHITE, COLOR_BLACK, sizeof(tmp)));
Mark Spencer
committed
#ifdef __AST_DEBUG_MALLOC
__ast_mm_init();
#endif
ast_cli_register(&astshutdownnow);
ast_cli_register(&astshutdowngracefully);
ast_cli_register(&astrestartnow);
ast_cli_register(&astrestartgracefully);
ast_cli_register(&astrestartwhenconvenient);
if (option_console) {
/* Console stuff now... */
/* Register our quit function */
snprintf(title, sizeof(title), "Asterisk Console on '%s' (pid %d)", hostname, mainpid);
for (;;) {
buf = (char *)el_gets(el, &num);
if (buf) {
if (buf[strlen(buf)-1] == '\n')
buf[strlen(buf)-1] = '\0';
consolehandler((char *)buf);
} else {
if (option_remote)
ast_cli(STDOUT_FILENO, "\nUse EXIT or QUIT to exit the asterisk console\n");
else
ast_cli(STDOUT_FILENO, "\nUse STOP NOW to shutdown Asterisk\n");
}