TimeAdjusterMain.bat
@echo off
rem ------------------------------------------------
rem ---Zeitanpassungsstapel
rem ------------------------------------------------
rem --Basierend auf dem aktuellen Verzeichnis
cd /d %~dp0
echo ****Startzeiteinstellung: %date% %time%
rem --Überprüfen Sie das Argument(Fügen Sie xx hinzu, um zu verhindern, dass es leer wird)
if xx%1==xx goto confirmPw
goto setPw
:confirmPw
rem --Geben Sie das Administratorkennwort ein, wenn kein Argument angegeben ist
set /P PASSWD=Bitte geben Sie das Administratorkennwort ein:
goto exec
:setPw
rem --Als Administratorkennwort festlegen, wenn ein Argument angegeben wird
set PASSWD=%1
goto exec
rem --Ausführung der Stapelverarbeitung
:exec
rem --Starten Sie die Ausführung des Verarbeitungsstapels
call bin\TimeAdjuster.bat %PASSWD%
echo ****Anpassung am Ende der Zeit: %date% %time%
rem --Bleib ohne zu vervollständigen
pause
list.tsv
10.20.30.40 abc123 ABC123 A Zweig B Etage AB # 1
10.20.50.60 def456 DEF456 C Zweig D Boden CD # 2
Main
TimeAdjusterMain.java
package jp.co.sample.timeadjuster;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jp.co.sample.timeadjuster.bean.SettingBean;
import jp.co.sample.timeadjuster.launcher.TimeAdjusterLauncher;
public class TimeAdjusterMain {
private static Logger logger = LoggerFactory.getLogger(TimeAdjusterMain.class);
public static void main(String[] args) {
logger.info("TimeAdjusterMain wurde gestartet");
//Informationen einstellen
SettingBean setting;
try {
// args[0]:Administrator-Passwort
// args[1]: src/absoluter Pfad des dist-Ordners
setting = new SettingBean(args[0], args[1], "list.tsv");
} catch (Exception e) {
logger.error("Einstellungsinformationsfehler", e);
return;
}
//Ausführung verarbeiten
TimeAdjusterLauncher launcher = new TimeAdjusterLauncher(setting);
try {
launcher.execute();
} catch (Exception e) {
logger.error("Verarbeitungsfehler bei der Zeitanpassung", e);
return;
}
}
}
SettingBean.java
package jp.co.sample.timeadjuster.bean;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SettingBean {
public static Logger logger = LoggerFactory.getLogger(SettingBean.class);
/**
*Administrator-Passwort
*/
String passwd;
/**
*Ausführungspfad-Referenzverzeichnis
*/
String basePath;
/**
*tsv Dateiname
*/
String tsvName;
/**
*Serverinformationsliste
*/
ArrayList<ServerBean> serverList = new ArrayList<>();
public SettingBean(String passwd, String basePath, String tsvName) throws IOException {
this.passwd = passwd;
this.basePath = basePath;
logger.debug("this.basePath: "+ this.basePath);
this.tsvName = tsvName;
logger.debug("this.tsvName: "+ this.tsvName);
File targetFile = new File(this.basePath, this.tsvName);
if (!targetFile.isFile()) {
logger.error("Bitte geben Sie einen vorhandenen Dateipfad an.: "+ path);
return;
}
//Lesen Sie die Datei
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(targetFile),"UTF-8"));) {
//TAB-getrennte Datei mit Header. Leerzeichen ausschließen
Iterable<CSVRecord> records = CSVFormat.TDF.withIgnoreEmptyLines().withIgnoreSurroundingSpaces().parse(reader);
for (CSVRecord record : records) {
logger.debug(record.get(0));
//Überprüfen Sie den IP-Adresstyp für die IP-Adresse des Servers.
//Wenn Sie eine Tsv-Datei mit Notepad erstellen, beginnt sie am Anfang?Weil es eintreten wird
Pattern p = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
Matcher m = p.matcher(record.get(0));
if (!m.find()) {
throw new RuntimeException("Die Methode zur Angabe der IP-Adresse ist falsch. IP Adresse:"+ record.get(0));
}
//Holen Sie sich Serverinformationen und fügen Sie sie der Liste hinzu
ServerBean server = new ServerBean(m.group(), record.get(1), record.get(2), record.get(3), record.get(4), record.get(5));
serverList.add(server);
logger.debug("server: "+ server.getIpaddress() + " / "+ server.getSerial_no() + " / "+ server.getDevice_name());
}
} catch (FileNotFoundException e) {
logger.error("Fehler beim Lesen der TSV-Datei", e);
throw e;
} catch (IOException e) {
logger.error("Fehler beim Lesen der TSV-Datei", e);
throw e;
}
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getBasePath() {
return basePath;
}
public void setBasePath(String basePath) {
this.basePath = basePath;
}
public String getTsvName() {
return tsvName;
}
public void setTsvName(String tsvName) {
this.tsvName = tsvName;
}
public ArrayList<ServerBean> getServerList() {
return serverList;
}
public void setServerList(ArrayList<ServerBean> serverList) {
this.serverList = serverList;
}
}
ServerBean.java
package jp.co.sample.timeadjuster.bean;
public class ServerBean {
/**
*IP Adresse
*/
String ipaddress;
/**
*Hostname
*/
String host_name;
/**
*Ordnungsnummer
*/
String serial_no;
/**
*Basisname
*/
String base_name;
/**
*Installationsort
*/
String installation_location;
/**
*Ausrüstungsname
*/
String device_name;
public ServerBean(String ipaddress, String host_name, String serial_no, String base_name,
String installation_location, String device_name) {
super();
this.ipaddress = ipaddress;
this.host_name = host_name;
this.serial_no = serial_no;
this.base_name = base_name;
this.installation_location = installation_location;
this.device_name = device_name;
}
public String getIpaddress() {
return ipaddress;
}
public void setIpaddress(String ipaddress) {
this.ipaddress = ipaddress;
}
public String getHost_name() {
return host_name;
}
public void setHost_name(String host_name) {
this.host_name = host_name;
}
public String getSerial_no() {
return serial_no;
}
public void setSerial_no(String serial_no) {
this.serial_no = serial_no;
}
public String getBase_name() {
return base_name;
}
public void setBase_name(String base_name) {
this.base_name = base_name;
}
public String getInstallation_location() {
return installation_location;
}
public void setInstallation_location(String installation_location) {
this.installation_location = installation_location;
}
public String getDevice_name() {
return device_name;
}
public void setDevice_name(String device_name) {
this.device_name = device_name;
}
}
TimeAdjusterLauncher.java
package jp.co.sample.timeadjuster.launcher;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jp.co.sample.timeadjuster.bean.ServerBean;
import jp.co.sample.timeadjuster.bean.SettingBean;
public class TimeAdjusterLauncher {
public static Logger logger = LoggerFactory.getLogger(TimeAdjusterLauncher.class);
/**
*Informationen einstellen
*/
SettingBean setting;
/**
*Ergebnis der Anzeige des Anmeldebildschirms
*Halten Sie Cookies usw.
*/
Response loginRes;
/**
*Konstrukteur
*
* @Informationen zur Einstellung der Parameter
*/
public TimeAdjusterLauncher(SettingBean setting) {
super();
//Halten Sie die Einstellungen
this.setting = setting;
}
/**
*Zeitanpassungsverarbeitung ausführen
* @throws RuntimeException
* @throws IOException
*/
public void execute() throws RuntimeException, IOException {
//Schleifenverarbeitung für jeden Server
for (ServerBean server : setting.getServerList()) {
logger.info("Startzeiteinstellung****************** ");
logger.info("Zielserver: "+ server.getIpaddress() + " / "+ server.getDevice_name());
//Einloggen
login(server);
//Überprüfen Sie die aktuell eingestellte Zeit
String zone = getTimer(server);
//Neue Zeiteinstellung
adjustTimer(server, zone);
}
}
/**
*Anmeldevorgang
* @throws RuntimeException
* @throws IOException
*/
private void login(ServerBean server) throws RuntimeException, IOException {
//Ausführung des Anmeldevorgangs
String loginUrl = "http://"+ server.getIpaddress() + "/logon.cgi";
try {
loginRes = Jsoup.connect(loginUrl)
.data("Password", setting.getPasswd())
.data("Mode", "Admin")
.data("Lang", "Japanese")
.method(Method.POST)
.execute();
} catch (IOException e) {
logger.error("Fehler beim Anmelden des ersten Bildschirms", e);
throw e;
}
// logger.debug(loginRes.parse().outerHtml());
//HTTP-Statusübereinstimmung
checkStatusCode(loginRes, loginUrl);
if (StringUtils.contains(loginRes.parse().outerHtml(), "/pages/_top2.htm") ) {
//Wenn der Anmeldefehlerbildschirm umgeleitet wird
//Dies bedeutet, dass die Administratoranmeldung fehlgeschlagen ist und mit einem Fehler beendet wurde
throw new RuntimeException("Administratoranmeldung fehlgeschlagen. Die Verarbeitung wird ausgesetzt.");
}
//Nach erfolgreicher Anmeldung umleiten
//Verarbeitung, die nicht wirklich notwendig ist. Ich habe mich nur um Bestätigung bemüht.
String redirectUrl = "http://"+ server.getIpaddress() + "/pages/_devadm.htm";
Response redirectRes;
try {
redirectRes = Jsoup.connect(redirectUrl)
//Setzen Sie den beim Login erhaltenen Cookie
.cookies(loginRes.cookies())
.method(Method.GET)
.execute();
} catch (IOException e) {
logger.error("Fehler beim Umleiten der ersten Bildschirmanmeldung", e);
throw e;
}
// logger.debug(redirectRes.parse().outerHtml());
//HTTP-Statusübereinstimmung
checkStatusCode(redirectRes, redirectUrl);
}
/**
*Ruft die aktuell auf dem Server eingestellte Zeit ab
*
* @param server
* @throws RuntimeException
* @Rückgabezone
* @throws IOException
*/
private String getTimer(ServerBean server) throws RuntimeException, IOException {
//Rufen Sie den Bildschirm zur Einstellung der Serverzeit auf
String timerUrl = "http://"+ server.getIpaddress() + "/pages/ed_time.htm";
Response timerRes;
try {
timerRes = Jsoup.connect(timerUrl)
//Setzen Sie den beim Login erhaltenen Cookie
.cookies(loginRes.cookies())
.method(Method.GET)
.execute();
} catch (IOException e) {
logger.error("Zeiteinstellungsbildschirm-Erfassungsfehler", e);
throw e;
}
//HTTP-Statusübereinstimmung
checkStatusCode(timerRes, timerUrl);
// logger.debug(timerRes.parse().outerHtml());
Document doc = timerRes.parse();
//Ruft die aktuell auf dem Server eingestellte Zeit ab.
String year = doc.getElementsByAttributeValue("name", "DateYYYY").get(0).val();
String month = doc.getElementsByAttributeValue("name", "DateMM").get(0).val();
String day = doc.getElementsByAttributeValue("name", "DateDD").get(0).val();
String hour = doc.getElementsByAttributeValue("name", "TimeHH").get(0).val();
String minutes = doc.getElementsByAttributeValue("name", "TimeMM").get(0).val();
String zone = doc.select("select option[selected]").get(0).val();
logger.info("Aktuelle Serverzeit: "+ year + "/"+ month + "/"+ day + " "+ hour +":"+ minutes + " ("+ zone + ")");
//Nur Zone verwendet den vorhandenen Wert und wird daher zurückgegeben.
return zone;
}
/**
*Stellen Sie die Zeit ein.
*
* @param server
* @param zone
* @throws RuntimeException
* @throws IOException
*/
private void adjustTimer(ServerBean server, String zone) throws RuntimeException, IOException {
//Ruft die aktuelle Uhrzeit der Ausführungsumgebung ab.
LocalDateTime now = LocalDateTime.now();
logger.info("Aktuelle Uhrzeit: "+ now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
//Ruft das Timing für die nächste Zeitanpassung so ab, dass es nach 1 Minute 0 Sekunden entspricht.
LocalDateTime nextLdt =
LocalDateTime.now()
.plusMinutes(1)
.truncatedTo(ChronoUnit.MINUTES);
logger.debug("Zeit zu passen: "+ nextLdt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
//Warten Sie Millisekunden
long localDiffMsec = ChronoUnit.MILLIS.between(now, nextLdt);
logger.debug("Warten Sie Millisekunden, bis die entsprechende Zeit erreicht ist: "+ localDiffMsec);
try {
//Warten Sie auf Millisekunden, warten Sie
Thread.sleep(localDiffMsec);
} catch (InterruptedException e) {
logger.error("Fehler beim Anpassen der Serverzeit in Millisekunden");
}
logger.info("Ausführung der Zeitanpassung");
//Ausführung der Serverzeitanpassungsverarbeitung(POST)
//Aus irgendeinem Grund hat es ohne den Cookie funktioniert, also werfe ich einfach POST
String timerUrl = "http://"+ server.getIpaddress() + "/settime.cgi";
Response timerRes;
try {
timerRes = Jsoup.connect(timerUrl)
.data("DateYYYY", ""+ nextLdt.getYear())
.data("DateMM", ""+ nextLdt.getMonthValue())
.data("DateDD", ""+ nextLdt.getDayOfMonth())
.data("TimeHH", ""+ nextLdt.getHour())
.data("TimeMM", ""+ nextLdt.getMinute())
.data("TimeZone", ""+ zone)
.method(Method.POST)
.execute();
} catch (IOException e) {
logger.error("Fehler beim Posten der Serverzeitanpassung", e);
throw e;
}
// logger.debug(timerRes.parse().outerHtml());
//HTTP-Statusübereinstimmung
checkStatusCode(timerRes, timerUrl);
logger.info("Zeitanpassung abgeschlossen: "+ server.getIpaddress() + " / "+ server.getDevice_name() + " / " + nextLdt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
}
/**
*HTTP-Statusprüfung
*
* @param res
* @param url
* @throws RuntimeException
*/
private void checkStatusCode(Response res, String url) throws RuntimeException {
if (res.statusCode() != 200) {
//Der HTTP-Status ist 200(normal)Wenn nicht, ein Fehler
throw new RuntimeException("Fehler beim URL-Zugriff: url="+ url + " status="+ res.statusCode());
}
}
}
Auch dieses Jahr möchte ich mein Bestes geben. Vielen Dank.
Recommended Posts