Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Added the --sshtrace command-line option that provides diagnostic output on the connection setup for all SSH sync traffic. Make the SSH connection setup pause waiting for responses, if the desired response is not obtained right away. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
00cf858afe7ab65ea4eaa578f6fedad2 |
| User & Date: | drh 2012-11-12 14:49:06.396 |
Context
|
2012-11-12
| ||
| 15:01 | Fix a link problem with the default skin and skin#5. ... (check-in: 62c565ec96 user: drh tags: trunk) | |
| 14:49 | Added the --sshtrace command-line option that provides diagnostic output on the connection setup for all SSH sync traffic. Make the SSH connection setup pause waiting for responses, if the desired response is not obtained right away. ... (check-in: 00cf858afe user: drh tags: trunk) | |
|
2012-11-11
| ||
| 22:42 | Further attempts to help the "ssh" sync protocol move past noisy motd comments and other extraneous login text, synchronize with the remote end, and start exchanging messages successfully. ... (check-in: 4473a27f3b user: drh tags: trunk) | |
Changes
Changes to src/http_transport.c.
| ︙ | ︙ | |||
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
** Default SSH command
*/
#ifdef __MINGW32__
static char zDefaultSshCmd[] = "ssh -T";
#else
static char zDefaultSshCmd[] = "ssh -e none -T";
#endif
/*
** Global initialization of the transport layer
*/
void transport_global_startup(void){
if( g.urlIsSsh ){
/* Only SSH requires a global initialization. For SSH we need to create
** and run an SSH command to talk to the remote machine.
*/
const char *zSsh; /* The base SSH command */
Blob zCmd; /* The SSH command */
char *zHost; /* The host name to contact */
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < < | 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
** Default SSH command
*/
#ifdef __MINGW32__
static char zDefaultSshCmd[] = "ssh -T";
#else
static char zDefaultSshCmd[] = "ssh -e none -T";
#endif
/*
** Bring up an SSH link. This involves sending some "echo" commands and
** get back appropriate responses. The point is to move past the MOTD and
** verify that the link is working.
*/
static void transport_ssh_startup(void){
char *zIn; /* An input line received back from remote */
int nWait; /* Number of times waiting for the MOTD */
unsigned iRandom; /* Random probe value */
char zProbe[30]; /* Text of the random probe */
int nProbe; /* Size of probe message */
int nIn; /* Size of input */
static const int nBuf = 10000; /* Size of input buffer */
zIn = fossil_malloc(nBuf);
sqlite3_randomness(sizeof(iRandom), &iRandom);
sqlite3_snprintf(sizeof(zProbe), zProbe, "probe-%08x", iRandom);
nProbe = (int)strlen(zProbe);
fprintf(sshOut, "echo %s\n", zProbe);
fflush(sshOut);
if( g.fSshTrace ){
printf("Sent: [echo %s]\n", zProbe);
fflush(stdout);
}
memset(zIn, '*', nProbe);
for(nWait=1; nWait<=10; nWait++){
sshin_read(zIn+nProbe, nBuf-nProbe);
if( g.fSshTrace ){
printf("Got back-----------------------------------------------\n"
"%s\n"
"-------------------------------------------------------\n",
zIn+nProbe);
}
if( strstr(zIn, zProbe) ) break;
sqlite3_sleep(100*nWait);
nIn = (int)strlen(zIn);
memcpy(zIn, zIn+(nIn-nProbe), nProbe);
if( g.fSshTrace ){
printf("Fetching more text. Looking for [%s]...\n", zProbe);
fflush(stdout);
}
}
sqlite3_randomness(sizeof(iRandom), &iRandom);
sqlite3_snprintf(sizeof(zProbe), zProbe, "probe-%08x", iRandom);
fprintf(sshOut, "echo %s\n", zProbe);
fflush(sshOut);
if( g.fSshTrace ){
printf("Sent: [echo %s]\n", zProbe);
fflush(stdout);
}
sshin_read(zIn, nBuf);
if( g.fSshTrace ){
printf("Got back-----------------------------------------------\n"
"%s\n"
"-------------------------------------------------------\n", zIn);
}
if( memcmp(zIn, zProbe, nProbe)!=0 ){
pclose2(sshIn, sshOut, sshPid);
fossil_fatal("ssh connection failed: [%s]", zIn);
}
fossil_free(zIn);
}
/*
** Global initialization of the transport layer
*/
void transport_global_startup(void){
if( g.urlIsSsh ){
/* Only SSH requires a global initialization. For SSH we need to create
** and run an SSH command to talk to the remote machine.
*/
const char *zSsh; /* The base SSH command */
Blob zCmd; /* The SSH command */
char *zHost; /* The host name to contact */
zSsh = db_get("ssh-command", zDefaultSshCmd);
blob_init(&zCmd, zSsh, -1);
if( g.urlPort!=g.urlDfltPort ){
#ifdef __MINGW32__
blob_appendf(&zCmd, " -P %d", g.urlPort);
#else
|
| ︙ | ︙ | |||
154 155 156 157 158 159 160 |
fossil_print(" %s\n", zHost); /* Show the conclusion of the SSH command */
free(zHost);
popen2(blob_str(&zCmd), &sshIn, &sshOut, &sshPid);
if( sshPid==0 ){
fossil_fatal("cannot start ssh tunnel using [%b]", &zCmd);
}
blob_reset(&zCmd);
| | < < < < < < < < < < < < < < < < < | 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
fossil_print(" %s\n", zHost); /* Show the conclusion of the SSH command */
free(zHost);
popen2(blob_str(&zCmd), &sshIn, &sshOut, &sshPid);
if( sshPid==0 ){
fossil_fatal("cannot start ssh tunnel using [%b]", &zCmd);
}
blob_reset(&zCmd);
transport_ssh_startup();
}
}
/*
** Open a connection to the server. The server is defined by the following
** global variables:
**
|
| ︙ | ︙ |
Changes to src/main.c.
| ︙ | ︙ | |||
127 128 129 130 131 132 133 134 135 136 137 138 139 140 | int minPrefix; /* Number of digits needed for a distinct UUID */ int fSqlTrace; /* True if --sqltrace flag is present */ int fSqlStats; /* True if --sqltrace or --sqlstats are present */ int fSqlPrint; /* True if -sqlprint flag is present */ int fQuiet; /* True if -quiet flag is present */ int fHttpTrace; /* Trace outbound HTTP requests */ int fSystemTrace; /* Trace calls to fossil_system(), --systemtrace */ int fNoSync; /* Do not do an autosync even. --nosync */ char *zPath; /* Name of webpage being served */ char *zExtra; /* Extra path information past the webpage name */ char *zBaseURL; /* Full text of the URL being served */ char *zTop; /* Parent directory of zPath */ const char *zContentType; /* The content type of the input HTTP request */ int iErrPriority; /* Priority of current error message */ | > | 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | int minPrefix; /* Number of digits needed for a distinct UUID */ int fSqlTrace; /* True if --sqltrace flag is present */ int fSqlStats; /* True if --sqltrace or --sqlstats are present */ int fSqlPrint; /* True if -sqlprint flag is present */ int fQuiet; /* True if -quiet flag is present */ int fHttpTrace; /* Trace outbound HTTP requests */ int fSystemTrace; /* Trace calls to fossil_system(), --systemtrace */ int fSshTrace; /* Trace the SSH setup traffic */ int fNoSync; /* Do not do an autosync even. --nosync */ char *zPath; /* Name of webpage being served */ char *zExtra; /* Extra path information past the webpage name */ char *zBaseURL; /* Full text of the URL being served */ char *zTop; /* Parent directory of zPath */ const char *zContentType; /* The content type of the input HTTP request */ int iErrPriority; /* Priority of current error message */ |
| ︙ | ︙ | |||
609 610 611 612 613 614 615 616 617 618 619 620 621 622 |
}else{
const char *zChdir = find_option("chdir",0,1);
g.isHTTP = 0;
g.fQuiet = find_option("quiet", 0, 0)!=0;
g.fSqlTrace = find_option("sqltrace", 0, 0)!=0;
g.fSqlStats = find_option("sqlstats", 0, 0)!=0;
g.fSystemTrace = find_option("systemtrace", 0, 0)!=0;
if( g.fSqlTrace ) g.fSqlStats = 1;
g.fSqlPrint = find_option("sqlprint", 0, 0)!=0;
g.fHttpTrace = find_option("httptrace", 0, 0)!=0;
g.zLogin = find_option("user", "U", 1);
g.zSSLIdentity = find_option("ssl-identity", 0, 1);
if( find_option("utc",0,0) ) g.fTimeFormat = 1;
if( find_option("localtime",0,0) ) g.fTimeFormat = 2;
| > | 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 |
}else{
const char *zChdir = find_option("chdir",0,1);
g.isHTTP = 0;
g.fQuiet = find_option("quiet", 0, 0)!=0;
g.fSqlTrace = find_option("sqltrace", 0, 0)!=0;
g.fSqlStats = find_option("sqlstats", 0, 0)!=0;
g.fSystemTrace = find_option("systemtrace", 0, 0)!=0;
g.fSshTrace = find_option("sshtrace", 0, 0)!=0;
if( g.fSqlTrace ) g.fSqlStats = 1;
g.fSqlPrint = find_option("sqlprint", 0, 0)!=0;
g.fHttpTrace = find_option("httptrace", 0, 0)!=0;
g.zLogin = find_option("user", "U", 1);
g.zSSLIdentity = find_option("ssl-identity", 0, 1);
if( find_option("utc",0,0) ) g.fTimeFormat = 1;
if( find_option("localtime",0,0) ) g.fTimeFormat = 2;
|
| ︙ | ︙ |