walle 6 rokov pred
rodič
commit
560a161947

+ 0 - 7
walle/model/project.py

@@ -109,18 +109,14 @@ class ProjectModel(SurrogatePK, Model):
         """
         id = id if id else self.id
         data = self.query.filter(ProjectModel.status.notin_([self.status_remove])).filter_by(id=id).first()
-        current_app.logger.info(data)
         if not data:
             return []
 
         project_info = data.to_json()
-        current_app.logger.info(project_info)
-        current_app.logger.info(project_info)
 
         ServerModel = model.server.ServerModel
         server_ids = project_info['server_ids']
         project_info['servers_info'] = ServerModel.fetch_by_id(map(int, server_ids.split(',')))
-        current_app.logger.info(project_info)
         return project_info
 
     def add(self, *args, **kwargs):
@@ -155,8 +151,6 @@ class ProjectModel(SurrogatePK, Model):
         return ret
 
     def to_json(self):
-        current_app.logger.info(self.task_audit)
-        current_app.logger.info(self)
         item = {
             'id': self.id,
             'user_id': self.user_id,
@@ -193,7 +187,6 @@ class ProjectModel(SurrogatePK, Model):
         return item
 
     def enable(self):
-        current_app.logger.info(self.id)
         return {
             'enable_update': permission.is_gte_develop_or_uid(self.user_id),
             'enable_delete': permission.enable_uid(self.user_id) or permission.enable_role(DEVELOPER),

+ 18 - 8
walle/service/deployer.py

@@ -153,7 +153,7 @@ class Deployer:
         :return:
         '''
         # TODO
-        # socketio.sleep(0.001)
+        socketio.sleep(0.001)
         self.stage = self.stage_deploy
         self.sequence = 2
 
@@ -217,7 +217,7 @@ class Deployer:
         :return:
         '''
         # TODO
-        # socketio.sleep(0.001)
+        socketio.sleep(0.001)
         self.stage = self.stage_post_deploy
         self.sequence = 3
 
@@ -242,7 +242,7 @@ class Deployer:
         :return:
         '''
         # TODO
-        # socketio.sleep(0.001)
+        socketio.sleep(0.001)
         self.stage = self.stage_prev_release
         self.sequence = 4
 
@@ -258,7 +258,7 @@ class Deployer:
         # 用户自定义命令
         command = self.project_info['prev_release']
         current_app.logger.info(command)
-        with self.local.cd(self.project_info['target_releases']):
+        with waller.cd(self.project_info['target_releases']):
             result = self.local.run(command, wenv=self.config())
 
 
@@ -281,7 +281,7 @@ class Deployer:
         :return:
         '''
         # TODO
-        # socketio.sleep(0.001)
+        socketio.sleep(0.001)
         self.stage = self.stage_release
         self.sequence = 5
 
@@ -305,7 +305,7 @@ class Deployer:
         :return:
         '''
         # TODO
-        # socketio.sleep(0.001)
+        socketio.sleep(0.001)
         with waller.cd(self.project_info['target_releases']):
             command = 'tar zxf %s' % (self.release_version_tar)
             result = waller.run(command, wenv=self.config())
@@ -323,7 +323,7 @@ class Deployer:
         # 用户自定义命令
         command = self.project_info['post_release']
         current_app.logger.info(command)
-        with self.local.cd(self.project_info['target_root']):
+        with waller.cd(self.project_info['target_root']):
             result = self.local.run(command, wenv=self.config())
 
         self.post_release_service(waller)
@@ -334,7 +334,7 @@ class Deployer:
         :param connection:
         :return:
         '''
-
+        current_app.logger.info('172.16.0.231')
         with waller.cd(self.project_info['target_root']):
             command = 'sudo service nginx restart'
             result = waller.run(command, wenv=self.config())
@@ -444,3 +444,13 @@ class Deployer:
 
         self.end(all_servers_success)
         return {'success': self.success, 'errors': self.errors}
+
+    def test(self):
+        server = '172.20.95.43'
+        # server = '172.16.0.231'
+        try:
+            self.connections[server] = Waller(host=server, user='work')
+            self.post_release_service(self.connections[server])
+        except Exception as e:
+            current_app.logger.exception(e)
+            self.errors[server] = e.message

+ 0 - 3
walle/service/rbac/role.py

@@ -52,9 +52,7 @@ class Permission():
         @wraps(func)
         @login_required
         def decorator(*args, **kwargs):
-            current_app.logger.info('============== gte_develop_or_uid.decorator ======')
             if self.is_gte_develop_or_uid(current_user.id):
-                current_app.logger.info('============== gte_develop_or_uid.if ======')
                 return func(*args, **kwargs)
 
             raise WalleError(Code.not_allow)
@@ -103,7 +101,6 @@ class Permission():
         :return:
         '''
         # TODO
-        current_app.logger.info('uid %s current_uid %s %s', uid, current_user.id, current_user.id==uid)
         return current_user.id == uid
 
     # @classmethod

+ 17 - 11
walle/service/waller.py

@@ -35,30 +35,35 @@ class Waller(Connection):
             if sudo:
                 result = super(Waller, self).sudo(command, pty=False, **kwargs)
             else:
-                result = super(Waller, self).run(command, pty=False, **kwargs)
+                result = super(Waller, self).run(command, pty=True, hide='both', warn=True, **kwargs)
+
+            if result.failed:
+                exitcode, stdout, stderr = result.exited, '', result.stdout
+            else:
+                exitcode, stdout, stderr = 0, result.stdout, ''
 
             message = 'task_id=%s, host:%s command:%s status:%s, success:%s, error:%s' % (
-                wenv['task_id'], self.host, command, result.exited, result.stdout.strip(), result.stderr.strip()
+                wenv['task_id'], self.host, command, exitcode, stdout, stderr
             )
-            current_app.logger.error(dir(self))
+            current_app.logger.error(result)
             # TODO
             ws_dict = {
                 'user': self.user,
                 'host': self.host,
                 'cmd': command,
-                'status': result.exited,
+                'status': exitcode,
                 'stage': wenv['stage'],
                 'sequence': wenv['sequence'],
-                'success': result.stdout.strip(),
-                'error': result.stderr.strip(),
+                'success': stdout,
+                'error': stderr,
             }
             if wenv['console']:
                 emit('console', {'event': 'task:console', 'data': ws_dict}, room=wenv['task_id'])
 
             RecordModel().save_record(stage=wenv['stage'], sequence=wenv['sequence'], user_id=wenv['user_id'],
-                                      task_id=wenv['task_id'], status=result.exited, host=self.host, user=self.user,
-                                      command=result.command, success=result.stdout.strip(),
-                                      error=result.stderr.strip())
+                                      task_id=wenv['task_id'], status=exitcode, host=self.host, user=self.user,
+                                      command=result.command, success=stdout,
+                                      error=stderr)
             current_app.logger.info(message)
             return result
 
@@ -67,12 +72,13 @@ class Waller(Connection):
             # return None
             # TODO 貌似可能的异常有很多种,需要分层才能完美解决 something wrong without e.result
             error = e.result if 'result' in e else e.message
+            current_app.logger.info(e)
             RecordModel().save_record(stage=wenv['stage'], sequence=wenv['sequence'], user_id=wenv['user_id'],
                                       task_id=wenv['task_id'], status=1, host=self.host, user=self.user,
                                       command=command, success='', error=error)
             if hasattr(e, 'reason') and hasattr(e, 'result'):
-                message = 'task_id=%s, host:%s command:%s, status=1, reason:%s, result:%s' % (
-                    wenv['task_id'], self.host, command, e.reason, error
+                message = 'task_id=%s, host:%s command:%s, status=1, reason:%s, result:%s exception:%s' % (
+                    wenv['task_id'], self.host, command, e.reason, error, e.message
                 )
             else:
                 message = 'task_id=%s, host:%s command:%s, status=1, message:%s' % (

+ 7 - 0
walle/service/websocket.py

@@ -43,12 +43,19 @@ class WalleSocketIO(Namespace):
         emit('console', {'event': 'task:console', 'data': {}}, room=self.room)
         from walle.service.deployer import Deployer
         self.task_info = TaskModel(id=self.room).item()
+        # wi = Deployer(task_id=self.room, console=True)
+        # ret = wi.test()
         if self.task_info['status'] in [TaskModel.status_pass, TaskModel.status_fail]:
             wi = Deployer(task_id=self.room, console=True)
             ret = wi.walle_deploy()
         else:
             emit('console', {'event': 'task:forbidden', 'data': self.task_info}, room=self.room)
 
+    def on_ping(self, message):
+        current_app.logger.info(message)
+        import time
+        emit('pong', {'event': 'ping:pong', 'data': {'time':  time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))}}, room=self.room)
+
     def on_logs(self, message):
         current_app.logger.info(message)
         self.logs(task=self.room)

+ 9 - 1
walle/templates/socketio.html

@@ -79,7 +79,6 @@
         // 3.发送deploy命令之后, 将会收到console
         socket.on('console', function (data) {
             write(data)
-            console.log(data)
         });
 
         socket.on('close', function (data) {
@@ -96,6 +95,15 @@
             solo.html(solo.html() + '<br>' + msg);
         }
 
+        window.setInterval(function() {
+            start_time = (new Date).getTime();
+            socket.emit('ping', {'start_time': start_time});
+        }, 10000);
+
+        socket.on('pong', function(data) {
+            write(data)
+        });
+
         $(document).keyup(function (event) {
             if (event.keyCode == 13) {
                 $("#send").trigger("click");