diff --git a/README.md b/README.md index 1c86320..1df5bce 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,6 @@ v1.1 ---- v1.2 1、新增服务器资源添加 (新增数据表pp_task_server) -2、新增远程服务器任务执行 +2、新增远程服务器任务执行(密码验证和密钥验证登录) 3、删除邮件通知功能(pp_task删除两个有关字段) diff --git a/controllers/server.go b/controllers/server.go index c61bb6e..f81ddb8 100644 --- a/controllers/server.go +++ b/controllers/server.go @@ -53,6 +53,7 @@ func (this *ServerController) Add() { if this.isPost() { server := new(models.TaskServer) server.ServerName = strings.TrimSpace(this.GetString("server_name")) + server.ServerAccount = strings.TrimSpace(this.GetString("server_account")) server.ServerIp = strings.TrimSpace(this.GetString("server_ip")) server.Port,_= strconv.Atoi(this.GetString("port")) server.Type,_ = strconv.Atoi(this.GetString("type")) @@ -82,6 +83,7 @@ func (this *ServerController) Edit() { if this.isPost() { server.ServerName = strings.TrimSpace(this.GetString("server_name")) + server.ServerAccount = strings.TrimSpace(this.GetString("server_account")) server.ServerIp = strings.TrimSpace(this.GetString("server_ip")) server.Port,_ = strconv.Atoi(this.GetString("port")) server.Type,_ = strconv.Atoi(this.GetString("type")) diff --git a/jobs/job.go b/jobs/job.go index f40f4c4..c855d08 100644 --- a/jobs/job.go +++ b/jobs/job.go @@ -43,13 +43,22 @@ func NewJobFromTask(task *models.Task) (*Job, error) { job.task = task job.Concurrent = task.Concurrent == 1 return job, nil - }else{ - server, _ := models.TaskServerGetById(task.ServerId) - job := RemoteCommandJob(task.Id, task.TaskName, task.Command,server) + } + + server, _ := models.TaskServerGetById(task.ServerId) + if(server.Type==0){ + //密码验证登录服务器 + job := RemoteCommandJobByPassword(task.Id, task.TaskName, task.Command,server) job.task = task job.Concurrent = task.Concurrent == 1 return job, nil } + + job := RemoteCommandJob(task.Id, task.TaskName, task.Command,server) + job.task = task + job.Concurrent = task.Concurrent == 1 + return job, nil + } func NewCommandJob(id int, name string, command string) *Job { @@ -71,7 +80,7 @@ func NewCommandJob(id int, name string, command string) *Job { } return job } -//远程执行任务 +//远程执行任务 密钥验证 func RemoteCommandJob(id int,name string,command string,servers *models.TaskServer) *Job { job := &Job{ id: id, @@ -90,7 +99,7 @@ func RemoteCommandJob(id int,name string,command string,servers *models.TaskServ } addr := fmt.Sprintf("%s:%d", servers.ServerIp, servers.Port) config := &ssh.ClientConfig{ - User: "root", + User: servers.ServerAccount, Auth: []ssh.AuthMethod{ // Use the PublicKeys method for remote authentication. ssh.PublicKeys(signer), @@ -130,6 +139,62 @@ func RemoteCommandJob(id int,name string,command string,servers *models.TaskServ return job } +func RemoteCommandJobByPassword(id int,name string,command string,servers *models.TaskServer) *Job{ + var ( + auth []ssh.AuthMethod + addr string + clientConfig *ssh.ClientConfig + client *ssh.Client + session *ssh.Session + err error + ) + + job := &Job{ + id: id, + name: name, + } + job.runFunc = func(timeout time.Duration) (string, string, error, bool) { + // get auth method + auth = make([]ssh.AuthMethod, 0) + auth = append(auth, ssh.Password(servers.Password)) + + clientConfig = &ssh.ClientConfig{ + User: servers.ServerAccount, + Auth: auth, + HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { + return nil + }, + //Timeout: 1000 * time.Second, + } + + // connet to ssh + addr = fmt.Sprintf("%s:%d", servers.ServerIp, servers.Port) + + if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil { + return "", "", err, false + } + + // create session + if session, err = client.NewSession(); err != nil { + return "", "", err, false + } + + + var b bytes.Buffer + var c bytes.Buffer + session.Stdout = &b + session.Stderr = &c + + //session.Output(command) + if err := session.Run(command); err != nil { + return "","",err,false + } + isTimeout := false + return b.String(), c.String(), err, isTimeout + } + + return job +} func (j *Job) Status() int { diff --git a/models/task_server.go b/models/task_server.go index 2f2ed79..9b69c57 100644 --- a/models/task_server.go +++ b/models/task_server.go @@ -15,6 +15,7 @@ import ( type TaskServer struct { Id int ServerName string + ServerAccount string ServerIp string Port int Password string @@ -39,6 +40,10 @@ func (t *TaskServer) Update(fields ...string) error { return fmt.Errorf("服务器IP不能为空") } + if t.ServerAccount == "" { + return fmt.Errorf("登录账户不能为空") + } + if t.Type == 0 && t.Password == "" { return fmt.Errorf("服务器密码不能为空") } @@ -55,7 +60,22 @@ func (t *TaskServer) Update(fields ...string) error { func TaskServerAdd(obj *TaskServer) (int64, error) { if obj.ServerName == "" { - return 0, fmt.Errorf("服务器名不能为空") + return 0,fmt.Errorf("服务器名不能为空") + } + if obj.ServerIp == "" { + return 0,fmt.Errorf("服务器IP不能为空") + } + + if obj.ServerAccount == "" { + return 0,fmt.Errorf("登录账户不能为空") + } + + if obj.Type == 0 && obj.Password == "" { + return 0,fmt.Errorf("服务器密码不能为空") + } + + if obj.Type == 1 && obj.PrivateKeySrc == "" { + return 0,fmt.Errorf("私钥不能为空") } return orm.NewOrm().Insert(obj) } diff --git a/ppgo_job.sql b/ppgo_job.sql index 3da4dde..5d690f2 100644 --- a/ppgo_job.sql +++ b/ppgo_job.sql @@ -9,7 +9,7 @@ Target Server Version : 50712 File Encoding : utf-8 - Date: 08/17/2017 11:29:01 AM + Date: 08/17/2017 13:03:22 PM */ SET NAMES utf8; @@ -62,13 +62,13 @@ CREATE TABLE `pp_task` ( PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_group_id` (`group_id`) -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of `pp_task` -- ---------------------------- BEGIN; -INSERT INTO `pp_task` VALUES ('1', '1', '0', '2', '测试任务名称', '0', '测试任务说明', '0 0/1 11 * *', '0', 'echo \"hello\\n\" >> /tmp/test_cron1.log', '0', '0', '46', '1498187640', '1497855526'), ('2', '1', '1', '2', '外部服务器', '0', '一分钟一次', '0 */1 * * * *', '0', '/webroot/server/php/bin/php /webroot/www/default/test.php', '0', '0', '83', '1502940180', '1502876155'), ('3', '1', '1', '1', '重要测试任务222', '0', '1分钟执行一次', '0 */1 * * *', '0', '/webroot/server/php/bin/php /webroot/www/default/test2.php', '0', '0', '22', '1502940060', '1502936077'); +INSERT INTO `pp_task` VALUES ('1', '1', '0', '2', '测试任务名称', '0', '测试任务说明', '0 0/1 11 * *', '0', 'echo \"hello\\n\" >> /tmp/test_cron1.log', '0', '0', '47', '1502941758', '1497855526'), ('2', '1', '1', '2', '外部服务器', '0', '一分钟一次', '0 */1 * * * *', '0', '/webroot/server/php/bin/php /webroot/www/default/test.php', '0', '0', '83', '1502940180', '1502876155'), ('3', '1', '1', '1', '重要测试任务222', '0', '2s执行一次', '*/2 * * * *', '0', '/webroot/server/php/bin/php /webroot/www/default/test2.php', '0', '0', '24', '1502941383', '1502936077'), ('9', '1', '4', '2', '密码验证任务', '0', '5秒执行一次', '*/5 * * * *', '0', '/webroot/server/php/bin/php /webroot/www/default/test2.php', '0', '0', '1', '1502946004', '1502945973'); COMMIT; -- ---------------------------- @@ -106,13 +106,13 @@ CREATE TABLE `pp_task_log` ( `create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', PRIMARY KEY (`id`), KEY `idx_task_id` (`task_id`,`create_time`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of `pp_task_log` -- ---------------------------- BEGIN; -INSERT INTO `pp_task_log` VALUES ('1', '7', '等待10秒\nphp执行完毕', '', '0', '20484', '1502940420'), ('2', '7', '等待10秒\nphp执行完毕', '', '0', '20367', '1502940480'); +INSERT INTO `pp_task_log` VALUES ('1', '7', '等待10秒\nphp执行完毕', '', '0', '20484', '1502940420'), ('2', '7', '等待10秒\nphp执行完毕', '', '0', '20367', '1502940480'), ('3', '8', '等待11秒\nphp执行完毕', '', '0', '121487', '1502940420'), ('4', '7', '等待10秒\nphp执行完毕', '', '0', '20317', '1502940540'), ('5', '7', '等待10秒\nphp执行完毕', '', '0', '20629', '1502940600'), ('6', '7', '等待10秒\nphp执行完毕', '', '0', '20387', '1502940660'), ('7', '8', '等待11秒\nphp执行完毕', '', '0', '121626', '1502940600'), ('8', '7', '等待10秒\nphp执行完毕', '', '0', '20486', '1502940720'), ('9', '7', '等待10秒\nphp执行完毕', '', '0', '20416', '1502940780'), ('10', '7', '等待10秒\nphp执行完毕', '', '0', '20378', '1502940840'), ('11', '8', '等待11秒\nphp执行完毕', '', '0', '121432', '1502940780'), ('12', '7', '等待10秒\nphp执行完毕', '', '0', '21313', '1502940900'), ('13', '7', '等待10秒\nphp执行完毕', '', '0', '20420', '1502940960'), ('14', '7', '等待10秒\nphp执行完毕', '', '0', '21271', '1502941020'), ('15', '8', '等待11秒\nphp执行完毕', '', '0', '121418', '1502940960'), ('16', '7', '等待10秒\nphp执行完毕', '', '0', '20355', '1502941080'), ('17', '3', '等待11秒\nphp执行完毕', '', '0', '121437', '1502941260'), ('18', '3', '等待11秒\nphp执行完毕', '', '0', '121343', '1502941383'), ('19', '1', '', '', '0', '56', '1502941758'), ('20', '9', '等待11秒\nphp执行完毕', '', '0', '121481', '1502946004'); COMMIT; -- ---------------------------- @@ -122,6 +122,7 @@ DROP TABLE IF EXISTS `pp_task_server`; CREATE TABLE `pp_task_server` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', `server_name` varchar(64) NOT NULL DEFAULT '0' COMMENT '服务器名称', + `server_account` varchar(32) NOT NULL DEFAULT 'root' COMMENT '账户名称', `server_ip` varchar(20) NOT NULL DEFAULT '0' COMMENT '服务器IP', `port` int(4) unsigned NOT NULL DEFAULT '22' COMMENT '服务器端口', `password` varchar(64) NOT NULL DEFAULT '0' COMMENT '服务器密码', @@ -133,13 +134,13 @@ CREATE TABLE `pp_task_server` ( `update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '状态:0-正常,1-删除', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='服务器列表'; +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='服务器列表'; -- ---------------------------- -- Records of `pp_task_server` -- ---------------------------- BEGIN; -INSERT INTO `pp_task_server` VALUES ('1', '远程服务器-php', '172.16.210.157', '22', '', '/Users/haodaquan/.ssh/pp_rsa', '/Users/haodaquan/.ssh/pp_rsa.pub', '1', '远程服务器示例', '1502862723', '1502939962', '0'); +INSERT INTO `pp_task_server` VALUES ('1', '密钥验证登录服务器', 'root', '172.16.210.157', '22', '', '/Users/haodaquan/.ssh/pp_rsa', '/Users/haodaquan/.ssh/pp_rsa.pub', '1', '远程服务器示例', '1502862723', '1502945893', '0'), ('4', '密码验证服务器', 'root', '172.16.210.157', '22', 'root', '', '', '0', '这是密码验证服务器', '1502945869', '1502945869', '0'); COMMIT; -- ---------------------------- diff --git a/views/server/add.html b/views/server/add.html index a2f6cf0..1f4f6aa 100644 --- a/views/server/add.html +++ b/views/server/add.html @@ -30,6 +30,15 @@ +
+ +
+ +
+
+ +
+
@@ -43,7 +52,7 @@
- +
@@ -70,7 +79,7 @@
- +
@@ -80,7 +89,7 @@
- +
@@ -89,7 +98,7 @@
- +
公钥和私钥地址请在本地服务器生成,命令:ssh-keygen -t rsa -f pp_rsa diff --git a/views/server/edit.html b/views/server/edit.html index 8c5422f..496f32c 100644 --- a/views/server/edit.html +++ b/views/server/edit.html @@ -30,6 +30,16 @@
+
+ +
+ +
+
+ +
+
+
@@ -70,7 +80,7 @@
- +
@@ -80,7 +90,7 @@
- +