drinkits

Tēma: Skripti (1. lapa no 2)

Paštaisīts digitālais fotorāmis

Beidzot pabeidzu veidot paštaisīto fotorāmi. Izejvielas:

  • Raspberry Pi Zero W
  • Pirms 4 gadiem no portatīvā datora  izravēts 14” LCD ekrāns
  • Pirms 4 gadiem no AliExpress sūtīts LCD Controller Board
  • LCD strāvas barošanas bloks
  • Strāvas Step Down modulis, lai atdalītu un nobarotu Raspberry ar strāvu, kas domāta LCD
  • Aukstas gaismas LED virtene
  • Slēdzis LCD un LED virtenes izslēgšanai
  • IKEA fotorāmis
  • Montāžas līme un stiprinājumi

Rāmja aizmugurē neiespringu uz skaistu izkārtojumu un tīrību, jo, pieliekot pie sienas, tas nav redzams.

Uz Raspberry Pi uzstādīts Raspbian Lite OS un iestatīts kioska režīms – pie katras piestartēšanas tiek atvērts Chromium pārlūks ar iepriekš iestatītu mājaslapu. Lokālajā tīklā uz citas iekārtas darbojas Openmediavault, kas papildus pamatdarbam hostē arī mājaslapu fotorāmim.

Mājaslapa ir vienkāršs uz Uikit front-end framework veidots bilžu slaidšovs.  Papildus tiek ielādēts: Google kalendārs izmantojot FullCalendar, informācija par laika apstākļiem no OpenWeatherMap un foto uzņemšanas datums ar PHP exif_read_data funkciju. Visa tekstuālā papildus informācija tiek pārlādēta reizi stundā ar Javascript setInterval. Pats Raspberry ar Crontab tiek pārstartēts katru nakti, lai izvairītos no atmiņas problēmām Chromium cache dēļ.

Tā kā mājaslapa stāv uz lokālā NAS, tad bilžu papildināšana ir tik vienkārša, kā Adobe Lightroom programmā uzspiest pogu Export to Fotorāmis.

Pašlaik mazjaudīgais Zero bez problēmām sagremo slaidšovu ar ~300 fotoattēliem.

Update Jira issues from MS Excel spreadsheet using Powershell script (updated: 13.05.2019.)

I have created Powershell script which allows to set values in Jira issues using data from MS Excel spreadsheet.

Script is based on following Powershell modules:

Usage:

  1. Set Jira server address in “update_issues.ps1” file.
  2. Update data in “data_for_issues.xlsx”
  3. Set custom field configuration according to your needs in “update_issues.ps1”
  4. Launch “update_issues.bat”, enter your Jira credentials and wait for script to complete.
  5. Log file is created next to “update_issues.ps1” file.

Download (updated: 13.05.2019.): update_issues_PS_script_V2.zip

update_issues.ps1 (updated: 13.05.2019.):

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
Start-Transcript -path .\script\update_issues.log -append

Import-Module .\script\JiraPS
Import-Module .\script\PSExcel

####### Define some variables below ########

#Excel data file
$path = ".\data_for_issues.xlsx"

#Jira adresss
Set-JiraConfigServer -Server "https://jira-server.com"

############################################

$issues = new-object System.Collections.ArrayList

foreach ($field in (Import-XLSX -Path $path -RowStart 1))
 
{
    $issues.add($field) | out-null
}

$issuesfull = @()

foreach ($issue in $issues | Where { $_.key -and $_.key.Trim() })
{
    $i++
    $issuesfull += ($issue.key)
}

Write-Host "Pieteikumi: " $issuesfull  -ForegroundColor yellow
Write-Host "Dati tiks rakstīti" $i "pieteikumos. Tiklīdz ievadīsies lietotāja datus, tā sāksies datu rakstīšana." -ForegroundColor green
Write-Host "--------------------------------------" -ForegroundColor green

$cred = Get-Credential

foreach ($issue in $issues | Where { $_.key -and $_.key.Trim() })
{
    write-host "`n"
    $a++
    Write-Host "Izpildes statuss: " $a "/" $i -ForegroundColor gray
    Write-Host "Raksta datus pieteikumā: " $issue.key -ForegroundColor green
    Write-Host "Investīciju gads: " $issue.ig
    Write-Host "Projekta uzsākšanas gads: " $issue.pug
    Write-Host "Ranga datums: " $issue.rd.ToString('yyyy-MM-dd')
    Write-Host "Ranga vieta: " $issue.vr

## Custom field configuration

    $fields = @{
        customfield_11758 = @{
            value = [string]$issue.ig
        }
        customfield_12031 = @{
            value = [string]$issue.pug
        }
        customfield_24240 = $issue.rd.ToString('yyyy-MM-dd')
        customfield_24241 = [int]$issue.vr
    }

    Try
    {
        Set-JiraIssue -Issue $issue.key -Fields $fields -Credential $cred
        Write-Host "Dati ierakstīti pieteikumā: " $issue.key -ForegroundColor green
    }
    Catch
    {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        Write-Host "Error: $ErrorMessage" -ForegroundColor red
    }
    
}

Write-Host -NoNewLine "Datu rakstīšana pieteikumos beigusies. Nospiediet jebkuru taustiņu, lai izietu..." -ForegroundColor yellow
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');
Stop-Transcript

How to disable the PDF Preview feature in JIRA 7

  • Copy locally and extract Jira bundled plugin jira-fileviewer-plugin-7.2.1.jar located at ./atlassian-jira/WEB-INF/atlassian-bundled-plugins
  • In extracted folder open file-service.js and delete (or wrap in comment) following lines:
if (!featureManager.isFeatureEnabled("jira.fileviewer.disable.pdf")) {
    selectors.document.push("a[file-preview-type=document]");
}
addDocumentSelector: function addDocumentSelector(sel) {
    pushSingleOrArray(selectors.document, sel);
}
  • Remove same lines from minified file-service-min.js.  You can use JS prettify and minify tools to do this.
  • Save files. Put folder content in ZIP. Rename file to jira-fileviewer-plugin-7.2.1.jar, copy to server and restart Jira.

Script to restart JIRA automatically

I have modified Atlassian script to support following features:

  • Cleanup for leftover files – .jira-home.lock, catalina.pid
  • catalina.out log backup
  • Check for running process and force kill JIRA if it won’t stop on time
#!/bin/sh -e
# JIRA startup script
# Description: For JIRA 7.2.7

# Define some variables
# Name of app ( JIRA, Confluence, etc )
APP=jira
# Name of the user to run as
USER=root
# Location of application's bin directory
BASE=/u01/jira/Prod_7.2.7
export JIRAHOME=$BASE
# Location of application's home directory
JHOME=/u01/jira/Prod_7.2.7_home
export JIRA_HOME=$JHOME
# Location of Java JDK
export JAVA_HOME=/usr/java/default

case "$1" in
  # Start command
  start)
    echo "Starting $APP"
    lockfile="$JHOME/.jira-home.lock"
    [ -e $lockfile ] && rm $lockfile

    pidfile="$BASE/work/catalina.pid"
    [ -e $pidfile ] && rm $pidfile

    logfile="$BASE/logs/catalina.out"
    [ -e $logfile ] && mv $BASE/logs/catalina.out "$BASE/logs/catalina-`date +%F`.out"

    /bin/su -m $USER -c "cd $BASE/bin && $BASE/bin/start-jira.sh &> /dev/null"
    ;;
  # Stop command
  stop)

    blah=""
    temp=`ps aux|grep java|grep jira|grep -v grep|awk '{print $2}'`
    pidfile="$BASE/work/catalina.pid"

    if [ "$temp" == "$blah" ]
    then
       echo 'JIRA is not running'
       exit 0
    fi

    echo 'Shutting down JIRA'
    /bin/su -m $USER -c "$BASE/bin/stop-jira.sh &> /dev/null"

    echo 'Sleeping 30 seconds, because sleeping is good...'
    sleep 30 

    temp=`ps aux|grep java|grep jira|grep -v grep|awk '{print $2}'`

    echo 'Now checking if JIRA is still running...'

    if [ "$temp" != "$blah" ]
    then
       echo 'Force killing JIRA now...'
       /bin/su -m $USER -c "$BASE/bin/catalina.sh stop -force $num >/dev/null 2>&1"
       echo 'Killed'
       exit 0
    else
       echo 'JIRA is already down'
       exit 0
    fi

    echo "...done"
    exit 0
    ;;
   # Restart command
   restart)
        $0 stop
        sleep 60
        $0 start
        ;;
  *)
    echo "Usage: jira {start|restart|stop}"
    exit 1
    ;;
esac

exit 0

Show Custom Field for specific groups, roles in JIRA

scriptI have written a Javascript code which allows to hide Custom Field from all users except groups/roles defined in script.

Be aware that this is just a visual way to hide field. It will be possible to see field in HTML source of page.

Installation: paste it in Announcement Banner and set variables based on your environment.

<script type="text/javascript">
  /*	Karlis Rozenbergs, 04.2016

    Script allows to hide custom field for all users except groups/roles defined below. 
    By default project admin and users mentioned in following field are allowed to see hidden field: customfield_10865 (Confirmed by)
  */

  //Sets field to hide
  var hidefield = "#customfield_12345-val";

  //Sets groups which ar allowed to see defined customfield
  var allowedgroups = ['jira-administrators'];

  //Sets projects where to hide customfield. If empty, all projects are selected.
  //example: var projects = ['TEST', 'TEST1'];
  var projects = ['TEST1', 'TEST2', 'TEST3'];

  //Sets issue type where to hide customfield. If empty, all issue types are selected.
  //example: var issuetype = ['19', '3'];
  var issuetype = ['1', '2', '3'];

  //Sets roles which ar allowed to see defined customfield
  var allowedroles = ['Developers', 'Users'];


  //Gets current project key
  issueKey = AJS.$("meta[name='ajs-issue-key']").attr("content")

  var project = getProjectKey(issueKey);

  var flag = 0;
  var flag1 = 0;

  //Check if issue is in defined project
  for (l = 0; l < projects.length; l++){
    if (project == projects[l]) { flag = 1; }
  }

  if (flag == 1) {
    
    var issuety = getIssueType(issueKey);
  
    //Check if issue is in defined issue type
    for (k = 0; k < issuetype.length; k++){
      if (issuety == issuetype[k]) { flag1 = 1; }
    }
    
    if (flag1 == 1) {

      var user = getCurrentUserName();
      var aggrName = getIssueAggr(issueKey);
      var aggrName1 = getIssueAggr1(issueKey);
      var flag2 = 0;
      var flag3 = 0;

      //Gets urls of allowed roles
      var ProjRoles = [];
      for (k = 0; k < allowedroles.length; k++){
        ProjRoles.push(getProjectRoles(project, allowedroles[k]));
      }

      //Gets allowed users
      var ProjectRoleUser = [];
      for (l = 0; l < ProjRoles.length; l++){
        ProjectRoleUser.push.apply(ProjectRoleUser,getProjectRoleUser(ProjRoles[l]));
      }

      var allowedobjects= [];
      allowedobjects.push.apply(allowedobjects, ProjectRoleUser);
      allowedobjects.push.apply(allowedobjects, aggrName);
      allowedobjects.push.apply(allowedobjects, aggrName1);

      //Checks if current user is in array
      for (i = 0; i < allowedobjects.length; i++){
        if (user == allowedobjects[i]) { flag2 = 1; }
      }

      //Checks if current user is in defined groups
      for (j = 0; j < allowedgroups.length; j++){
        if (isUserInGroup(user, allowedgroups[j])){ flag3 = 1; }
      }


      //Checks if all projects and issue types are allowed
      if (projects.length == 0) { flag = 1;}

      //Checks if all projects and issue types are allowed
      if (issuetype.length == 0) { flag1 = 1;}

      //Hides defined field
      if (flag2 == 0 && flag3 == 0 && flag == 1 && flag1 == 1) {
        (function($) {
            AJS.toInit(function(){
            AJS.$(hidefield).parent().hide();
            AJS.$(hidefield).parent().value = "";
            });

            JIRA.bind(JIRA.Events.NEW_CONTENT_ADDED, function (e, context) {
            AJS.$(hidefield).parent().hide();
            AJS.$(hidefield).parent().value = "";
            });
            })(AJS.$);
      }
    }
  }
    
  function getCurrentUserName()
  {
    var user;
     AJS.$.ajax({
      url: "/rest/gadget/1.0/currentUser",
      type: 'get',
      dataType: 'json',
      async: false,
      success: function(data) {
        user = data.username;
      } 
     });
     return user;
  }

  function getGroups(user)
  {
    var groups;
     AJS.$.ajax({
      url: "/rest/api/2/user?username="+user+"&expand=groups",
      type: 'get',
      dataType: 'json',
      async: false,
      success: function(data) {
        groups = data.groups.items;
      } 
     });
     return groups;
  }

  function isUserInGroup(user, group){
    var groups = getGroups(user);
    for (i = 0; i < groups.length; i++){
      if (groups[i].name == group){
        return true;
      }
    }
    return false;
  }

  function getProjectKey(issueKey)
  {
    var projKey;
     AJS.$.ajax({
      url: "/rest/api/2/issue/"+issueKey,
      type: 'get',
      dataType: 'json',
      async: false,
      success: function(data) {
        projKey = data.fields.project.key;
      } 
     });
     return projKey;
  }


  function getIssueAggr(issueKey)
  {
    var aggrName = [];
     AJS.$.ajax({
      url: "/rest/api/2/issue/"+issueKey,
      type: 'get',
      dataType: 'json',
      async: false,
      success: function(data) {
        if (data.fields.customfield_10865) {
          for (var i=0; i < data.fields.customfield_10865.length; i++){
            aggrName.push(data.fields.customfield_10865[i].name);
          }
        }
      } 
     });
     return aggrName;
  }

  function getIssueAggr1(issueKey)
  {
    var aggrName1 = [];
     AJS.$.ajax({
      url: "/rest/api/2/issue/"+issueKey,
      type: 'get',
      dataType: 'json',
      async: false,
      success: function(data) {
        if (data.fields.customfield_10864) {
          for (var i=0; i < data.fields.customfield_10864.length; i++){
            aggrName1.push(data.fields.customfield_10864[i].name);
          }
        }
      } 
     });
     return aggrName1;
  }

  function getIssueType(issueKey)
  {
    var issuety;
     AJS.$.ajax({
      url: "/rest/api/2/issue/"+issueKey,
      type: 'get',
      dataType: 'json',
      async: false,
      success: function(data) {
        issuety = data.fields.issuetype.id;
        
      }
     });
     return issuety;
  }

  function getProjectRoles(project, role)
  {
    var ProjRoles;
     AJS.$.ajax({
      url: "/rest/api/2/project/"+project,
      type: 'get',
      dataType: 'json',
      async: false,
      success: function(data) {
        ProjRoles = data.roles[role];
      } 
     });
     return ProjRoles;
  }

  function getProjectRoleUser(RoleUrl)
  {
    var ProjRolesUser = [];
     AJS.$.ajax({
      url: RoleUrl,
      type: 'get',
      dataType: 'json',
      async: false,
      success: function(data) {
        if (data.actors) {
          for (var i=0; i < data.actors.length; i++){
            ProjRolesUser.push(data.actors[i].name);
          }
        }
      } 
     });
     return ProjRolesUser;
  }

</script>
Olderposts

Copyright © 2019 drinkits

Izstrādājis Anders NorénUz augšu ↑