Skip to content

Commit

Permalink
newest version (untested yet)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jérémie Zarca authored and Jérémie Zarca committed May 4, 2017
1 parent 74f5105 commit 0c1d204
Show file tree
Hide file tree
Showing 8 changed files with 247 additions and 13 deletions.
36 changes: 36 additions & 0 deletions automated_install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,42 @@ cd $Wake_Word_Agent_Loc/tst && cmake . && make -j4
chown -R $User:$Group $Origin
chown -R $User:$Group /home/$User/.asoundrc

if [ "$Auto_Start_Enabled" = "true" ]; then
echo "========== Installing Autostart Scripts =========="
# generate run scripts in project folders
echo "Copying over start scripts into project folders"
printf "#!/bin/bash\ncd $Companion_Service_Loc\nnpm start > $Companion_Service_Loc/companion.log 2>&1\n" | tee $Companion_Service_Loc/companion.sh
printf "#!/bin/bash\ncd $Java_Client_Loc\nmvn exec:exec > $Java_Client_Loc/javaclient.log 2>&1\n" | tee $Java_Client_Loc/javaclient.sh
printf "#!/bin/bash\ncd $Wake_Word_Agent_Loc/src\n./wakeWordAgent -e sensory > $Wake_Word_Agent_Loc/src/wakeword.log 2>&1\n" | tee $Wake_Word_Agent_Loc/src/wakeword.sh
# make them executable
echo "Configuring file permissions for start scripts"
sudo chmod +x $Companion_Service_Loc/companion.sh
sudo chmod +x $Java_Client_Loc/javaclient.sh
sudo chmod +x $Wake_Word_Agent_Loc/src/wakeword.sh
sudo chmod +x $Wake_Word_Agent_Loc/src/renewLicense.sh

# create systemd services
echo "Generating systemd services..."
printf "[Unit]\nDescription=Alexa Companion Service\nAfter=multi-user.target\n\n[Service]\nUser=pi\nRestart=always\nExecStart=/bin/bash $Companion_Service_Loc/companion.sh\n\n[Install]\nWantedBy=multi-user.target\n" | sudo tee /lib/systemd/system/companion.service
printf "[Unit]\nDescription=Alexa Java Client\nAfter=multi-user.target\n\n[Service]\nUser=pi\nRestart=always\nExecStart=/bin/bash $Java_Client_Loc/javaclient.sh\n\n[Install]\nWantedBy=multi-user.target\n" | sudo tee /lib/systemd/system/javaclient.service
printf "[Unit]\nDescription=Alexa Wake Word Agent\nAfter=multi-user.target\n\n[Service]\nUser=pi\nRestart=always\nExecStart=/bin/bash $Wake_Word_Agent_Loc/src/wakeword.sh\n\n[Install]\nWantedBy=multi-user.target\n" | sudo tee /lib/systemd/system/wakeword.service
echo "Configurung file permissions for services"
sudo chmod 644 /lib/systemd/system/companion.service
sudo chmod 644 /lib/systemd/system/javaclient.service
sudo chmod 644 /lib/systemd/system/wakeword.service
echo "Reloading systemd..."
sudo systemctl daemon-reload
echo "Enabling services..."
sudo systemctl enable companion.service
sudo systemctl enable javaclient.service

cd $Java_Client_Loc
wget https://github.com/mozilla/geckodriver/releases/download/v0.16.1/geckodriver-v0.16.1-arm7hf.tar.gz
tar -xvzf geckodriver-v0.16.1-arm7hf.tar.gz
# Copy geckodriver to /usr/local/bin
sudo cp $Java_Client_Loc/geckodriver /usr/local/bin/
export PATH=$PATH:/usr/local/bin/geckodriver

echo ""
echo '============================='
echo '*****************************'
Expand Down
5 changes: 4 additions & 1 deletion samples/javaclient/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,8 @@
"sslClientKeyStore":"",
"sslClientKeyStorePassphrase":"",
"sslCaCert":""
}
},
"autoLoginEnabled":false,
"autoLoginUsername":"",
"autoLoginPassword":""
}
10 changes: 10 additions & 0 deletions samples/javaclient/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,16 @@
<log4j.version>2.3</log4j.version>
</properties>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>htmlunit-driver</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
Expand Down
10 changes: 10 additions & 0 deletions samples/javaclient/pom_pi.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,16 @@
<log4j.version>2.3</log4j.version>
</properties>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>htmlunit-driver</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package com.amazon.alexa.avs;

import com.amazon.alexa.avs.config.DeviceConfig;

import org.apache.commons.logging.LogFactory;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.StaleElementReferenceException;
import com.gargoylesoftware.htmlunit.BrowserVersion;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.*;


/**
* Automatically authenticate with Amazon
*/
public class AutoLogin {

private String autoLoginUsername;
private String autoLoginPassword;

private static final int TIMEOUT = 10;

/**
* @param deviceConfig
*/
public AutoLogin(DeviceConfig deviceConfig) {
autoLoginUsername = deviceConfig.getAutoLoginUsername();
autoLoginPassword = deviceConfig.getAutoLoginPassword();
}

/**
* @param url
*/
public void login(String url) {
//prevent htmlunit client logging as it prints a lot of CSS warnings
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");

Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF);
Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF);

HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.CHROME);
//WebDriver driver = new ChromeDriver();

driver.get(url);

if (autoLoginUsername == null || autoLoginUsername.isEmpty()) {
System.out.print("Please enter your e-mail: ");
if (System.console() != null) {
autoLoginUsername = System.console().readLine();
} else {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
autoLoginUsername = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}

if (autoLoginPassword == null || autoLoginPassword.isEmpty()) {
System.out.print("Please enter your password: ");
if (System.console() != null) {
char[] passwordChars = System.console().readPassword();
autoLoginPassword = new String(passwordChars);
} else {
System.out.print("\rPlease enter your password (password is visible): ");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
autoLoginPassword = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}

WebElement emailBox = driver.findElement(By.id("ap_email"));
//emailBox.click();
emailBox.sendKeys(autoLoginUsername);

WebElement passwordBox = driver.findElement(By.id("ap_password"));
passwordBox.sendKeys(autoLoginPassword);

driver.setJavascriptEnabled(true);
passwordBox.submit();

// wait for page to load
try {
(new WebDriverWait(driver, TIMEOUT)).until(stalenessOf(passwordBox));
} catch (Exception e) {
e.printStackTrace();
}

//this somehow causes the login to time out?
/*try {
WebElement okayButton = driver.findElement(By.className("signin-button-text"));
okayButton.click();
(new WebDriverWait(driver, TIMEOUT)).until(stalenessOf(okayButton));
} catch (Exception e) {
e.printStackTrace();
}*/

driver.close();
}

private ExpectedCondition<Boolean> stalenessOf(final WebElement element) {
return new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver ignored) {
try {
element.isEnabled();
return false;
} catch (StaleElementReferenceException expected) {
return true;
}
}
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,24 +38,26 @@ public void displayRegCode(String regCode) {
String regUrl =
deviceConfig.getCompanionServiceInfo().getServiceUrl() + "/provision/" + regCode;
if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
int selected = dialogFactory.showYesNoDialog(title,
/* int selected = dialogFactory.showYesNoDialog(title,
"Please register your device by visiting the following URL in "
+ "a web browser and follow the instructions:\n" + regUrl
+ "\n\n Would you like to open the URL automatically in your default browser?");
if (selected == JOptionPane.YES_OPTION) {
//if (selected == JOptionPane.YES_OPTION) {*/
try {
Desktop.getDesktop().browse(new URI(regUrl));
AutoLogin autoLogin = new AutoLogin(deviceConfig);
autoLogin.login(regUrl);
} catch (Exception e) {
// Ignore and proceed
}
title = "Click OK after Registering/Authenticating Device";
dialogFactory.showInformationalDialog(title,
/*dialogFactory.showInformationalDialog(title,
"If a browser window did not open, please copy and paste the below URL into a "
+ "web browser, and follow the instructions:\n" + regUrl
+ "\n\n Click the OK button when finished.");
} else {
handleAuthenticationCopyToClipboard(title, regUrl);
}
+ "\n\n Click the OK button when finished.");*/
//} else {
// handleAuthenticationCopyToClipboard(title, regUrl);
//}
} else {
handleAuthenticationCopyToClipboard(title, regUrl);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ public class DeviceConfig {
public static final String AVS_HOST = "avsHost";
public static final String WAKE_WORD_AGENT_ENABLED = "wakeWordAgentEnabled";
public static final String LOCALE = "locale";
public static final String AUTO_LOGIN_ENABLED = "autoLoginEnabled";
public static final String AUTO_LOGIN_USERNAME = "autoLoginUsername";
public static final String AUTO_LOGIN_PASSWORD = "autoLoginPassword";

/*
* Required parameters from the config file.
Expand All @@ -63,6 +66,9 @@ public class DeviceConfig {
private CompanionAppInformation companionAppInfo;
private CompanionServiceInformation companionServiceInfo;
private boolean wakeWordAgentEnabled;
private boolean autoLoginEnabled;
private String autoLoginUsername;
private String autoLoginPassword;

@SuppressWarnings("javadoc")
public enum ProvisioningMethod {
Expand Down Expand Up @@ -110,11 +116,19 @@ public static ProvisioningMethod fromString(String method) {
* The information necessary for the Companion Service method of provisioning.
* @param avsHost
* (optional) AVS host override
* @param autoLoginEnabled
* Whether auto login functionality is enabled.
*
* @param autoLoginUsername
* The username used for auto login
*
* @param autoLoginPassword
* The password used for auto login
*/
public DeviceConfig(String productId, String dsn, String provisioningMethod,
boolean wakeWordAgentEnabled, String languageTag,
CompanionAppInformation companionAppInfo,
CompanionServiceInformation companionServiceInfo, String avsHost) {
CompanionServiceInformation companionServiceInfo, String avsHost, boolean autoLoginEnabled, String autoLoginUsername, String autoLoginPassword) {

if (StringUtils.isBlank(productId)) {
throw new MalformedConfigException(PRODUCT_ID + " is blank in your config file.");
Expand Down Expand Up @@ -171,14 +185,18 @@ public DeviceConfig(String productId, String dsn, String provisioningMethod,
}

this.wakeWordAgentEnabled = wakeWordAgentEnabled;

this.autoLoginEnabled = autoLoginEnabled;
this.autoLoginUsername = autoLoginUsername;
this.autoLoginPassword = autoLoginPassword;
}

public DeviceConfig(String productId, String dsn, String provisioningMethod,
boolean wakeWordAgentEnabled, String languageTag,
CompanionAppInformation companionAppInfo,
CompanionServiceInformation companionServiceInfo) {
CompanionServiceInformation companionServiceInfo, boolean autoLoginEnabled, String autoLoginUsername, String autoLoginPassword) {
this(productId, dsn, provisioningMethod, wakeWordAgentEnabled, languageTag,
companionAppInfo, companionServiceInfo, DEFAULT_HOST);
companionAppInfo, companionServiceInfo, DEFAULT_HOST, autoLoginEnabled, autoLoginUsername, autoLoginPassword);
}

/**
Expand Down Expand Up @@ -214,6 +232,27 @@ public String getDsn() {
return dsn;
}

/**
* @return autoLoginEnabled.
*/
public boolean isAutoLoginEnabled() {
return autoLoginEnabled;
}

/**
* @return autoLoginUsername.
*/
public String getAutoLoginUsername() {
return autoLoginUsername;
}

/**
* @return autoLoginPassword.
*/
public String getAutoLoginPassword() {
return autoLoginPassword;
}

/**
* @return provisioningMethod.
*/
Expand Down Expand Up @@ -307,7 +346,10 @@ public JsonObject toJson() {
.add(PROVISIONING_METHOD, provisioningMethod.toString())
.add(WAKE_WORD_AGENT_ENABLED, wakeWordAgentEnabled)
.add(LOCALE, locale.toLanguageTag())
.add(AVS_HOST, avsHost.toString());
.add(AVS_HOST, avsHost.toString())
.add(AUTO_LOGIN_ENABLED, autoLoginEnabled)
.add(AUTO_LOGIN_USERNAME, autoLoginUsername)
.add(AUTO_LOGIN_PASSWORD, autoLoginPassword);

if (companionAppInfo != null) {
builder.add(COMPANION_APP, companionAppInfo.toJson());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,12 @@ public static DeviceConfig readConfigFile(String filename) {
boolean wakeWordAgentEnabled = configObject.getBoolean(DeviceConfig.WAKE_WORD_AGENT_ENABLED, false);
String locale = configObject.getString(DeviceConfig.LOCALE, null);

boolean autoLoginEnabled = configObject.getBoolean(DeviceConfig.AUTO_LOGIN_ENABLED, false);
String autoLoginUsername = configObject.getString(DeviceConfig.AUTO_LOGIN_USERNAME, "");
String autoLoginPassword = configObject.getString(DeviceConfig.AUTO_LOGIN_PASSWORD, "");

DeviceConfig deviceConfig = new DeviceConfig(productId, dsn, provisioningMethod,
wakeWordAgentEnabled, locale, companionAppInfo, companionServiceInfo, avsHost);
wakeWordAgentEnabled, locale, companionAppInfo, companionServiceInfo, avsHost, autoLoginEnabled, autoLoginUsername, autoLoginPassword);

return deviceConfig;
} catch (FileNotFoundException e) {
Expand Down

0 comments on commit 0c1d204

Please sign in to comment.