Ngrok initialization and other startup stuff.

This commit is contained in:
Rodrigo Rodriguez (pragmatismo.io) 2018-10-28 21:56:51 -03:00
parent d3e82b5806
commit 028a4455ea
7 changed files with 1550 additions and 117 deletions

View file

@ -43,7 +43,7 @@ export class GBAdminService {
static masterBotInstanceId = 0;
public static StrongRegex = new RegExp(
"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})"
"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*\+_\-])(?=.{8,})"
);
core: IGBCoreService;

View file

@ -255,22 +255,22 @@ export class AzureDeployerService extends GBService {
let retriveUsername = () => {
if (!username) {
process.stdout.write("CLOUD_USERNAME:");
username = scanf("%s");
username = scanf("%s").replace(/(\n|\r)+$/, "");
}
};
let retrivePassword = () => {
if (!password) {
process.stdout.write("CLOUD_PASSWORD:");
password = scanf("%s");
password = scanf("%s").replace(/(\n|\r)+$/, "");
}
};
let retrieveBotId = () => {
if (!botId) {
process.stdout.write(
"Bot Id must only contain lowercase letters, digits or dashes, cannot start or end with or contain consecutive dashes and is limited to 60 characters.\n"
"Bot Id must only contain lowercase letters, digits or dashes, cannot start or end with or contain consecutive dashes and is limited from 4 to 42 characters long.\n"
);
process.stdout.write("BOT_ID:");
botId = scanf("%s");
botId = scanf("%s").replace(/(\n|\r)+$/, "");
}
};
let authoringKey = GBConfigService.get("NLP_AUTHORING_KEY");
@ -280,7 +280,7 @@ export class AzureDeployerService extends GBService {
"Due to this opened issue: https://github.com/Microsoft/botbuilder-tools/issues/550\n"
);
process.stdout.write("Please enter your LUIS Authoring Key:");
authoringKey = scanf("%s");
authoringKey = scanf("%s").replace(/(\n|\r)+$/, "");
}
};
while (!authoringKey) {
@ -326,7 +326,7 @@ export class AzureDeployerService extends GBService {
}
let retriveLocation = () => {
if (!location) {
process.stdout.write("CLOUD_LOCATION:");
process.stdout.write("CLOUD_LOCATION (eg. 'westus'):");
location = scanf("%s");
}
};
@ -373,8 +373,8 @@ export class AzureDeployerService extends GBService {
subscriptionId,
appId
) {
await this.internalDeployBot(
instance,
await this.internalDeployBot(
instance,
this.accessToken,
botId,
botId,
@ -433,7 +433,8 @@ export class AzureDeployerService extends GBService {
/**
* @see https://github.com/Azure/azure-rest-api-specs/blob/master/specification/botservice/resource-manager/Microsoft.BotService/preview/2017-12-01/botservice.json
*/
private async internalDeployBot(instance,
private async internalDeployBot(
instance,
accessToken,
botId,
name,
@ -480,38 +481,90 @@ export class AzureDeployerService extends GBService {
let req = this.createRequestObject(
url,
accessToken,
"PUT",
JSON.stringify(parameters)
);
let res = await httpClient.sendRequest(req);
if (!(res.bodyAsJson as any).id) {
reject(res.bodyAsText);
return;
}
logger.info(`Bot creation request done waiting for key generation...`);
setTimeout(async () => {
query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/Microsoft.BotService/botServices/${botId}/channels/WebChatChannel/listChannelWithKeys?api-version=${
AzureDeployerService.apiVersion
}`;
url = UrlJoin(baseUrl, query);
req = this.createRequestObject(
url,
accessToken,
JSON.stringify(parameters)
);
let resChannel = await httpClient.sendRequest(req);
try {
query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/Microsoft.BotService/botServices/${botId}/channels/WebChatChannel/listChannelWithKeys?api-version=${
AzureDeployerService.apiVersion
}`;
url = UrlJoin(baseUrl, query);
req = this.createRequestObject(
url,
accessToken,
"PUT",
JSON.stringify(parameters)
);
let resChannel = await httpClient.sendRequest(req);
console.log(resChannel.bodyAsText);
let key = (resChannel.bodyAsJson as any).properties.properties.sites[0]
.key;
console.log(resChannel.bodyAsText);
let key = (resChannel.bodyAsJson as any).properties.properties
.sites[0].key;
instance.marketplacePassword = appPassword
instance.webchatKey = key
instance.marketplacePassword = appPassword;
instance.webchatKey = key;
resolve(instance)
}, 10000);
resolve(instance);
} catch (error) {
reject(error);
}
}, 20000);
});
}
private createRequestObject(url: string, accessToken: string, body) {
public async updateBotProxy(botId, group, endpoint) {
let baseUrl = `https://management.azure.com/`;
let username = GBConfigService.get("CLOUD_USERNAME");
let password = GBConfigService.get("CLOUD_PASSWORD");
let subscriptionId = GBConfigService.get("CLOUD_SUBSCRIPTIONID");
let credentials = await msRestAzure.loginWithUsernamePassword(
username,
password
);
let parameters = {
properties: {
endpoint: endpoint
}
};
let accessToken = credentials.tokenCache._entries[0].accessToken;
let httpClient = new ServiceClient();
let query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${
this.provider
}/botServices/${botId}?api-version=${AzureDeployerService.apiVersion}`;
let url = UrlJoin(baseUrl, query);
let req = this.createRequestObject(
url,
accessToken,
"PATCH",
JSON.stringify(parameters)
);
let res = await httpClient.sendRequest(req);
if (!(res.bodyAsJson as any).id) {
throw res.bodyAsText;
}
logger.info(`Bot proxy updated at: ${endpoint}.`);
}
private createRequestObject(
url: string,
accessToken: string,
verb: HttpMethods,
body: string
) {
let req = new WebResource();
req.method = "PUT";
req.method = verb;
req.url = url;
req.headers = {};
req.headers["Content-Type"] = "application/json";
@ -750,7 +803,7 @@ export class AzureDeployerService extends GBService {
maximumLength: 14
};
let password = passwordGenerator.generatePassword(options);
password = password.replace("=", "");
password = password.replace(/[=:;\?]/g, "");
return password;
}

View file

@ -306,8 +306,8 @@ export class GBCoreService implements IGBCoreService {
`STORAGE_SERVER=${instance.storageServer}.database.windows.net\n` +
`STORAGE_NAME=${instance.storageName}\n` +
`STORAGE_USERNAME=${instance.storageUsername}\n` +
`STORAGE_PASSWORD=${instance.storagePassword}\n`+
`STORAGE_SYNC=true\n`+
`STORAGE_PASSWORD=${instance.storagePassword}\n` +
`STORAGE_SYNC=true\n` +
`CLOUD_USERNAME=${instance.cloudUsername}\n` +
`CLOUD_PASSWORD=${instance.cloudPassword}\n` +
`CLOUD_SUBSCRIPTIONID=${instance.cloudSubscriptionId}\n` +
@ -318,47 +318,9 @@ export class GBCoreService implements IGBCoreService {
fs.writeFileSync(".env", env);
}
public async ensureProxy(): Promise<string> {
public async ensureProxy(port): Promise<string> {
let proxyAddress: string;
const ngrok = require("ngrok");
return await ngrok.connect();
// let expiresOn = new Date(
// await this.adminService.getValue(0, "proxyExpiresOn")
// );
// let proxyAddress;
// if (expiresOn.getTime() > new Date().getTime()) {
// proxyAddress = await this.adminService.getValue(
// GBAdminService.masterBotInstanceId,
// "proxyAddress"
// );
// return Promise.resolve(proxyAddress);
// } else {
// if (await processExists("ngrok.exe")) {
// logger.warn("ngrok is already running.");
// } else {
// const { exec } = require("child_process");
// const child = exec(
// "node_modules\\ngrok\\bin\\ngrok http 4242",
// (error, stdout, stderr) => {
// console.log(`child stdout:\n${stdout}`);
// }
// );
// }
// await this.adminService.setValue(
// GBAdminService.masterBotInstanceId,
// "proxyAddress",
// proxyAddress
// );
// let now = new Date();
// let expiresOn = now.setHours(now.getHours());
// await this.adminService.setValue(
// GBAdminService.masterBotInstanceId,
// "proxyExpiresOn",
// expiresOn.toString()
// );
return Promise.resolve(proxyAddress);
// }
return await ngrok.connect({port:port});
}
}

View file

@ -217,7 +217,7 @@ export class GBDeployer {
.done(function(result) {
if (botPackages.length === 0) {
logger.warn(
"The server is running with no bot instances, at least one .gbot file must be deployed."
"No external packages to load, please use ADDITIONAL_DEPLOY_PATH to point to a .gbai package folder."
);
} else {
logger.info(`Package deployment done.`);

View file

@ -307,8 +307,6 @@ export class GBMinService {
const storage = new MemoryStorage();
const conversationState = new ConversationState(storage);
const userState = new UserState(storage);
//const botState = new BotState(storage);
// TODO: adapter.use();
// The minimal bot is built here.

1466
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -96,17 +96,20 @@ export class GBServer {
// Ensures cloud / on-premises infrastructure is setup.
logger.info(`Establishing a development local proxy...`);
let proxyAddress = await core.ensureProxy();
let proxyAddress = await core.ensureProxy(port);
let azureDeployer = new AzureDeployerService();
try {
await core.initDatabase();
} catch (error) {
logger.info(`Deploying cognitive infrastructure...`);
try {
let azureDeployer = new AzureDeployerService();
bootInstance = await azureDeployer.deployFarm(proxyAddress);
} catch (error) {
logger.warn("Error while deploying to the cloud, please, cleanup any objects created before running again.")
logger.warn(
"Error while deploying to the cloud, please, cleanup any objects created before running again."
);
throw error;
}
core.writeEnv(bootInstance);
@ -153,14 +156,23 @@ export class GBServer {
let instances: GuaribasInstance[];
try {
instances = await core.loadInstances();
let instance = instances[0];
if (process.env.NODE_ENV === "development") {
logger.info(`Updating bots proxies...`);
await azureDeployer.updateBotProxy(
instance.botId,
instance.botId,
`${proxyAddress}/api/messages/${instance.botId}`
);
}
} catch (error) {
if (error.parent.code === "ELOGIN") {
let azureDeployer = new AzureDeployerService();
let group = GBConfigService.get("CLOUD_GROUP")
let serverName = GBConfigService.get("STORAGE_SERVER").split(".database.windows.net")[0]
await azureDeployer.openStorageFirewall(group,serverName )
let group = GBConfigService.get("CLOUD_GROUP");
let serverName = GBConfigService.get("STORAGE_SERVER").split(
".database.windows.net"
)[0];
await azureDeployer.openStorageFirewall(group, serverName);
} else {
// Check if storage is empty and needs formatting.